GSM module
This document details the implementation of the GSM module within the PaxOS operating system. The module handles communication with a GSM/GPRS modem, enabling functionalities like sending/receiving SMS messages, making/receiving calls, and managing MMS.
1. contacts.cpp
/ contacts.hpp
This module manages contact information. Contacts are stored in a JSON file (/apps/contacts/list.json
) and loaded into memory for quick access.
Data Structures
Contacts::contact
: Represents a single contact withname
(std::string) andphone
(std::string) fields.
Functions
Contacts::load()
: Loads contacts from thelist.json
file into thecontactList
vector. Handles JSON parsing errors.Contacts::save()
: Saves thecontactList
to thelist.json
file in JSON format.Contacts::listContacts()
: Returns a copy of thecontactList
.Contacts::addContact(contact c)
: Adds a new contact to thecontactList
.Contacts::deleteContact(std::string name)
: Deletes a contact with the given name from thecontactList
.Contacts::editContact(std::string name, contact c)
: Edits the contact with the given name, updating its information with the providedcontact
object.Contacts::getContact(std::string name)
: Returns thecontact
object associated with the given name. Returns an empty contact if not found.Contacts::getByNumber(std::string number)
: Returns thecontact
object associated with the given phone number. Returns an empty contact if not found.
2. conversation.cpp
/ conversation.hpp
This module handles conversation data, including loading and saving messages for each conversation.
Data Structures
Conversations::Message
: Represents a single message withmessage
(std::string),who
(bool indicating sender - false for self, true for other), anddate
(std::string) fields.Conversations::Conversation
: Represents a conversation with a specificnumber
(std::string) and a vector ofmessages
(std::vector).
Functions
Conversations::loadConversation(const storage::Path &filePath, Conversation &conv)
: Loads a conversation from the specified JSON file. Handles file errors and JSON parsing exceptions.Conversations::saveConversation(const storage::Path &filePath, const Conversation &conv)
: Saves a conversation to the specified JSON file. Limits the number of saved messages toMAX_MESSAGES
(40), keeping the most recent ones. Creates the necessary directories if they don't exist.
3. gsm.cpp
/ gsm.hpp
This module provides the core GSM functionality, interacting directly with the GSM modem. It manages calls, SMS, MMS, network status, and battery level.
Constants
BAUDRATE
: Default baud rate for serial communication (921600).MESSAGES_LOCATION
: Directory for storing message data (apps/messages/data
).MESSAGES_IMAGES_LOCATION
: Directory for storing MMS images (apps/messages/images
).MESSAGES_NOTIF_LOCATION
: File storing unread message notifications (apps/messages/unread.txt
).MAX_MESSAGES
: Maximum number of messages stored per conversation (40).
Data Structures
GSM::Request
: Represents a request to be executed by the GSM module, with afunction
(std::function) and a priority
(enum).GSM::Key
: Represents a key string to watch for in the GSM modem's responses, with akey
(std::string) and afunction
(std::function) to execute when the key is found. GSM::State
: Represents the current state of the GSM module (call state, call failure, calling number).GSM::Message
: Represents an SMS message, withnumber
,message
, anddate
.GSM::ExternalEvents
: Namespace containing callback functions for incoming calls, new messages, and message errors.GSM::Stream::Chunk
: Used for streaming MMS data; contains a data pointer and size. (ESP_PLATFORM only)
Functions
GSM::init()
: Initializes the GSM modem, including setting baud rate and handling modem power-on (ESP_PLATFORM specific).GSM::reInit()
: Re-initializes the serial communication after clock speed changes.GSM::download(uint64_t timeout = 50)
: Reads data from the GSM modem's serial port with a timeout.GSM::send(const std::string &message, const std::string &answerKey, uint64_t timeout = 200)
: Sends a command to the GSM modem and waits for a specific response key. Returns the modem's full response.GSM::appendRequest(Request request)
: Adds a request to the queue of requests to be processed by the GSM module.GSM::process()
: Processes received data, checking for key strings and executing associated functions.GSM::checkRequest()
: Executes pending requests in the queue, prioritizing high-priority requests.GSM::onRinging()
: Handles incoming call events, updating the module's state.GSM::onHangOff()
: Handles call hang-up events.GSM::onMessage()
: Handles incoming SMS/MMS messages. Decodes PDUs, saves messages to conversations, and triggers theonNewMessage
callback.GSM::sendMessage(const std::string &number, const std::string &message)
: Sends an SMS message. Saves the sent message to the conversation history.GSM::newMessage(std::string number, std::string message)
: Queues a message to be sent.GSM::sendCall(const std::string &number)
: Initiates a call to the specified number.GSM::newCall(std::string number)
: Queues a call to be made.GSM::endCall()
: Ends the current call.GSM::acceptCall()
: Accepts an incoming call.GSM::rejectCall()
: Rejects an incoming call.GSM::getVoltage()
: Retrieves the battery voltage.GSM::getBatteryLevel()
: Calculates and returns the battery level (0.0 - 1.0) based on voltage.GSM::updateHour()
: Updates the current time from the GSM modem.GSM::getHour()
: Queues a request to update the time.GSM::getNetworkStatus()
: Returns the network signal quality.GSM::updateNetworkQuality()
: Updates the network signal quality.GSM::getNetworkQuality()
: Queues a request to update the network quality.GSM::isFlightMode()
: Checks if flight mode is enabled.GSM::setFlightMode(bool mode)
: Sets the flight mode.GSM::run()
: Main loop of the GSM module. Handles initialization, request processing, and event handling.GSM::getHttpMMS(std::string number, std::string url)
: Downloads and processes MMS messages (ESP_PLATFORM only).
4. message.cpp
/ message.hpp
Provides functions for loading and saving messages from/to JSON files. This module seems redundant given the similar functionality in conversation.cpp/hpp
, and its usage isn't clear within the provided code.
Data Structures
Message::Message
: Same structure asConversations::Message
.
Functions
Message::loadMessages(const std::string& filePath, std::vector<Message>& messages)
: Loads messages from a JSON file.Message::saveMessages(const std::string& filePath, const std::vector<Message>& messages)
: Saves messages to a JSON file.
5. pdu.cpp
/ pdu.hpp
This module handles the decoding of PDU-formatted messages received from the GSM modem.
Data Structures
PDU
: Contains the decoded information from a PDU string:sender
(std::string),message
(std::string),url
(std::string for MMS URLs), andtype
(enum PDU_type: SMS, MMS, UNKNOWN).
Functions
decodePDU(std::string pdu)
: Decodes a PDU string and returns aPDU
object containing the extracted information (sender, message, URL, type).