Skip to content

Commit

Permalink
Changes for polling DigiWiFi meta data and attempt at solving DigiWiF…
Browse files Browse the repository at this point in the history
…i connection reliability #21
  • Loading branch information
neilh20.gitk authored and neilh20.gitk committed Dec 9, 2020
1 parent c16b094 commit 93bd595
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 56 deletions.
9 changes: 7 additions & 2 deletions a/tu_xx01/src/tu_xx01.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1108,8 +1108,13 @@ void setup() {
// Attach the modem and information pins to the logger
dataLogger.attachModem(modemPhy);
// modemPhy.setModemLED(modemLEDPin); //Used in UI_status subsystem
#if defined Modem_SignalPercent_UUID || defined DIGI_RSSI_UUID //|| or others
modemPhy.pollModemMetadata(POLL_MODEM_META_DATA_ON);
#if defined Modem_SignalPercent_UUID || defined DIGI_RSSI_UUID || \
defined DIGI_VCC_UID
#define POLL_MODEM_REQ \
(loggerModem::PollModemMetaData_t)( \
loggerModem::POLL_MODEM_META_DATA_RSSI | \
loggerModem::POLL_MODEM_META_DATA_VCC)
modemPhy.pollModemMetadata(POLL_MODEM_REQ);
#endif
#endif // UseModem_Module
dataLogger.setLoggerPins(wakePin, sdCardSSPin, sdCardPwrPin, buttonPin,
Expand Down
8 changes: 5 additions & 3 deletions src/LoggerModem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
#include "LoggerModem.h"

// Initialize the static members
bool loggerModem::_pollModemMetaData = false;
loggerModem::PollModemMetaData_t loggerModem::_pollModemMetaData =
POLL_MODEM_META_DATA_DEF;

int16_t loggerModem::_priorRSSI = SENSOR_DEFAULT_I;
int16_t loggerModem::_priorSignalPercent = SENSOR_DEFAULT_I;
float loggerModem::_priorModemTemp = SENSOR_DEFAULT_F;
Expand Down Expand Up @@ -326,8 +328,8 @@ void loggerModem::setModemPinModes(void) {
}


void loggerModem::pollModemMetadata(uint8_t status) {
if (POLL_MODEM_META_DATA_ON & status) { _pollModemMetaData = true; }
void loggerModem::pollModemMetadata(PollModemMetaData_t status) {
_pollModemMetaData = status;
}
bool loggerModem::updateModemMetadata(void) {
bool success = true;
Expand Down
34 changes: 28 additions & 6 deletions src/LoggerModem.h
Original file line number Diff line number Diff line change
Expand Up @@ -994,18 +994,40 @@ class loggerModem {

/* atl_extension */

public:
/**
* @brief modem management data setup
*
* Set in setup()
*
* @param status type of default polling
*/
#if !defined POLL_MODEM_META_DATA_ON
#define POLL_MODEM_META_DATA_ALL 0xFF
#endif // POLL_MODEM_META_DATA_ON
typedef enum {
POLL_MODEM_META_DATA_RSSI = 0x01,
POLL_MODEM_META_DATA_VCC = 0x02,
POLL_MODEM_META_DATA_TEMP = 0x04,
POLL_MODEM_META_DATA_PARM4 = 0x08,
POLL_MODEM_META_DATA_PARM5 = 0x010,
POLL_MODEM_META_DATA_DEF = POLL_MODEM_META_DATA_ALL,
} PollModemMetaData_t;
// By default modem metadata won't be polled. Call this to enable.
void
pollModemMetadata(PollModemMetaData_t status = POLL_MODEM_META_DATA_DEF);
uint8_t getModemMetadata() {
return _pollModemMetaData;
}

protected:
/**
* @brief poll the modem management data
*
* Set in the init() portion of the #modemSetup().
*/
static bool _pollModemMetaData;
PollModemMetaData_t static _pollModemMetaData;

public:
// By default modem metadata won't be polled. Call this to enable.
#define POLL_MODEM_META_DATA_ON 0x80
void pollModemMetadata(uint8_t status = POLL_MODEM_META_DATA_ON);

#if not defined SENSOR_DEFAULT_I
#define SENSOR_DEFAULT_I -1
Expand All @@ -1018,7 +1040,7 @@ class loggerModem {
#endif // SENSOR_DEFAULT
};

/* atl_extension */
/* atl_extension */

// Acceptable epoch time range from NIST
// before Jan 1, 2020 most likely an error
Expand Down
106 changes: 62 additions & 44 deletions src/modems/DigiXBeeWifi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,60 +418,78 @@ bool DigiXBeeWifi::updateModemMetadata(void) {
bool success = true;

// Unset whatever we had previously
loggerModem::_priorRSSI = SENSOR_DEFAULT_I;
loggerModem::_priorSignalPercent = SENSOR_DEFAULT_I;
// loggerModem::_priorBatteryState = -9999;
// loggerModem::_priorBatteryPercent = -9999;
// loggerModem::_priorBatteryPercent = -9999;
loggerModem::_priorModemTemp = SENSOR_DEFAULT_F;
loggerModem::_priorRSSI = SENSOR_DEFAULT_I;
loggerModem::_priorSignalPercent = SENSOR_DEFAULT_I;
loggerModem::_priorBatteryState = SENSOR_DEFAULT_I;
loggerModem::_priorBatteryPercent = SENSOR_DEFAULT_I;
loggerModem::_priorBatteryPercent = SENSOR_DEFAULT_I;
loggerModem::_priorModemTemp = SENSOR_DEFAULT_F;

// Initialize variable
int16_t signalQual = SENSOR_DEFAULT_I;
uint16_t volt = SENSOR_DEFAULT_I;
int16_t rssi = SENSOR_DEFAULT_I;
// int16_t percent = SENSOR_DEFAULT_I;
#define XBEE_V_KEY 9999
uint16_t volt_mV = XBEE_V_KEY;

// if not enabled don't collect data
if (!loggerModem::_pollModemMetaData) return false;
if (0 == loggerModem::_pollModemMetaData) return false;

// Enter command mode only once
// Enter command mode only once for temp and battery
MS_DBG(F("Entering Command Mode:"));
success &= gsmModem.commandMode();

// Try for up to 15 seconds to get a valid signal quality
// NOTE: We can't actually distinguish between a bad modem response, no
// modem response, and a real response from the modem of no service/signal.
// The TinyGSM getSignalQuality function returns the same "no signal"
// value (99 CSQ or 0 RSSI) in all 3 cases.
uint32_t startMillis = millis();
do {
MS_DBG(F("Getting signal quality:"));
signalQual = gsmModem.getSignalQuality();
MS_DBG(F("Raw signal quality:"), signalQual);
if (signalQual != 0 && signalQual != -9999) break;
delay(250);
} while ((signalQual == 0 || signalQual == -9999) &&
millis() - startMillis < 15000L && success);

// Convert signal quality to RSSI
loggerModem::_priorRSSI = signalQual;
MS_DBG(F("CURRENT RSSI:"), signalQual);
loggerModem::_priorSignalPercent = getPctFromRSSI(signalQual);
MS_DBG(F("CURRENT Percent signal strength:"), getPctFromRSSI(signalQual));

MS_DBG(F("Getting input voltage:"));
volt = gsmModem.getBattVoltage();
MS_DBG(F("CURRENT Modem input battery voltage:"), volt);
if (volt != 9999)
loggerModem::_priorBatteryVoltage = static_cast<float>(volt);
else
loggerModem::_priorBatteryVoltage = static_cast<float>(-9999);

MS_DBG(F("Getting chip temperature:"));
loggerModem::_priorModemTemp = getModemChipTemperature();
MS_DBG(F("CURRENT Modem temperature:"), loggerModem::_priorModemTemp);

if (POLL_MODEM_META_DATA_RSSI & loggerModem::_pollModemMetaData) {
// Assume a signal has already been established.
// Try to get a valid signal quality
// NOTE: We can't actually distinguish between a bad modem response, no
// modem response, and a real response from the modem of no
// service/signal. The TinyGSM getSignalQuality function returns the
// same "no signal" value (99 CSQ or 0 RSSI) in all 3 cases. Try up to 5
// times to get a signal quality - that is, ping NIST 5 times and see if
// the value updates
int8_t num_trys_remaining = 5;
do {
rssi = gsmModem.getSignalQuality();
MS_DBG(F("Raw signal quality("), num_trys_remaining, F("):"), rssi);
if (rssi != 0 && rssi != SENSOR_DEFAULT_I) break;
num_trys_remaining--;
} while ((rssi == 0 || rssi == SENSOR_DEFAULT_I) && num_trys_remaining);


loggerModem::_priorSignalPercent = getPctFromRSSI(rssi);
MS_DBG(F("CURRENT Percent signal strength:"),
loggerModem::_priorSignalPercent);

loggerModem::_priorRSSI = rssi;
MS_DBG(F("CURRENT RSSI:"), rssi);
}
if (POLL_MODEM_META_DATA_VCC & loggerModem::_pollModemMetaData) {
// MS_DBG(F("Getting input voltage:"));
volt_mV = gsmModem.getBattVoltage();
MS_DBG(F("CURRENT Modem battery (mV):"), volt_mV);
if (volt_mV != XBEE_V_KEY) {
loggerModem::_priorBatteryVoltage =
static_cast<float>(volt_mV / 1000);
} else {
loggerModem::_priorBatteryVoltage =
static_cast<float>(SENSOR_DEFAULT_I);
}
}
if (POLL_MODEM_META_DATA_TEMP & loggerModem::_pollModemMetaData) {
// MS_DBG(F("Getting chip temperature:"));
loggerModem::_priorModemTemp = getModemChipTemperature();
MS_DBG(F("CURRENT Modem temperature(C):"),
loggerModem::_priorModemTemp);
}
// Exit command modem
MS_DBG(F("Leaving Command Mode:"));
gsmModem.exitCommand();
if (0 == rssi || (++updateModemMetadata_cnt > XBEE_RESET_THRESHOLD)) {
updateModemMetadata_cnt = 0;
/** Since not giving an rssi value, restart the modem for next time.
* This is likely to take over 2 seconds */
PRINTOUT(F("updateModemMetadata forcing restart xbee..."));
success &= gsmModem.restart();
}

return success;
}
Expand Down
4 changes: 3 additions & 1 deletion src/modems/DigiXBeeWifi.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,13 +164,15 @@ class DigiXBeeWifi : public DigiXBee {
char* _ssid_buf = NULL;
char* _pwd_buf = NULL;

uint16_t updateModemMetadata_cnt = 0;
#define XBEE_RESET_THRESHOLD 100

public:
// Az extension
void setWiFiId(const char* WiFiId, bool copyId = false);
void setWiFiPwd(const char* WiFiPwd, bool copyId = false);
String getWiFiId(void);
String getWiFiPwd(void);

};
/**@}*/
#endif // SRC_MODEMS_DIGIXBEEWIFI_H_

0 comments on commit 93bd595

Please sign in to comment.