diff --git a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h index 0887158..eb9a620 100644 --- a/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h +++ b/src/SparkFun_u-blox_SARA-R5_Arduino_Library.h @@ -21,6 +21,7 @@ #define SPARKFUN_SARA_R5_ARDUINO_LIBRARY_H #include "sfe_sara_r5.h" +#include "sfe_ublox_cellular.h" #define SARA_R5_POWER_PIN -1 // Default to no pin #define SARA_R5_RESET_PIN -1 @@ -42,125 +43,125 @@ // ## Suported AT Commands // ### General -const char SARA_R5_COMMAND_AT[] = "AT"; // AT "Test" -const char SARA_R5_COMMAND_ECHO[] = "E"; // Local Echo -const char SARA_R5_COMMAND_MANU_ID[] = "+CGMI"; // Manufacturer identification -const char SARA_R5_COMMAND_MODEL_ID[] = "+CGMM"; // Model identification -const char SARA_R5_COMMAND_FW_VER_ID[] = "+CGMR"; // Firmware version identification -const char SARA_R5_COMMAND_SERIAL_NO[] = "+CGSN"; // Product serial number -const char SARA_R5_COMMAND_IMEI[] = "+GSN"; // IMEI identification -const char SARA_R5_COMMAND_IMSI[] = "+CIMI"; // IMSI identification -const char SARA_R5_COMMAND_CCID[] = "+CCID"; // SIM CCID -const char SARA_R5_COMMAND_REQ_CAP[] = "+GCAP"; // Request capabilities list +#define SARA_R5_COMMAND_AT UBX_CELL_COMMAND_AT +#define SARA_R5_COMMAND_ECHO UBX_CELL_COMMAND_ECHO +#define SARA_R5_COMMAND_MANU_ID UBX_CELL_COMMAND_MANU_ID +#define SARA_R5_COMMAND_MODEL_ID UBX_CELL_COMMAND_MODEL_ID +#define SARA_R5_COMMAND_FW_VER_ID UBX_CELL_COMMAND_FW_VER_ID +#define SARA_R5_COMMAND_SERIAL_NO UBX_CELL_COMMAND_SERIAL_NO +#define SARA_R5_COMMAND_IMEI UBX_CELL_COMMAND_IMEI +#define SARA_R5_COMMAND_IMSI UBX_CELL_COMMAND_IMSI +#define SARA_R5_COMMAND_CCID UBX_CELL_COMMAND_CCID +#define SARA_R5_COMMAND_REQ_CAP UBX_CELL_COMMAND_REQ_CAP // ### Control and status -const char SARA_R5_COMMAND_POWER_OFF[] = "+CPWROFF"; // Module switch off -const char SARA_R5_COMMAND_FUNC[] = "+CFUN"; // Functionality (reset, etc.) -const char SARA_R5_COMMAND_CLOCK[] = "+CCLK"; // Real-time clock -const char SARA_R5_COMMAND_AUTO_TZ[] = "+CTZU"; // Automatic time zone update -const char SARA_R5_COMMAND_TZ_REPORT[] = "+CTZR"; // Time zone reporting +#define SARA_R5_COMMAND_POWER_OFF UBX_CELL_COMMAND_POWER_OFF +#define SARA_R5_COMMAND_FUNC UBX_CELL_COMMAND_FUNC +#define SARA_R5_COMMAND_CLOCK UBX_CELL_COMMAND_CLOCK +#define SARA_R5_COMMAND_AUTO_TZ UBX_CELL_COMMAND_AUTO_TZ +#define SARA_R5_COMMAND_TZ_REPORT UBX_CELL_COMMAND_TZ_REPORT // ### Network service -const char SARA_R5_COMMAND_CNUM[] = "+CNUM"; // Subscriber number -const char SARA_R5_SIGNAL_QUALITY[] = "+CSQ"; -const char SARA_R5_EXT_SIGNAL_QUALITY[] = "+CESQ"; -const char SARA_R5_OPERATOR_SELECTION[] = "+COPS"; -const char SARA_R5_REGISTRATION_STATUS[] = "+CREG"; -const char SARA_R5_EPSREGISTRATION_STATUS[] = "+CEREG"; -const char SARA_R5_READ_OPERATOR_NAMES[] = "+COPN"; -const char SARA_R5_COMMAND_MNO[] = "+UMNOPROF"; // MNO (mobile network operator) Profile +#define SARA_R5_COMMAND_CNUM UBX_CELL_COMMAND_CNUM +#define SARA_R5_SIGNAL_QUALITY UBX_CELL_SIGNAL_QUALITY +#define SARA_R5_EXT_SIGNAL_QUALITY UBX_CELL_EXT_SIGNAL_QUALITY +#define SARA_R5_OPERATOR_SELECTION UBX_CELL_OPERATOR_SELECTION +#define SARA_R5_REGISTRATION_STATUS UBX_CELL_REGISTRATION_STATUS +#define SARA_R5_EPSREGISTRATION_STATUS UBX_CELL_EPSREGISTRATION_STATUS +#define SARA_R5_READ_OPERATOR_NAMES UBX_CELL_READ_OPERATOR_NAMES +#define SARA_R5_COMMAND_MNO UBX_CELL_COMMAND_MNO // ### SIM -const char SARA_R5_SIM_STATE[] = "+USIMSTAT"; -const char SARA_R5_COMMAND_SIMPIN[] = "+CPIN"; // SIM PIN +#define SARA_R5_SIM_STATE UBX_CELL_SIM_STATE +#define SARA_R5_COMMAND_SIMPIN UBX_CELL_COMMAND_SIMPIN // ### SMS -const char SARA_R5_MESSAGE_FORMAT[] = "+CMGF"; // Set SMS message format -const char SARA_R5_SEND_TEXT[] = "+CMGS"; // Send SMS message -const char SARA_R5_NEW_MESSAGE_IND[] = "+CNMI"; // New [SMS] message indication -const char SARA_R5_PREF_MESSAGE_STORE[] = "+CPMS"; // Preferred message storage -const char SARA_R5_READ_TEXT_MESSAGE[] = "+CMGR"; // Read message -const char SARA_R5_DELETE_MESSAGE[] = "+CMGD"; // Delete message +#define SARA_R5_MESSAGE_FORMAT UBX_CELL_MESSAGE_FORMAT +#define SARA_R5_SEND_TEXT UBX_CELL_SEND_TEXT +#define SARA_R5_NEW_MESSAGE_IND UBX_CELL_NEW_MESSAGE_IND +#define SARA_R5_PREF_MESSAGE_STORE UBX_CELL_PREF_MESSAGE_STORE +#define SARA_R5_READ_TEXT_MESSAGE UBX_CELL_READ_TEXT_MESSAGE +#define SARA_R5_DELETE_MESSAGE UBX_CELL_DELETE_MESSAGE // V24 control and V25ter (UART interface) -const char SARA_R5_FLOW_CONTROL[] = "&K"; // Flow control -const char SARA_R5_COMMAND_BAUD[] = "+IPR"; // Baud rate +#define SARA_R5_FLOW_CONTROL UBX_CELL_FLOW_CONTROL +#define SARA_R5_COMMAND_BAUD UBX_CELL_COMMAND_BAUD // ### Packet switched data services -const char SARA_R5_MESSAGE_PDP_DEF[] = "+CGDCONT"; // Packet switched Data Profile context definition -const char SARA_R5_MESSAGE_PDP_CONFIG[] = "+UPSD"; // Packet switched Data Profile configuration -const char SARA_R5_MESSAGE_PDP_ACTION[] = "+UPSDA"; // Perform the action for the specified PSD profile -const char SARA_R5_MESSAGE_PDP_CONTEXT_ACTIVATE[] = "+CGACT"; // Activates or deactivates the specified PDP context -const char SARA_R5_MESSAGE_ENTER_PPP[] = "D"; -const char SARA_R5_NETWORK_ASSIGNED_DATA[] = "+UPSND"; // Packet switched network-assigned data +#define SARA_R5_MESSAGE_PDP_DEF UBX_CELL_MESSAGE_PDP_DEF +#define SARA_R5_MESSAGE_PDP_CONFIG UBX_CELL_MESSAGE_PDP_CONFIG +#define SARA_R5_MESSAGE_PDP_ACTION UBX_CELL_MESSAGE_PDP_ACTION +#define SARA_R5_MESSAGE_PDP_CONTEXT_ACTIVATE UBX_CELL_MESSAGE_PDP_CONTEXT_ACTIVATE +#define SARA_R5_MESSAGE_ENTER_PPP UBX_CELL_MESSAGE_ENTER_PPP +#define SARA_R5_NETWORK_ASSIGNED_DATA UBX_CELL_NETWORK_ASSIGNED_DATA // ### GPIO -const char SARA_R5_COMMAND_GPIO[] = "+UGPIOC"; // GPIO Configuration +#define SARA_R5_COMMAND_GPIO UBX_CELL_COMMAND_GPIO // ### IP -const char SARA_R5_CREATE_SOCKET[] = "+USOCR"; // Create a new socket -const char SARA_R5_CLOSE_SOCKET[] = "+USOCL"; // Close a socket -const char SARA_R5_CONNECT_SOCKET[] = "+USOCO"; // Connect to server on socket -const char SARA_R5_WRITE_SOCKET[] = "+USOWR"; // Write data to a socket -const char SARA_R5_WRITE_UDP_SOCKET[] = "+USOST"; // Write data to a UDP socket -const char SARA_R5_READ_SOCKET[] = "+USORD"; // Read from a socket -const char SARA_R5_READ_UDP_SOCKET[] = "+USORF"; // Read UDP data from a socket -const char SARA_R5_LISTEN_SOCKET[] = "+USOLI"; // Listen for connection on socket -const char SARA_R5_GET_ERROR[] = "+USOER"; // Get last socket error. -const char SARA_R5_SOCKET_DIRECT_LINK[] = "+USODL"; // Set socket in Direct Link mode -const char SARA_R5_SOCKET_CONTROL[] = "+USOCTL"; // Query the socket parameters -const char SARA_R5_UD_CONFIGURATION[] = "+UDCONF"; // User Datagram Configuration +#define SARA_R5_CREATE_SOCKET UBX_CELL_CREATE_SOCKET +#define SARA_R5_CLOSE_SOCKET UBX_CELL_CLOSE_SOCKET +#define SARA_R5_CONNECT_SOCKET UBX_CELL_CONNECT_SOCKET +#define SARA_R5_WRITE_SOCKET UBX_CELL_WRITE_SOCKET +#define SARA_R5_WRITE_UDP_SOCKET UBX_CELL_WRITE_UDP_SOCKET +#define SARA_R5_READ_SOCKET UBX_CELL_READ_SOCKET +#define SARA_R5_READ_UDP_SOCKET UBX_CELL_READ_UDP_SOCKET +#define SARA_R5_LISTEN_SOCKET UBX_CELL_LISTEN_SOCKET +#define SARA_R5_GET_ERROR UBX_CELL_GET_ERROR +#define SARA_R5_SOCKET_DIRECT_LINK UBX_CELL_SOCKET_DIRECT_LINK +#define SARA_R5_SOCKET_CONTROL UBX_CELL_SOCKET_CONTROL +#define SARA_R5_UD_CONFIGURATION UBX_CELL_UD_CONFIGURATION // ### Ping -const char SARA_R5_PING_COMMAND[] = "+UPING"; // Ping +#define SARA_R5_PING_COMMAND UBX_CELL_PING_COMMAND // ### HTTP -const char SARA_R5_HTTP_PROFILE[] = "+UHTTP"; // Configure the HTTP profile. Up to 4 different profiles can be defined -const char SARA_R5_HTTP_COMMAND[] = "+UHTTPC"; // Trigger the specified HTTP command -const char SARA_R5_HTTP_PROTOCOL_ERROR[] = "+UHTTPER"; // Retrieves the error class and code of the latest HTTP operation on the specified HTTP profile. - -const char SARA_R5_MQTT_NVM[] = "+UMQTTNV"; -const char SARA_R5_MQTT_PROFILE[] = "+UMQTT"; -const char SARA_R5_MQTT_COMMAND[] = "+UMQTTC"; -const char SARA_R5_MQTT_PROTOCOL_ERROR[] = "+UMQTTER"; +#define SARA_R5_HTTP_PROFILE UBX_CELL_HTTP_PROFILE +#define SARA_R5_HTTP_COMMAND UBX_CELL_HTTP_COMMAND +#define SARA_R5_HTTP_PROTOCOL_ERROR UBX_CELL_HTTP_PROTOCOL_ERROR + +#define SARA_R5_MQTT_NVM UBX_CELL_MQTT_NVM +#define SARA_R5_MQTT_PROFILE UBX_CELL_MQTT_PROFILE +#define SARA_R5_MQTT_COMMAND UBX_CELL_MQTT_COMMAND +#define SARA_R5_MQTT_PROTOCOL_ERROR UBX_CELL_MQTT_PROTOCOL_ERROR // ### FTP -const char SARA_R5_FTP_PROFILE[] = "+UFTP"; -const char SARA_R5_FTP_COMMAND[] = "+UFTPC"; -const char SARA_R5_FTP_PROTOCOL_ERROR[] = "+UFTPER"; +#define SARA_R5_FTP_PROFILE UBX_CELL_FTP_PROFILE +#define SARA_R5_FTP_COMMAND UBX_CELL_FTP_COMMAND +#define SARA_R5_FTP_PROTOCOL_ERROR UBX_CELL_FTP_PROTOCOL_ERROR // ### GNSS -const char SARA_R5_GNSS_POWER[] = "+UGPS"; // GNSS power management configuration -const char SARA_R5_GNSS_ASSISTED_IND[] = "+UGIND"; // Assisted GNSS unsolicited indication -const char SARA_R5_GNSS_REQUEST_LOCATION[] = "+ULOC"; // Ask for localization information -const char SARA_R5_GNSS_GPRMC[] = "+UGRMC"; // Ask for localization information -const char SARA_R5_GNSS_REQUEST_TIME[] = "+UTIME"; // Ask for time information from cellular modem (CellTime) -const char SARA_R5_GNSS_TIME_INDICATION[] = "+UTIMEIND"; // Time information request status unsolicited indication -const char SARA_R5_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG"; // Sets time configuration -const char SARA_R5_GNSS_CONFIGURE_SENSOR[] = "+ULOCGNSS"; // Configure GNSS sensor -const char SARA_R5_GNSS_CONFIGURE_LOCATION[] = "+ULOCCELL"; // Configure cellular location sensor (CellLocate®) -const char SARA_R5_AIDING_SERVER_CONFIGURATION[] = "+UGSRV"; // Configure aiding server (CellLocate®) +#define SARA_R5_GNSS_POWER UBX_CELL_GNSS_POWER +#define SARA_R5_GNSS_ASSISTED_IND UBX_CELL_GNSS_ASSISTED_IND +#define SARA_R5_GNSS_REQUEST_LOCATION UBX_CELL_GNSS_REQUEST_LOCATION +#define SARA_R5_GNSS_GPRMC UBX_CELL_GNSS_GPRMC +#define SARA_R5_GNSS_REQUEST_TIME UBX_CELL_GNSS_REQUEST_TIME +#define SARA_R5_GNSS_TIME_INDICATION UBX_CELL_GNSS_TIME_INDICATION +#define SARA_R5_GNSS_TIME_CONFIGURATION UBX_CELL_GNSS_TIME_CONFIGURATION +#define SARA_R5_GNSS_CONFIGURE_SENSOR UBX_CELL_GNSS_CONFIGURE_SENSOR +#define SARA_R5_GNSS_CONFIGURE_LOCATION UBX_CELL_GNSS_CONFIGURE_LOCATION +#define SARA_R5_AIDING_SERVER_CONFIGURATION UBX_CELL_AIDING_SERVER_CONFIGURATION // ### File System // TO DO: Add support for file tags. Default tag to USER -const char SARA_R5_FILE_SYSTEM_READ_FILE[] = "+URDFILE"; // Read a file -const char SARA_R5_FILE_SYSTEM_READ_BLOCK[] = "+URDBLOCK"; // Read a block from a file -const char SARA_R5_FILE_SYSTEM_DOWNLOAD_FILE[] = "+UDWNFILE"; // Download a file into the module -const char SARA_R5_FILE_SYSTEM_LIST_FILES[] = "+ULSTFILE"; // List of files, size of file, etc. -const char SARA_R5_FILE_SYSTEM_DELETE_FILE[] = "+UDELFILE"; // Delete a file +#define SARA_R5_FILE_SYSTEM_READ_FILE UBX_CELL_FILE_SYSTEM_READ_FILE +#define SARA_R5_FILE_SYSTEM_READ_BLOCK UBX_CELL_FILE_SYSTEM_READ_BLOCK +#define SARA_R5_FILE_SYSTEM_DOWNLOAD_FILE UBX_CELL_FILE_SYSTEM_DOWNLOAD_FILE +#define SARA_R5_FILE_SYSTEM_LIST_FILES UBX_CELL_FILE_SYSTEM_LIST_FILES +#define SARA_R5_FILE_SYSTEM_DELETE_FILE UBX_CELL_FILE_SYSTEM_DELETE_FILE // ### File System // TO DO: Add support for file tags. Default tag to USER -const char SARA_R5_SEC_PROFILE[] = "+USECPRF"; -const char SARA_R5_SEC_MANAGER[] = "+USECMNG"; +#define SARA_R5_SEC_PROFILE UBX_CELL_SEC_PROFILE +#define SARA_R5_SEC_MANAGER UBX_CELL_SEC_MANAGER // ### URC strings -const char SARA_R5_READ_SOCKET_URC[] = "+UUSORD:"; -const char SARA_R5_READ_UDP_SOCKET_URC[] = "+UUSORF:"; -const char SARA_R5_LISTEN_SOCKET_URC[] = "+UUSOLI:"; -const char SARA_R5_CLOSE_SOCKET_URC[] = "+UUSOCL:"; -const char SARA_R5_GNSS_REQUEST_LOCATION_URC[] = "+UULOC:"; -const char SARA_R5_SIM_STATE_URC[] = "+UUSIMSTAT:"; -const char SARA_R5_MESSAGE_PDP_ACTION_URC[] = "+UUPSDA:"; -const char SARA_R5_HTTP_COMMAND_URC[] = "+UUHTTPCR:"; -const char SARA_R5_MQTT_COMMAND_URC[] = "+UUMQTTC:"; -const char SARA_R5_PING_COMMAND_URC[] = "+UUPING:"; -const char SARA_R5_REGISTRATION_STATUS_URC[] = "+CREG:"; -const char SARA_R5_EPSREGISTRATION_STATUS_URC[] = "+CEREG:"; -const char SARA_R5_FTP_COMMAND_URC[] = "+UUFTPCR:"; +#define SARA_R5_READ_SOCKET_URC UBX_CELL_READ_SOCKET_URC +#define SARA_R5_READ_UDP_SOCKET_URC UBX_CELL_READ_UDP_SOCKET_URC +#define SARA_R5_LISTEN_SOCKET_URC UBX_CELL_LISTEN_SOCKET_URC +#define SARA_R5_CLOSE_SOCKET_URC UBX_CELL_CLOSE_SOCKET_URC +#define SARA_R5_GNSS_REQUEST_LOCATION_URC UBX_CELL_GNSS_REQUEST_LOCATION_URC +#define SARA_R5_SIM_STATE_URC UBX_CELL_SIM_STATE_URC +#define SARA_R5_MESSAGE_PDP_ACTION_URC UBX_CELL_MESSAGE_PDP_ACTION_URC +#define SARA_R5_HTTP_COMMAND_URC UBX_CELL_HTTP_COMMAND_URC +#define SARA_R5_MQTT_COMMAND_URC UBX_CELL_MQTT_COMMAND_URC +#define SARA_R5_PING_COMMAND_URC UBX_CELL_PING_COMMAND_URC +#define SARA_R5_REGISTRATION_STATUS_URC UBX_CELL_REGISTRATION_STATUS_URC +#define SARA_R5_EPSREGISTRATION_STATUS_URC UBX_CELL_EPSREGISTRATION_STATUS_URC +#define SARA_R5_FTP_COMMAND_URC UBX_CELL_FTP_COMMAND_URC // ### Response -const char SARA_R5_RESPONSE_MORE[] = "\n>"; -const char SARA_R5_RESPONSE_OK[] = "\nOK\r\n"; -const char SARA_R5_RESPONSE_ERROR[] = "\nERROR\r\n"; -const char SARA_R5_RESPONSE_CONNECT[] = "\r\nCONNECT\r\n"; +#define SARA_R5_RESPONSE_MORE UBX_CELL_RESPONSE_MORE +#define SARA_R5_RESPONSE_OK UBX_CELL_RESPONSE_OK +#define SARA_R5_RESPONSE_ERROR UBX_CELL_RESPONSE_ERROR +#define SARA_R5_RESPONSE_CONNECT UBX_CELL_RESPONSE_CONNECT #define SARA_R5_RESPONSE_OK_OR_ERROR nullptr #define SARA_R5_NUM_SOCKETS 6 diff --git a/src/sfe_sara_r5.cpp b/src/sfe_sara_r5.cpp new file mode 100644 index 0000000..0e704b4 --- /dev/null +++ b/src/sfe_sara_r5.cpp @@ -0,0 +1,360 @@ +#include "sfe_sara_r5.h" + +UBX_CELL_error_t SARA_R5::setUtimeMode(UBX_CELL_utime_mode_t mode, UBX_CELL_utime_sensor_t sensor) +{ + UBX_CELL_error_t err; + char *command; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 16); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + if (mode == UBX_CELL_UTIME_MODE_STOP) // stop UTIME does not require a sensor + sprintf(command, "%s=%d", UBX_CELL_GNSS_REQUEST_TIME, mode); + else + sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_REQUEST_TIME, mode, sensor); + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_10_SEC_TIMEOUT); + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor) +{ + UBX_CELL_error_t err; + char *command; + char *response; + + UBX_CELL_utime_mode_t m; + UBX_CELL_utime_sensor_t s; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 2); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s?", UBX_CELL_GNSS_REQUEST_TIME); + + response = ubx_cell_calloc_char(minimumResponseAllocation); + if (response == nullptr) + { + free(command); + return UBX_CELL_ERROR_OUT_OF_MEMORY; + } + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + response, UBX_CELL_10_SEC_TIMEOUT); + + // Response format: \r\n+UTIME: <mode>[,<sensor>]\r\n\r\nOK\r\n + if (err == UBX_CELL_ERROR_SUCCESS) + { + int mStore, sStore, scanned = 0; + char *searchPtr = strstr(response, "+UTIME:"); + if (searchPtr != nullptr) + { + searchPtr += strlen("+UTIME:"); // Move searchPtr to first character - probably a space + while (*searchPtr == ' ') searchPtr++; // skip spaces + scanned = sscanf(searchPtr, "%d,%d\r\n", &mStore, &sStore); + } + m = (UBX_CELL_utime_mode_t)mStore; + s = (UBX_CELL_utime_sensor_t)sStore; + if (scanned == 2) + { + *mode = m; + *sensor = s; + } + else if (scanned == 1) + { + *mode = m; + *sensor = UBX_CELL_UTIME_SENSOR_NONE; + } + else + err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE; + } + + free(command); + free(response); + return err; +} + +UBX_CELL_error_t SARA_R5::setUtimeIndication(UBX_CELL_utime_urc_configuration_t config) +{ + UBX_CELL_error_t err; + char *command; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 16); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d", UBX_CELL_GNSS_TIME_INDICATION, config); + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config) +{ + UBX_CELL_error_t err; + char *command; + char *response; + + UBX_CELL_utime_urc_configuration_t c; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 2); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s?", UBX_CELL_GNSS_TIME_INDICATION); + + response = ubx_cell_calloc_char(minimumResponseAllocation); + if (response == nullptr) + { + free(command); + return UBX_CELL_ERROR_OUT_OF_MEMORY; + } + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + // Response format: \r\n+UTIMEIND: <mode>\r\n\r\nOK\r\n + if (err == UBX_CELL_ERROR_SUCCESS) + { + int cStore, scanned = 0; + char *searchPtr = strstr(response, "+UTIMEIND:"); + if (searchPtr != nullptr) + { + searchPtr += strlen("+UTIMEIND:"); // Move searchPtr to first char + while (*searchPtr == ' ') searchPtr++; // skip spaces + scanned = sscanf(searchPtr, "%d\r\n", &cStore); + } + c = (UBX_CELL_utime_urc_configuration_t)cStore; + if (scanned == 1) + { + *config = c; + } + else + err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE; + } + + free(command); + free(response); + return err; +} + +UBX_CELL_error_t SARA_R5::setUtimeConfiguration(int32_t offsetNanoseconds, int32_t offsetSeconds) +{ + UBX_CELL_error_t err; + char *command; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 48); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; +#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) + sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds); +#else + sprintf(command, "%s=%ld,%ld", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds); +#endif + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds) +{ + UBX_CELL_error_t err; + char *command; + char *response; + + int32_t ons; + int32_t os; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 2); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s?", UBX_CELL_GNSS_TIME_CONFIGURATION); + + response = ubx_cell_calloc_char(minimumResponseAllocation); + if (response == nullptr) + { + free(command); + return UBX_CELL_ERROR_OUT_OF_MEMORY; + } + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + // Response format: \r\n+UTIMECFG: <offset_nano>,<offset_sec>\r\n\r\nOK\r\n + if (err == UBX_CELL_ERROR_SUCCESS) + { + int scanned = 0; + char *searchPtr = strstr(response, "+UTIMECFG:"); + if (searchPtr != nullptr) + { + searchPtr += strlen("+UTIMECFG:"); // Move searchPtr to first char + while (*searchPtr == ' ') searchPtr++; // skip spaces +#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) + scanned = sscanf(searchPtr, "%d,%d\r\n", &ons, &os); +#else + scanned = sscanf(searchPtr, "%ld,%ld\r\n", &ons, &os); +#endif + } + if (scanned == 2) + { + *offsetNanoseconds = ons; + *offsetSeconds = os; + } + else + err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE; + } + + free(command); + free(response); + return err; +} + +UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value) +{ + UBX_CELL_error_t err; + char *command; + + if (profile >= UBX_CELL_NUM_PSD_PROFILES) + return UBX_CELL_ERROR_ERROR; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 24); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d,%d", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter, + value); + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, + UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value) +{ + return (setPDPconfiguration(profile, parameter, (int)value)); +} + +UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value) +{ + UBX_CELL_error_t err; + char *command; + + if (profile >= UBX_CELL_NUM_PSD_PROFILES) + return UBX_CELL_ERROR_ERROR; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d,\"%s\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter, + value.c_str()); + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, + UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value) +{ + UBX_CELL_error_t err; + char *command; + + if (profile >= UBX_CELL_NUM_PSD_PROFILES) + return UBX_CELL_ERROR_ERROR; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d,\"%d.%d.%d.%d\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter, + value[0], value[1], value[2], value[3]); + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, + UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::performPDPaction(int profile, UBX_CELL_pdp_actions_t action) +{ + UBX_CELL_error_t err; + char *command; + + if (profile >= UBX_CELL_NUM_PSD_PROFILES) + return UBX_CELL_ERROR_ERROR; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_ACTION) + 32); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d", UBX_CELL_MESSAGE_PDP_ACTION, profile, action); + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, + UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + free(command); + return err; +} + +UBX_CELL_error_t SARA_R5::getNetworkAssignedIPAddress(int profile, IPAddress *address) +{ + char *command; + char *response; + UBX_CELL_error_t err; + int scanNum = 0; + int profileStore = 0; + int paramTag = 0; // 0: IP address: dynamic IP address assigned during PDP context activation + int paramVals[4]; + + command = ubx_cell_calloc_char(strlen(UBX_CELL_NETWORK_ASSIGNED_DATA) + 16); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d", UBX_CELL_NETWORK_ASSIGNED_DATA, profile, paramTag); + + response = ubx_cell_calloc_char(minimumResponseAllocation); + if (response == nullptr) + { + free(command); + return UBX_CELL_ERROR_OUT_OF_MEMORY; + } + + err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, response, + UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + + if (err == UBX_CELL_ERROR_SUCCESS) + { + char *searchPtr = strstr(response, "+UPSND:"); + if (searchPtr != nullptr) + { + searchPtr += strlen("+UPSND:"); // Move searchPtr to first char + while (*searchPtr == ' ') searchPtr++; // skip spaces + scanNum = sscanf(searchPtr, "%d,%d,\"%d.%d.%d.%d\"", + &profileStore, ¶mTag, + ¶mVals[0], ¶mVals[1], ¶mVals[2], ¶mVals[3]); + } + if (scanNum != 6) + { + if (_printDebug == true) + { + _debugPort->print(F("getNetworkAssignedIPAddress: error: scanNum is ")); + _debugPort->println(scanNum); + } + free(command); + free(response); + return UBX_CELL_ERROR_UNEXPECTED_RESPONSE; + } + + IPAddress tempAddress = { (uint8_t)paramVals[0], (uint8_t)paramVals[1], + (uint8_t)paramVals[2], (uint8_t)paramVals[3] }; + *address = tempAddress; + } + + free(command); + free(response); + + return err; +} diff --git a/src/sfe_sara_r5.h b/src/sfe_sara_r5.h index 688aa54..87cec80 100644 --- a/src/sfe_sara_r5.h +++ b/src/sfe_sara_r5.h @@ -3,10 +3,32 @@ #include "sfe_ublox_cellular.h" +const char UBX_CELL_MESSAGE_PDP_CONFIG[] = "+UPSD"; // Packet switched Data Profile configuration +const char UBX_CELL_MESSAGE_PDP_ACTION[] = "+UPSDA"; // Perform the action for the specified PSD profile +const char UBX_CELL_NETWORK_ASSIGNED_DATA[] = "+UPSND"; // Packet switched network-assigned data +const char UBX_CELL_GNSS_REQUEST_TIME[] = "+UTIME"; // Ask for time information from cellular modem (CellTime) +const char UBX_CELL_GNSS_TIME_INDICATION[] = "+UTIMEIND"; // Time information request status unsolicited indication +const char UBX_CELL_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG"; // Sets time configuration + // Base SARA-R5 class class SARA_R5: public UBX_CELL { - +public: + UBX_CELL_error_t setUtimeMode(UBX_CELL_utime_mode_t mode = UBX_CELL_UTIME_MODE_PPS, UBX_CELL_utime_sensor_t sensor = UBX_CELL_UTIME_SENSOR_GNSS_LTE); // Time mode, source etc. (+UTIME) + UBX_CELL_error_t getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor); + UBX_CELL_error_t setUtimeIndication(UBX_CELL_utime_urc_configuration_t config = UBX_CELL_UTIME_URC_CONFIGURATION_ENABLED); // +UTIMEIND + UBX_CELL_error_t getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config); + UBX_CELL_error_t setUtimeConfiguration(int32_t offsetNanoseconds = 0, int32_t offsetSeconds = 0); // +UTIMECFG + UBX_CELL_error_t getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds); + + // Packet Switched Data + // Configure the PDP using +UPSD. See UBX_CELL_pdp_configuration_parameter_t for the list of parameters: protocol, APN, username, DNS, etc. + UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value); // Set parameters in the chosen PSD profile + UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value); // Set parameters in the chosen PSD profile + UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value); // Set parameters in the chosen PSD profile + UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value); // Set parameters in the chosen PSD profile + UBX_CELL_error_t performPDPaction(int profile, UBX_CELL_pdp_actions_t action); // Performs the requested action for the specified PSD profile: reset, store, load, activate, deactivate + UBX_CELL_error_t getNetworkAssignedIPAddress(int profile, IPAddress *address); // Get the dynamic IP address assigned during PDP context activation }; class SARA_R500S: public SARA_R5 diff --git a/src/sfe_ublox_cellular.cpp b/src/sfe_ublox_cellular.cpp index 3dd79c8..484973c 100644 --- a/src/sfe_ublox_cellular.cpp +++ b/src/sfe_ublox_cellular.cpp @@ -1336,218 +1336,6 @@ void UBX_CELL::autoTimeZoneForBegin(bool tz) _autoTimeZoneForBegin = tz; } -UBX_CELL_error_t UBX_CELL::setUtimeMode(UBX_CELL_utime_mode_t mode, UBX_CELL_utime_sensor_t sensor) -{ - UBX_CELL_error_t err; - char *command; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 16); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - if (mode == UBX_CELL_UTIME_MODE_STOP) // stop UTIME does not require a sensor - sprintf(command, "%s=%d", UBX_CELL_GNSS_REQUEST_TIME, mode); - else - sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_REQUEST_TIME, mode, sensor); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, - nullptr, UBX_CELL_10_SEC_TIMEOUT); - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL::getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor) -{ - UBX_CELL_error_t err; - char *command; - char *response; - - UBX_CELL_utime_mode_t m; - UBX_CELL_utime_sensor_t s; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_REQUEST_TIME) + 2); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s?", UBX_CELL_GNSS_REQUEST_TIME); - - response = ubx_cell_calloc_char(minimumResponseAllocation); - if (response == nullptr) - { - free(command); - return UBX_CELL_ERROR_OUT_OF_MEMORY; - } - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, - response, UBX_CELL_10_SEC_TIMEOUT); - - // Response format: \r\n+UTIME: <mode>[,<sensor>]\r\n\r\nOK\r\n - if (err == UBX_CELL_ERROR_SUCCESS) - { - int mStore, sStore, scanned = 0; - char *searchPtr = strstr(response, "+UTIME:"); - if (searchPtr != nullptr) - { - searchPtr += strlen("+UTIME:"); // Move searchPtr to first character - probably a space - while (*searchPtr == ' ') searchPtr++; // skip spaces - scanned = sscanf(searchPtr, "%d,%d\r\n", &mStore, &sStore); - } - m = (UBX_CELL_utime_mode_t)mStore; - s = (UBX_CELL_utime_sensor_t)sStore; - if (scanned == 2) - { - *mode = m; - *sensor = s; - } - else if (scanned == 1) - { - *mode = m; - *sensor = UBX_CELL_UTIME_SENSOR_NONE; - } - else - err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE; - } - - free(command); - free(response); - return err; -} - -UBX_CELL_error_t UBX_CELL::setUtimeIndication(UBX_CELL_utime_urc_configuration_t config) -{ - UBX_CELL_error_t err; - char *command; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 16); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d", UBX_CELL_GNSS_TIME_INDICATION, config); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, - nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL::getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config) -{ - UBX_CELL_error_t err; - char *command; - char *response; - - UBX_CELL_utime_urc_configuration_t c; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_INDICATION) + 2); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s?", UBX_CELL_GNSS_TIME_INDICATION); - - response = ubx_cell_calloc_char(minimumResponseAllocation); - if (response == nullptr) - { - free(command); - return UBX_CELL_ERROR_OUT_OF_MEMORY; - } - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, - response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - // Response format: \r\n+UTIMEIND: <mode>\r\n\r\nOK\r\n - if (err == UBX_CELL_ERROR_SUCCESS) - { - int cStore, scanned = 0; - char *searchPtr = strstr(response, "+UTIMEIND:"); - if (searchPtr != nullptr) - { - searchPtr += strlen("+UTIMEIND:"); // Move searchPtr to first char - while (*searchPtr == ' ') searchPtr++; // skip spaces - scanned = sscanf(searchPtr, "%d\r\n", &cStore); - } - c = (UBX_CELL_utime_urc_configuration_t)cStore; - if (scanned == 1) - { - *config = c; - } - else - err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE; - } - - free(command); - free(response); - return err; -} - -UBX_CELL_error_t UBX_CELL::setUtimeConfiguration(int32_t offsetNanoseconds, int32_t offsetSeconds) -{ - UBX_CELL_error_t err; - char *command; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 48); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; -#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) - sprintf(command, "%s=%d,%d", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds); -#else - sprintf(command, "%s=%ld,%ld", UBX_CELL_GNSS_TIME_CONFIGURATION, offsetNanoseconds, offsetSeconds); -#endif - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, - nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL::getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds) -{ - UBX_CELL_error_t err; - char *command; - char *response; - - int32_t ons; - int32_t os; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_GNSS_TIME_CONFIGURATION) + 2); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s?", UBX_CELL_GNSS_TIME_CONFIGURATION); - - response = ubx_cell_calloc_char(minimumResponseAllocation); - if (response == nullptr) - { - free(command); - return UBX_CELL_ERROR_OUT_OF_MEMORY; - } - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, - response, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - // Response format: \r\n+UTIMECFG: <offset_nano>,<offset_sec>\r\n\r\nOK\r\n - if (err == UBX_CELL_ERROR_SUCCESS) - { - int scanned = 0; - char *searchPtr = strstr(response, "+UTIMECFG:"); - if (searchPtr != nullptr) - { - searchPtr += strlen("+UTIMECFG:"); // Move searchPtr to first char - while (*searchPtr == ' ') searchPtr++; // skip spaces -#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) - scanned = sscanf(searchPtr, "%d,%d\r\n", &ons, &os); -#else - scanned = sscanf(searchPtr, "%ld,%ld\r\n", &ons, &os); -#endif - } - if (scanned == 2) - { - *offsetNanoseconds = ons; - *offsetSeconds = os; - } - else - err = UBX_CELL_ERROR_UNEXPECTED_RESPONSE; - } - - free(command); - free(response); - return err; -} - UBX_CELL_error_t UBX_CELL::autoTimeZone(bool enable) { UBX_CELL_error_t err; @@ -4835,94 +4623,6 @@ UBX_CELL_error_t UBX_CELL::setSecurityManager(UBX_CELL_sec_manager_opcode_t opco return err; } -UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value) -{ - UBX_CELL_error_t err; - char *command; - - if (profile >= UBX_CELL_NUM_PSD_PROFILES) - return UBX_CELL_ERROR_ERROR; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 24); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d,%d", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter, - value); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, - UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value) -{ - return (setPDPconfiguration(profile, parameter, (int)value)); -} - -UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value) -{ - UBX_CELL_error_t err; - char *command; - - if (profile >= UBX_CELL_NUM_PSD_PROFILES) - return UBX_CELL_ERROR_ERROR; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d,\"%s\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter, - value.c_str()); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, - UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL::setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value) -{ - UBX_CELL_error_t err; - char *command; - - if (profile >= UBX_CELL_NUM_PSD_PROFILES) - return UBX_CELL_ERROR_ERROR; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_CONFIG) + 64); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d,\"%d.%d.%d.%d\"", UBX_CELL_MESSAGE_PDP_CONFIG, profile, parameter, - value[0], value[1], value[2], value[3]); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, - UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL::performPDPaction(int profile, UBX_CELL_pdp_actions_t action) -{ - UBX_CELL_error_t err; - char *command; - - if (profile >= UBX_CELL_NUM_PSD_PROFILES) - return UBX_CELL_ERROR_ERROR; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_MESSAGE_PDP_ACTION) + 32); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d", UBX_CELL_MESSAGE_PDP_ACTION, profile, action); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, nullptr, - UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - free(command); - return err; -} - UBX_CELL_error_t UBX_CELL::activatePDPcontext(bool status, int cid) { UBX_CELL_error_t err; @@ -4946,65 +4646,6 @@ UBX_CELL_error_t UBX_CELL::activatePDPcontext(bool status, int cid) return err; } -UBX_CELL_error_t UBX_CELL::getNetworkAssignedIPAddress(int profile, IPAddress *address) -{ - char *command; - char *response; - UBX_CELL_error_t err; - int scanNum = 0; - int profileStore = 0; - int paramTag = 0; // 0: IP address: dynamic IP address assigned during PDP context activation - int paramVals[4]; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_NETWORK_ASSIGNED_DATA) + 16); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d", UBX_CELL_NETWORK_ASSIGNED_DATA, profile, paramTag); - - response = ubx_cell_calloc_char(minimumResponseAllocation); - if (response == nullptr) - { - free(command); - return UBX_CELL_ERROR_OUT_OF_MEMORY; - } - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, response, - UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - - if (err == UBX_CELL_ERROR_SUCCESS) - { - char *searchPtr = strstr(response, "+UPSND:"); - if (searchPtr != nullptr) - { - searchPtr += strlen("+UPSND:"); // Move searchPtr to first char - while (*searchPtr == ' ') searchPtr++; // skip spaces - scanNum = sscanf(searchPtr, "%d,%d,\"%d.%d.%d.%d\"", - &profileStore, ¶mTag, - ¶mVals[0], ¶mVals[1], ¶mVals[2], ¶mVals[3]); - } - if (scanNum != 6) - { - if (_printDebug == true) - { - _debugPort->print(F("getNetworkAssignedIPAddress: error: scanNum is ")); - _debugPort->println(scanNum); - } - free(command); - free(response); - return UBX_CELL_ERROR_UNEXPECTED_RESPONSE; - } - - IPAddress tempAddress = { (uint8_t)paramVals[0], (uint8_t)paramVals[1], - (uint8_t)paramVals[2], (uint8_t)paramVals[3] }; - *address = tempAddress; - } - - free(command); - free(response); - - return err; -} - bool UBX_CELL::isGPSon(void) { UBX_CELL_error_t err; diff --git a/src/sfe_ublox_cellular.h b/src/sfe_ublox_cellular.h index c361865..b2f74d9 100644 --- a/src/sfe_ublox_cellular.h +++ b/src/sfe_ublox_cellular.h @@ -132,11 +132,8 @@ const char UBX_CELL_FLOW_CONTROL[] = "&K"; // Flow control const char UBX_CELL_COMMAND_BAUD[] = "+IPR"; // Baud rate // ### Packet switched data services const char UBX_CELL_MESSAGE_PDP_DEF[] = "+CGDCONT"; // Packet switched Data Profile context definition -const char UBX_CELL_MESSAGE_PDP_CONFIG[] = "+UPSD"; // Packet switched Data Profile configuration -const char UBX_CELL_MESSAGE_PDP_ACTION[] = "+UPSDA"; // Perform the action for the specified PSD profile const char UBX_CELL_MESSAGE_PDP_CONTEXT_ACTIVATE[] = "+CGACT"; // Activates or deactivates the specified PDP context const char UBX_CELL_MESSAGE_ENTER_PPP[] = "D"; -const char UBX_CELL_NETWORK_ASSIGNED_DATA[] = "+UPSND"; // Packet switched network-assigned data // ### GPIO const char UBX_CELL_COMMAND_GPIO[] = "+UGPIOC"; // GPIO Configuration // ### IP @@ -172,9 +169,6 @@ const char UBX_CELL_GNSS_POWER[] = "+UGPS"; // GNSS power mana const char UBX_CELL_GNSS_ASSISTED_IND[] = "+UGIND"; // Assisted GNSS unsolicited indication const char UBX_CELL_GNSS_REQUEST_LOCATION[] = "+ULOC"; // Ask for localization information const char UBX_CELL_GNSS_GPRMC[] = "+UGRMC"; // Ask for localization information -const char UBX_CELL_GNSS_REQUEST_TIME[] = "+UTIME"; // Ask for time information from cellular modem (CellTime) -const char UBX_CELL_GNSS_TIME_INDICATION[] = "+UTIMEIND"; // Time information request status unsolicited indication -const char UBX_CELL_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG"; // Sets time configuration const char UBX_CELL_GNSS_CONFIGURE_SENSOR[] = "+ULOCGNSS"; // Configure GNSS sensor const char UBX_CELL_GNSS_CONFIGURE_LOCATION[] = "+ULOCCELL"; // Configure cellular location sensor (CellLocate®) const char UBX_CELL_AIDING_SERVER_CONFIGURATION[] = "+UGSRV"; // Configure aiding server (CellLocate®) @@ -728,12 +722,6 @@ class UBX_CELL : public Print uint8_t h, uint8_t min, uint8_t s, int8_t tz); // TZ can be +/- and is in increments of 15 minutes. -28 == 7 hours behind UTC/GMT void autoTimeZoneForBegin(bool enable = true); // Call autoTimeZoneForBegin(false) _before_ .begin if you want to disable the automatic time zone UBX_CELL_error_t autoTimeZone(bool enable); // Enable/disable automatic time zone adjustment - UBX_CELL_error_t setUtimeMode(UBX_CELL_utime_mode_t mode = UBX_CELL_UTIME_MODE_PPS, UBX_CELL_utime_sensor_t sensor = UBX_CELL_UTIME_SENSOR_GNSS_LTE); // Time mode, source etc. (+UTIME) - UBX_CELL_error_t getUtimeMode(UBX_CELL_utime_mode_t *mode, UBX_CELL_utime_sensor_t *sensor); - UBX_CELL_error_t setUtimeIndication(UBX_CELL_utime_urc_configuration_t config = UBX_CELL_UTIME_URC_CONFIGURATION_ENABLED); // +UTIMEIND - UBX_CELL_error_t getUtimeIndication(UBX_CELL_utime_urc_configuration_t *config); - UBX_CELL_error_t setUtimeConfiguration(int32_t offsetNanoseconds = 0, int32_t offsetSeconds = 0); // +UTIMECFG - UBX_CELL_error_t getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds); // Network service AT commands int8_t rssi(void); // Receive signal strength @@ -951,15 +939,7 @@ class UBX_CELL : public Print UBX_CELL_error_t configSecurityProfile(int secprofile, UBX_CELL_sec_profile_parameter_t parameter, int value); UBX_CELL_error_t setSecurityManager(UBX_CELL_sec_manager_opcode_t opcode, UBX_CELL_sec_manager_parameter_t parameter, String name, String data); - // Packet Switched Data - // Configure the PDP using +UPSD. See UBX_CELL_pdp_configuration_parameter_t for the list of parameters: protocol, APN, username, DNS, etc. - UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, int value); // Set parameters in the chosen PSD profile - UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, UBX_CELL_pdp_protocol_type_t value); // Set parameters in the chosen PSD profile - UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, String value); // Set parameters in the chosen PSD profile - UBX_CELL_error_t setPDPconfiguration(int profile, UBX_CELL_pdp_configuration_parameter_t parameter, IPAddress value); // Set parameters in the chosen PSD profile - UBX_CELL_error_t performPDPaction(int profile, UBX_CELL_pdp_actions_t action); // Performs the requested action for the specified PSD profile: reset, store, load, activate, deactivate UBX_CELL_error_t activatePDPcontext(bool status, int cid = -1); // Activates or deactivates the specified PDP context. Default to all (cid = -1) - UBX_CELL_error_t getNetworkAssignedIPAddress(int profile, IPAddress *address); // Get the dynamic IP address assigned during PDP context activation // GPS typedef enum