Original project changes: Support multiple network registration types, including GSM, GPRS, and…

… EPS (E-UTRAN)
This commit is contained in:
Carsten Schmiemann 2022-09-08 11:51:11 +02:00
parent 7ea81e8fa4
commit 1fa378c5f9
3 changed files with 106 additions and 42 deletions

View File

@ -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; k<CELLULAR_NETREG_COUNT; k++) { m_netreg_d[k] = Unknown; }
m_provider = "";
m_sq = 99; // Unknown
m_powermode = Off;
@ -404,6 +409,9 @@ void modem::SupportSummary(OvmsWriter* writer, bool debug /*=FALSE*/)
m_provider.c_str(),
UnitConvert(sq, dbm, m_sq),
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));
@ -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; 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()
{
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();
m_provider = "";

View File

@ -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();

View File

@ -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");