diff --git a/OVMS.V3/components/ovms_cellular/src/ovms_cellular.cpp b/OVMS.V3/components/ovms_cellular/src/ovms_cellular.cpp index 2640909..cf93939 100644 --- a/OVMS.V3/components/ovms_cellular/src/ovms_cellular.cpp +++ b/OVMS.V3/components/ovms_cellular/src/ovms_cellular.cpp @@ -79,12 +79,16 @@ const char* ModemNetRegName(modem::network_registration_t netreg) { switch (netreg) { - case modem::NotRegistered: return "NotRegistered"; - case modem::Searching: return "Searching"; - case modem::DeniedRegistration: return "DeniedRegistration"; - case modem::RegisteredHome: return "RegisteredHome"; - case modem::RegisteredRoaming: return "RegisteredRoaming"; - default: return "Unknown"; + case modem::NotRegistered: return "NotRegistered"; + case modem::DeniedRegistration: return "DeniedRegistration"; + case modem::Searching: return "Searching"; + case modem::Registered: return "Registered"; + case modem::RegisteredEmergencyServices: return "RegisteredEmergencyServices"; + 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_buffer.clear(); m_netreg = Unknown; + for (size_t k=0; kAsString().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)); @@ -852,7 +860,7 @@ modem::modem_state1_t modem::State1Ticker1() if ((!MyConfig.GetParamValueBool("modem", "enable.net", true))||(p.empty())) 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 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"); } @@ -907,7 +915,7 @@ modem::modem_state1_t modem::State1Ticker1() // Need to shutdown ppp, and get back to NetSleep mode return NetSleep; } - if ((m_netreg!=RegisteredHome)&&(m_netreg!=RegisteredRoaming)) + if (m_netreg < Registered) { // We've lost the network connection 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()); 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; + 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(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) { @@ -1492,14 +1531,25 @@ bool modem::IsStarted() 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; - const char *v = ModemNetRegName(m_netreg); - ESP_LOGI(TAG, "Network Registration status: %s", v); - StdMetrics.ms_m_net_mdm_netreg->SetValue(v); + m_netreg_d[regtype] = netreg; + + // Need to re-calculate m_netreg as best of these + network_registration_t highest = Unknown; + for (size_t k=0; kSetValue(v); + } } } @@ -1539,6 +1589,7 @@ void modem::SetSignalQuality(int newsq) void modem::ClearNetMetrics() { m_netreg = Unknown; + for (size_t k=0; kClear(); m_provider = ""; diff --git a/OVMS.V3/components/ovms_cellular/src/ovms_cellular.h b/OVMS.V3/components/ovms_cellular/src/ovms_cellular.h index a48677e..d220856 100644 --- a/OVMS.V3/components/ovms_cellular/src/ovms_cellular.h +++ b/OVMS.V3/components/ovms_cellular/src/ovms_cellular.h @@ -47,6 +47,8 @@ using namespace std; +#define CELLULAR_NETREG_COUNT 3 + class modemdriver; // Forward declaration class modem : public pcp, public InternalRamAllocated @@ -93,13 +95,23 @@ class modem : public pcp, public InternalRamAllocated } event_type_t; typedef enum { - NotRegistered = 0, - Searching = 2, - DeniedRegistration = 3, - RegisteredHome = 1, - RegisteredRoaming = 5, - Unknown = 99 + Unknown = 0, + NotRegistered = 1, + DeniedRegistration = 2, + Searching = 3, + Registered = 4, + RegisteredEmergencyServices = 5, + RegisteredRoamingSMS = 6, + RegisteredRoaming = 7, + RegisteredHomeSMS = 8, + RegisteredHome = 9 } network_registration_t; + typedef enum + { + NRT_GSM = 0, + NRT_GPRS = 1, + NRT_EPS = 2 + } network_regtype_t; typedef struct { event_type_t type; @@ -126,6 +138,7 @@ class modem : public pcp, public InternalRamAllocated std::string m_line_buffer; network_registration_t m_netreg; + network_registration_t m_netreg_d[CELLULAR_NETREG_COUNT]; std::string m_provider; int m_sq; bool m_pincode_required; @@ -201,7 +214,7 @@ class modem : public pcp, public InternalRamAllocated void IncomingMuxData(GsmMuxChannel* channel); void SendSetState1(modem_state1_t newstate); bool IsStarted(); - void SetNetworkRegistration(network_registration_t netreg); + void SetNetworkRegistration(network_regtype_t regtype, network_registration_t netreg); void SetProvider(std::string provider); void SetSignalQuality(int newsq); void ClearNetMetrics(); diff --git a/OVMS.V3/components/simcom/src/simcom_7600.cpp b/OVMS.V3/components/simcom/src/simcom_7600.cpp index 70b7b54..8f9fb0d 100644 --- a/OVMS.V3/components/simcom/src/simcom_7600.cpp +++ b/OVMS.V3/components/simcom/src/simcom_7600.cpp @@ -91,7 +91,7 @@ void simcom7600::StartupNMEA() void simcom7600::StatusPoller() { 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() @@ -144,7 +144,7 @@ modem::modem_state1_t simcom7600::State1Ticker1(modem::modem_state1_t curstate) switch (m_modem->m_state1_ticker) { 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; case 12: m_modem->tx("AT+CGMR;+ICCID\r\n");