Original project changes: Support multiple network registration types, including GSM, GPRS, and…
… EPS (E-UTRAN)
This commit is contained in:
parent
7ea81e8fa4
commit
1fa378c5f9
|
@ -79,12 +79,16 @@ const char* ModemNetRegName(modem::network_registration_t netreg)
|
||||||
{
|
{
|
||||||
switch (netreg)
|
switch (netreg)
|
||||||
{
|
{
|
||||||
case modem::NotRegistered: return "NotRegistered";
|
case modem::NotRegistered: return "NotRegistered";
|
||||||
case modem::Searching: return "Searching";
|
case modem::DeniedRegistration: return "DeniedRegistration";
|
||||||
case modem::DeniedRegistration: return "DeniedRegistration";
|
case modem::Searching: return "Searching";
|
||||||
case modem::RegisteredHome: return "RegisteredHome";
|
case modem::Registered: return "Registered";
|
||||||
case modem::RegisteredRoaming: return "RegisteredRoaming";
|
case modem::RegisteredEmergencyServices: return "RegisteredEmergencyServices";
|
||||||
default: return "Unknown";
|
case modem::RegisteredRoamingSMS: return "RegisteredRoamingSMS";
|
||||||
|
case modem::RegisteredRoaming: return "RegisteredRoaming";
|
||||||
|
case modem::RegisteredHomeSMS: return "RegisteredHomeSMS";
|
||||||
|
case modem::RegisteredHome: return "RegisteredHome";
|
||||||
|
default: return "Unknown";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,6 +276,7 @@ modem::modem(const char* name, uart_port_t uartnum, int baud, int rxpin, int txp
|
||||||
m_line_unfinished = -1;
|
m_line_unfinished = -1;
|
||||||
m_line_buffer.clear();
|
m_line_buffer.clear();
|
||||||
m_netreg = Unknown;
|
m_netreg = Unknown;
|
||||||
|
for (size_t k=0; k<CELLULAR_NETREG_COUNT; k++) { m_netreg_d[k] = Unknown; }
|
||||||
m_provider = "";
|
m_provider = "";
|
||||||
m_sq = 99; // Unknown
|
m_sq = 99; // Unknown
|
||||||
m_powermode = Off;
|
m_powermode = Off;
|
||||||
|
@ -404,6 +409,9 @@ void modem::SupportSummary(OvmsWriter* writer, bool debug /*=FALSE*/)
|
||||||
m_provider.c_str(),
|
m_provider.c_str(),
|
||||||
UnitConvert(sq, dbm, m_sq),
|
UnitConvert(sq, dbm, m_sq),
|
||||||
StandardMetrics.ms_m_net_mdm_mode->AsString().c_str());
|
StandardMetrics.ms_m_net_mdm_mode->AsString().c_str());
|
||||||
|
// writer->printf(" GSM Registration: %s\n",ModemNetRegName(m_netreg_d[NRT_GSM]));
|
||||||
|
// writer->printf(" GPRS Registration: %s\n",ModemNetRegName(m_netreg_d[NRT_GPRS]));
|
||||||
|
// writer->printf(" EPS Registration: %s\n",ModemNetRegName(m_netreg_d[NRT_EPS]));
|
||||||
}
|
}
|
||||||
|
|
||||||
writer->printf(" State: %s\n", ModemState1Name(m_state1));
|
writer->printf(" State: %s\n", ModemState1Name(m_state1));
|
||||||
|
@ -852,7 +860,7 @@ modem::modem_state1_t modem::State1Ticker1()
|
||||||
if ((!MyConfig.GetParamValueBool("modem", "enable.net", true))||(p.empty()))
|
if ((!MyConfig.GetParamValueBool("modem", "enable.net", true))||(p.empty()))
|
||||||
return NetHold; // Just hold, without starting PPP
|
return NetHold; // Just hold, without starting PPP
|
||||||
}
|
}
|
||||||
else if ((m_state1_ticker > 3)&&((m_netreg==RegisteredHome)||(m_netreg==RegisteredRoaming)))
|
else if ((m_state1_ticker > 3)&&((m_netreg >= Registered)))
|
||||||
return NetStart; // We have GSM, so start the network
|
return NetStart; // We have GSM, so start the network
|
||||||
if ((m_mux != NULL)&&(m_state1_ticker>3)&&((m_state1_ticker % 10) == 0))
|
if ((m_mux != NULL)&&(m_state1_ticker>3)&&((m_state1_ticker % 10) == 0))
|
||||||
{ muxtx(m_mux_channel_POLL, "AT+CREG?;+CCLK?;+CSQ;+COPS?\r\n"); }
|
{ muxtx(m_mux_channel_POLL, "AT+CREG?;+CCLK?;+CSQ;+COPS?\r\n"); }
|
||||||
|
@ -907,7 +915,7 @@ modem::modem_state1_t modem::State1Ticker1()
|
||||||
// Need to shutdown ppp, and get back to NetSleep mode
|
// Need to shutdown ppp, and get back to NetSleep mode
|
||||||
return NetSleep;
|
return NetSleep;
|
||||||
}
|
}
|
||||||
if ((m_netreg!=RegisteredHome)&&(m_netreg!=RegisteredRoaming))
|
if (m_netreg < Registered)
|
||||||
{
|
{
|
||||||
// We've lost the network connection
|
// We've lost the network connection
|
||||||
ESP_LOGW(TAG, "Lost network connection (NetworkRegistration in NetMode)");
|
ESP_LOGW(TAG, "Lost network connection (NetworkRegistration in NetMode)");
|
||||||
|
@ -1055,26 +1063,57 @@ void modem::StandardLineHandler(int channel, OvmsBuffer* buf, std::string line)
|
||||||
creg = atoi(line.substr(7,1).c_str());
|
creg = atoi(line.substr(7,1).c_str());
|
||||||
switch (creg)
|
switch (creg)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0: case 4: nreg = NotRegistered; break;
|
||||||
case 4:
|
case 1: nreg = RegisteredHome; break;
|
||||||
nreg = NotRegistered;
|
case 2: nreg = Searching; break;
|
||||||
break;
|
case 3: nreg = DeniedRegistration; break;
|
||||||
case 1:
|
case 5: nreg = RegisteredRoaming; break;
|
||||||
nreg = RegisteredHome;
|
default: break;
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
nreg = Searching;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
nreg = DeniedRegistration;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
nreg = RegisteredRoaming;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
SetNetworkRegistration(nreg);
|
SetNetworkRegistration(NRT_GSM, nreg);
|
||||||
|
}
|
||||||
|
else if (line.compare(0, 8, "+CGREG: ") == 0)
|
||||||
|
{
|
||||||
|
size_t qp = line.find(',');
|
||||||
|
int creg;
|
||||||
|
network_registration_t nreg = Unknown;
|
||||||
|
if (qp != string::npos)
|
||||||
|
creg = atoi(line.substr(qp+1,1).c_str());
|
||||||
|
else
|
||||||
|
creg = atoi(line.substr(7,1).c_str());
|
||||||
|
switch (creg)
|
||||||
|
{
|
||||||
|
case 0: case 4: nreg = NotRegistered; break;
|
||||||
|
case 1: nreg = RegisteredHome; break;
|
||||||
|
case 2: nreg = Searching; break;
|
||||||
|
case 3: nreg = DeniedRegistration; break;
|
||||||
|
case 5: nreg = RegisteredRoaming; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
SetNetworkRegistration(NRT_GPRS, nreg);
|
||||||
|
}
|
||||||
|
else if (line.compare(0, 8, "+CEREG: ") == 0)
|
||||||
|
{
|
||||||
|
size_t qp = line.find(',');
|
||||||
|
int creg;
|
||||||
|
network_registration_t nreg = Unknown;
|
||||||
|
if (qp != string::npos)
|
||||||
|
creg = atoi(line.substr(qp+1,1).c_str());
|
||||||
|
else
|
||||||
|
creg = atoi(line.substr(7,1).c_str());
|
||||||
|
switch (creg)
|
||||||
|
{
|
||||||
|
case 0: case 4: nreg = NotRegistered; break;
|
||||||
|
case 1: nreg = RegisteredHome; break;
|
||||||
|
case 2: nreg = Searching; break;
|
||||||
|
case 3: nreg = DeniedRegistration; break;
|
||||||
|
case 5: nreg = RegisteredRoaming; break;
|
||||||
|
case 6: nreg = RegisteredHomeSMS; break;
|
||||||
|
case 7: nreg = RegisteredRoamingSMS; break;
|
||||||
|
case 8: nreg = RegisteredEmergencyServices; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
SetNetworkRegistration(NRT_EPS, nreg);
|
||||||
}
|
}
|
||||||
else if (line.compare(0, 7, "+CPSI: ") == 0)
|
else if (line.compare(0, 7, "+CPSI: ") == 0)
|
||||||
{
|
{
|
||||||
|
@ -1492,14 +1531,25 @@ bool modem::IsStarted()
|
||||||
return (m_task != NULL);
|
return (m_task != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void modem::SetNetworkRegistration(network_registration_t netreg)
|
void modem::SetNetworkRegistration(network_regtype_t regtype, network_registration_t netreg)
|
||||||
{
|
{
|
||||||
if (netreg != m_netreg)
|
if (netreg != m_netreg_d[regtype])
|
||||||
{
|
{
|
||||||
m_netreg = netreg;
|
m_netreg_d[regtype] = netreg;
|
||||||
const char *v = ModemNetRegName(m_netreg);
|
|
||||||
ESP_LOGI(TAG, "Network Registration status: %s", v);
|
// Need to re-calculate m_netreg as best of these
|
||||||
StdMetrics.ms_m_net_mdm_netreg->SetValue(v);
|
network_registration_t highest = Unknown;
|
||||||
|
for (size_t k=0; k<CELLULAR_NETREG_COUNT; k++)
|
||||||
|
{
|
||||||
|
if (highest < m_netreg_d[k]) highest = m_netreg_d[k];
|
||||||
|
}
|
||||||
|
if (highest != m_netreg)
|
||||||
|
{
|
||||||
|
m_netreg = highest;
|
||||||
|
const char *v = ModemNetRegName(m_netreg);
|
||||||
|
ESP_LOGI(TAG, "Network Registration status: %s", v);
|
||||||
|
StdMetrics.ms_m_net_mdm_netreg->SetValue(v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1539,6 +1589,7 @@ void modem::SetSignalQuality(int newsq)
|
||||||
void modem::ClearNetMetrics()
|
void modem::ClearNetMetrics()
|
||||||
{
|
{
|
||||||
m_netreg = Unknown;
|
m_netreg = Unknown;
|
||||||
|
for (size_t k=0; k<CELLULAR_NETREG_COUNT; k++) { m_netreg_d[k] = Unknown; }
|
||||||
StdMetrics.ms_m_net_mdm_netreg->Clear();
|
StdMetrics.ms_m_net_mdm_netreg->Clear();
|
||||||
|
|
||||||
m_provider = "";
|
m_provider = "";
|
||||||
|
|
|
@ -47,6 +47,8 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
#define CELLULAR_NETREG_COUNT 3
|
||||||
|
|
||||||
class modemdriver; // Forward declaration
|
class modemdriver; // Forward declaration
|
||||||
|
|
||||||
class modem : public pcp, public InternalRamAllocated
|
class modem : public pcp, public InternalRamAllocated
|
||||||
|
@ -93,13 +95,23 @@ class modem : public pcp, public InternalRamAllocated
|
||||||
} event_type_t;
|
} event_type_t;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
NotRegistered = 0,
|
Unknown = 0,
|
||||||
Searching = 2,
|
NotRegistered = 1,
|
||||||
DeniedRegistration = 3,
|
DeniedRegistration = 2,
|
||||||
RegisteredHome = 1,
|
Searching = 3,
|
||||||
RegisteredRoaming = 5,
|
Registered = 4,
|
||||||
Unknown = 99
|
RegisteredEmergencyServices = 5,
|
||||||
|
RegisteredRoamingSMS = 6,
|
||||||
|
RegisteredRoaming = 7,
|
||||||
|
RegisteredHomeSMS = 8,
|
||||||
|
RegisteredHome = 9
|
||||||
} network_registration_t;
|
} network_registration_t;
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
NRT_GSM = 0,
|
||||||
|
NRT_GPRS = 1,
|
||||||
|
NRT_EPS = 2
|
||||||
|
} network_regtype_t;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
event_type_t type;
|
event_type_t type;
|
||||||
|
@ -126,6 +138,7 @@ class modem : public pcp, public InternalRamAllocated
|
||||||
|
|
||||||
std::string m_line_buffer;
|
std::string m_line_buffer;
|
||||||
network_registration_t m_netreg;
|
network_registration_t m_netreg;
|
||||||
|
network_registration_t m_netreg_d[CELLULAR_NETREG_COUNT];
|
||||||
std::string m_provider;
|
std::string m_provider;
|
||||||
int m_sq;
|
int m_sq;
|
||||||
bool m_pincode_required;
|
bool m_pincode_required;
|
||||||
|
@ -201,7 +214,7 @@ class modem : public pcp, public InternalRamAllocated
|
||||||
void IncomingMuxData(GsmMuxChannel* channel);
|
void IncomingMuxData(GsmMuxChannel* channel);
|
||||||
void SendSetState1(modem_state1_t newstate);
|
void SendSetState1(modem_state1_t newstate);
|
||||||
bool IsStarted();
|
bool IsStarted();
|
||||||
void SetNetworkRegistration(network_registration_t netreg);
|
void SetNetworkRegistration(network_regtype_t regtype, network_registration_t netreg);
|
||||||
void SetProvider(std::string provider);
|
void SetProvider(std::string provider);
|
||||||
void SetSignalQuality(int newsq);
|
void SetSignalQuality(int newsq);
|
||||||
void ClearNetMetrics();
|
void ClearNetMetrics();
|
||||||
|
|
|
@ -91,7 +91,7 @@ void simcom7600::StartupNMEA()
|
||||||
void simcom7600::StatusPoller()
|
void simcom7600::StatusPoller()
|
||||||
{
|
{
|
||||||
if (m_modem->m_mux != NULL)
|
if (m_modem->m_mux != NULL)
|
||||||
{ m_modem->muxtx(GetMuxChannelPOLL(), "AT+CREG?;+CCLK?;+CSQ;+CPSI?;+COPS?\r\n"); }
|
{ m_modem->muxtx(GetMuxChannelPOLL(), "AT+CREG?;+CGREG?;+CEREG?;+CCLK?;+CSQ;+CPSI?;+COPS?\r\n"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void simcom7600::PowerCycle()
|
void simcom7600::PowerCycle()
|
||||||
|
@ -144,7 +144,7 @@ modem::modem_state1_t simcom7600::State1Ticker1(modem::modem_state1_t curstate)
|
||||||
switch (m_modem->m_state1_ticker)
|
switch (m_modem->m_state1_ticker)
|
||||||
{
|
{
|
||||||
case 10:
|
case 10:
|
||||||
m_modem->tx("AT+CPIN?;+CREG=1;+CTZU=1;+CTZR=1;+CLIP=1;+CMGF=1;+CNMI=1,2,0,0,0;+CSDH=1;+CMEE=2;+CSQ;+AUTOCSQ=1,1;E0;S0=0\r\n");
|
m_modem->tx("AT+CPIN?;+CREG=1;+CGREG=1;+CEREG=1;+CTZU=1;+CTZR=1;+CLIP=1;+CMGF=1;+CNMI=1,2,0,0,0;+CSDH=1;+CMEE=2;+CSQ;+AUTOCSQ=1,1;E0;S0=0\r\n");
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
m_modem->tx("AT+CGMR;+ICCID\r\n");
|
m_modem->tx("AT+CGMR;+ICCID\r\n");
|
||||||
|
|
Loading…
Reference in a new issue