diff --git a/src/sfe_lara_r6.cpp b/src/sfe_lara_r6.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/sfe_lara_r6.h b/src/sfe_lara_r6.h index 8349645..08e9736 100644 --- a/src/sfe_lara_r6.h +++ b/src/sfe_lara_r6.h @@ -5,12 +5,12 @@ #include "sfe_ublox_cellular_voice.h" // Base LARA-R6 class -class LARA_R6: virtual public UBX_CELL +class LARA_R6: public UBX_CELL { }; -class LARA_R6001: public LARA_R6, public UBX_CELL_VOICE +class LARA_R6001: public LARA_R6, public UBX_CELL_VOICE { }; @@ -20,7 +20,7 @@ class LARA_R6001D: public LARA_R6 }; -class LARA_R6401: public LARA_R6, public UBX_CELL_VOICE +class LARA_R6401: public LARA_R6, public UBX_CELL_VOICE { }; @@ -30,7 +30,7 @@ class LARA_R6401D: public LARA_R6 }; -class LARA_R6801_00B: public LARA_R6, public UBX_CELL_VOICE +class LARA_R6801_00B: public LARA_R6, public UBX_CELL_VOICE { }; diff --git a/src/sfe_sara_r5.cpp b/src/sfe_sara_r5.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/sfe_ublox_cellular.h b/src/sfe_ublox_cellular.h index 032add5..f59062d 100644 --- a/src/sfe_ublox_cellular.h +++ b/src/sfe_ublox_cellular.h @@ -1024,6 +1024,12 @@ class UBX_CELL : public Print UBX_CELL_error_t sendCustomCommandWithResponse(const char *command, const char *expectedResponse, char *responseDest, unsigned long commandTimeout = UBX_CELL_STANDARD_RESPONSE_TIMEOUT, bool at = true); + // Send command with an expected (potentially partial) response, store entire response + UBX_CELL_error_t sendCommandWithResponse(const char *command, const char *expectedResponse, + char *responseDest, unsigned long commandTimeout, int destSize = minimumResponseAllocation, bool at = true); + + char *ubx_cell_calloc_char(size_t num); + protected: HardwareSerial *_hardSerial; #ifdef UBX_CELL_SOFTWARE_SERIAL_ENABLED @@ -1091,10 +1097,6 @@ class UBX_CELL : public Print // Wait for an expected response (don't send a command) UBX_CELL_error_t waitForResponse(const char *expectedResponse, const char *expectedError, uint16_t timeout); - // Send command with an expected (potentially partial) response, store entire response - UBX_CELL_error_t sendCommandWithResponse(const char *command, const char *expectedResponse, - char *responseDest, unsigned long commandTimeout, int destSize = minimumResponseAllocation, bool at = true); - // Send a command -- prepend AT if at is true void sendCommand(const char *command, bool at); @@ -1118,8 +1120,6 @@ class UBX_CELL : public Print UBX_CELL_error_t autobaud(unsigned long desiredBaud); - char *ubx_cell_calloc_char(size_t num); - bool processURCEvent(const char *event); void pruneBacklog(void); diff --git a/src/sfe_ublox_cellular_voice.cpp b/src/sfe_ublox_cellular_voice.cpp deleted file mode 100644 index 951dc98..0000000 --- a/src/sfe_ublox_cellular_voice.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "sfe_ublox_cellular_voice.h" - -UBX_CELL_error_t UBX_CELL_VOICE::dial(String number) -{ - char *command; - char *numberCStr; - UBX_CELL_error_t err; - - numberCStr = ubx_cell_calloc_char(number.length() + 1); - if (numberCStr == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - number.toCharArray(numberCStr, number.length() + 1); - - command = ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_DIAL) + strlen(numberCStr) + 3); - if (command != nullptr) - { - // Heads up! The dial command is one of the only commands that requires a - // semicolon at the end of it! - sprintf(command, "%s=%s;", UBX_CELL_COMMAND_DIAL, numberCStr); - - err = sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK, - nullptr, UBX_CELL_10_SEC_TIMEOUT); - - free(command); - } - else - { - err = UBX_CELL_ERROR_OUT_OF_MEMORY; - } - - free(numberCStr); - - return err; -} - -UBX_CELL_error_t UBX_CELL_VOICE::answer(void) -{ - return sendCommandWithResponse(UBX_CELL_COMMAND_ANSWER, UBX_CELL_RESPONSE_OK_OR_ERROR, - nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); -} - -UBX_CELL_error_t UBX_CELL_VOICE::hangUp(void) -{ - return sendCommandWithResponse(UBX_CELL_COMMAND_HANG_UP, UBX_CELL_RESPONSE_OK_OR_ERROR, - nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); -} - -UBX_CELL_error_t UBX_CELL_VOICE::playAudioResource(uint8_t audio_resource, uint8_t tone_id, uint8_t nof_repeat) -{ - UBX_CELL_error_t err; - char *command; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_PLAY_AUDIO) + 13); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d,%d", UBX_CELL_COMMAND_PLAY_AUDIO, audio_resource, tone_id, nof_repeat); - - 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_VOICE::stopAudioResource(uint8_t audio_resource) -{ - UBX_CELL_error_t err; - char *command; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_STOP_AUDIO) + 5); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d", UBX_CELL_COMMAND_STOP_AUDIO, audio_resource); - - 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_VOICE::generateToneFreq(uint16_t frequency, uint16_t duration, uint8_t volume) -{ - UBX_CELL_error_t err; - char *command; - char response[] = "\r\nOK\r\n\r\n+UUTGN: 0\r\n"; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_GENERATE_TONE) + 15); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=%d,%d,%d", UBX_CELL_COMMAND_GENERATE_TONE, frequency, duration, volume); - - err = sendCommandWithResponse(command, response, - nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - free(command); - return err; -} - -UBX_CELL_error_t UBX_CELL_VOICE::generateToneDTMF(char dtmf_character, uint16_t duration, uint8_t volume) -{ - UBX_CELL_error_t err; - char *command; - char response[] = "\r\nOK\r\n\r\n+UUTGN: 0\r\n"; - - command = ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_GENERATE_TONE) + 14); - if (command == nullptr) - return UBX_CELL_ERROR_OUT_OF_MEMORY; - sprintf(command, "%s=\"%c\",%d,%d", UBX_CELL_COMMAND_GENERATE_TONE, dtmf_character, duration, volume); - - err = sendCommandWithResponse(command, response, - nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); - free(command); - return err; -} \ No newline at end of file diff --git a/src/sfe_ublox_cellular_voice.h b/src/sfe_ublox_cellular_voice.h index 7b605e1..46caa65 100644 --- a/src/sfe_ublox_cellular_voice.h +++ b/src/sfe_ublox_cellular_voice.h @@ -11,16 +11,120 @@ const char UBX_CELL_COMMAND_STOP_AUDIO[] = "+USAR"; // Stop audio resource const char UBX_CELL_COMMAND_GENERATE_TONE[] = "+UTGN"; // Tone generator // Base class for any modules supporting voice calls -class UBX_CELL_VOICE: virtual public UBX_CELL +template +class UBX_CELL_VOICE { public: - UBX_CELL_error_t dial(String number); - UBX_CELL_error_t answer(void); - UBX_CELL_error_t hangUp(void); - UBX_CELL_error_t playAudioResource(uint8_t audio_resource, uint8_t tone_id, uint8_t nof_repeat); - UBX_CELL_error_t stopAudioResource(uint8_t audio_resource); - UBX_CELL_error_t generateToneFreq(uint16_t frequency, uint16_t duration, uint8_t volume); - UBX_CELL_error_t generateToneDTMF(char dtmf_character, uint16_t duration, uint8_t volume); + UBX_CELL_error_t dial(String number) + { + char *command; + char *numberCStr; + UBX_CELL_error_t err; + + numberCStr = static_cast(this)->ubx_cell_calloc_char(number.length() + 1); + if (numberCStr == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + number.toCharArray(numberCStr, number.length() + 1); + + command = static_cast(this)->ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_DIAL) + strlen(numberCStr) + 3); + if (command != nullptr) + { + // Heads up! The dial command is one of the only commands that requires a + // semicolon at the end of it! + sprintf(command, "%s=%s;", UBX_CELL_COMMAND_DIAL, numberCStr); + + err = static_cast(this)->sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK, + nullptr, UBX_CELL_10_SEC_TIMEOUT); + + free(command); + } + else + { + err = UBX_CELL_ERROR_OUT_OF_MEMORY; + } + + free(numberCStr); + + return err; + } + + UBX_CELL_error_t answer(void) + { + return static_cast(this)->sendCommandWithResponse(UBX_CELL_COMMAND_ANSWER, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + } + + UBX_CELL_error_t hangUp(void) + { + return static_cast(this)->sendCommandWithResponse(UBX_CELL_COMMAND_HANG_UP, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + } + + UBX_CELL_error_t playAudioResource(uint8_t audio_resource, uint8_t tone_id, uint8_t nof_repeat) + { + UBX_CELL_error_t err; + char *command; + + command = static_cast(this)->ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_PLAY_AUDIO) + 13); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d,%d", UBX_CELL_COMMAND_PLAY_AUDIO, audio_resource, tone_id, nof_repeat); + + err = static_cast(this)->sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; + } + + UBX_CELL_error_t stopAudioResource(uint8_t audio_resource) + { + UBX_CELL_error_t err; + char *command; + + command = static_cast(this)->ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_STOP_AUDIO) + 5); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d", UBX_CELL_COMMAND_STOP_AUDIO, audio_resource); + + err = static_cast(this)->sendCommandWithResponse(command, UBX_CELL_RESPONSE_OK_OR_ERROR, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; + } + + UBX_CELL_error_t generateToneFreq(uint16_t frequency, uint16_t duration, uint8_t volume) + { + UBX_CELL_error_t err; + char *command; + char response[] = "\r\nOK\r\n\r\n+UUTGN: 0\r\n"; + + command = static_cast(this)->ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_GENERATE_TONE) + 15); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=%d,%d,%d", UBX_CELL_COMMAND_GENERATE_TONE, frequency, duration, volume); + + err = static_cast(this)->sendCommandWithResponse(command, response, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; + } + + UBX_CELL_error_t generateToneDTMF(char dtmf_character, uint16_t duration, uint8_t volume) + { + UBX_CELL_error_t err; + char *command; + char response[] = "\r\nOK\r\n\r\n+UUTGN: 0\r\n"; + + command = static_cast(this)->ubx_cell_calloc_char(strlen(UBX_CELL_COMMAND_GENERATE_TONE) + 14); + if (command == nullptr) + return UBX_CELL_ERROR_OUT_OF_MEMORY; + sprintf(command, "%s=\"%c\",%d,%d", UBX_CELL_COMMAND_GENERATE_TONE, dtmf_character, duration, volume); + + err = static_cast(this)->sendCommandWithResponse(command, response, + nullptr, UBX_CELL_STANDARD_RESPONSE_TIMEOUT); + free(command); + return err; + } }; #endif \ No newline at end of file