A simple WIP that logs data from a Grove sensor, and can send and receive information over USB and SMS.

Dependencies:   DHT DS_1337 SDFileSystem USBDevice mbed

Committer:
Joseph Radford
Date:
Sun Apr 10 15:47:33 2016 +1000
Revision:
0:2df78a4443cd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Joseph Radford 0:2df78a4443cd 1 #ifndef GPRSHANDLER_H_
Joseph Radford 0:2df78a4443cd 2 #define GPRSHANDLER_H_
Joseph Radford 0:2df78a4443cd 3
Joseph Radford 0:2df78a4443cd 4 #include "config.h"
Joseph Radford 0:2df78a4443cd 5 #ifdef ENABLE_GPRS_TESTING
Joseph Radford 0:2df78a4443cd 6 /*
Joseph Radford 0:2df78a4443cd 7 * This section of the program is currently under development. The rest of the functions
Joseph Radford 0:2df78a4443cd 8 * can run wtihout this component by using the ENABLE_GPRS_TESTING flag.
Joseph Radford 0:2df78a4443cd 9 */
Joseph Radford 0:2df78a4443cd 10
Joseph Radford 0:2df78a4443cd 11 #include "USBDevice.h" // need to include this, so that USBSerial has correct typedefs!
Joseph Radford 0:2df78a4443cd 12 #include "USBSerial.h"
Joseph Radford 0:2df78a4443cd 13 #include "AbstractHandler.h"
Joseph Radford 0:2df78a4443cd 14
Joseph Radford 0:2df78a4443cd 15 #define GPRS_BUF_LEN 20
Joseph Radford 0:2df78a4443cd 16
Joseph Radford 0:2df78a4443cd 17 #define GPRS_MESSAGE_MAXLEN 160
Joseph Radford 0:2df78a4443cd 18 #define GPRS_RECIPIENTS_MAXLEN 20
Joseph Radford 0:2df78a4443cd 19
Joseph Radford 0:2df78a4443cd 20 struct GprsRequest
Joseph Radford 0:2df78a4443cd 21 {
Joseph Radford 0:2df78a4443cd 22 char message[GPRS_MESSAGE_MAXLEN];
Joseph Radford 0:2df78a4443cd 23 char recipients[GPRS_RECIPIENTS_MAXLEN];
Joseph Radford 0:2df78a4443cd 24 };
Joseph Radford 0:2df78a4443cd 25 class UsbComms;
Joseph Radford 0:2df78a4443cd 26 class CircBuff;
Joseph Radford 0:2df78a4443cd 27
Joseph Radford 0:2df78a4443cd 28 /*!
Joseph Radford 0:2df78a4443cd 29 * \brief The GprsHandler class saves recipients and looks after incoming and outgoing messages
Joseph Radford 0:2df78a4443cd 30 *
Joseph Radford 0:2df78a4443cd 31 * Options: save recipients internally to this class.
Joseph Radford 0:2df78a4443cd 32 * Or - request sends a struct that includes recipients list and message string
Joseph Radford 0:2df78a4443cd 33 */
Joseph Radford 0:2df78a4443cd 34 class GprsHandler : public AbstractHandler
Joseph Radford 0:2df78a4443cd 35 {
Joseph Radford 0:2df78a4443cd 36 public:
Joseph Radford 0:2df78a4443cd 37 GprsHandler(MyTimers * _timer, UsbComms *_usb);
Joseph Radford 0:2df78a4443cd 38 virtual ~GprsHandler();
Joseph Radford 0:2df78a4443cd 39
Joseph Radford 0:2df78a4443cd 40 void run();
Joseph Radford 0:2df78a4443cd 41
Joseph Radford 0:2df78a4443cd 42 void setRequest(int request, void *data = 0);
Joseph Radford 0:2df78a4443cd 43
Joseph Radford 0:2df78a4443cd 44 enum request_t{
Joseph Radford 0:2df78a4443cd 45 gprsreq_GprsNone, ///< No request (for tracking what the last request was, this is initial value for that)
Joseph Radford 0:2df78a4443cd 46 gprsreq_SmsSend, ///< got a string to send to recipient(s)
Joseph Radford 0:2df78a4443cd 47 gprsreq_SetRecipients ///< got a string holding the number(s) we want to send
Joseph Radford 0:2df78a4443cd 48 };
Joseph Radford 0:2df78a4443cd 49
Joseph Radford 0:2df78a4443cd 50 private:
Joseph Radford 0:2df78a4443cd 51 enum mode_t{
Joseph Radford 0:2df78a4443cd 52 gprs_Start, ///< Set up the state machine and the hardware
Joseph Radford 0:2df78a4443cd 53
Joseph Radford 0:2df78a4443cd 54 // Restart sequence
Joseph Radford 0:2df78a4443cd 55 gprs_PowerOff, ///< Ensure module is powered down first, so we know it is in its initial state
Joseph Radford 0:2df78a4443cd 56 gprs_PowerOffWait, ///< Give module time to power down
Joseph Radford 0:2df78a4443cd 57 gprs_PowerSupplyOn, ///< Once module has fully powered down, power back up to begin using it
Joseph Radford 0:2df78a4443cd 58 gprs_PowerSupplyOnWait, ///< Give time to power on properly
Joseph Radford 0:2df78a4443cd 59 gprs_PowerSwitchOn,
Joseph Radford 0:2df78a4443cd 60 gprs_PowerSwitchOnWait,
Joseph Radford 0:2df78a4443cd 61
Joseph Radford 0:2df78a4443cd 62 gprs_CheckATReqs, ///< Check was AT request is next
Joseph Radford 0:2df78a4443cd 63
Joseph Radford 0:2df78a4443cd 64 // read AT+CMGR=?
Joseph Radford 0:2df78a4443cd 65 // write AT+CMGS=?
Joseph Radford 0:2df78a4443cd 66 gprs_PostTx, ///< Send the current buffer to SIM900 and setup timeouts
Joseph Radford 0:2df78a4443cd 67 gprs_WaitRx, ///< Wait for a response over serial
Joseph Radford 0:2df78a4443cd 68 gprs_CheckRx, ///< Check the response. Go back into state machine depending on response
Joseph Radford 0:2df78a4443cd 69
Joseph Radford 0:2df78a4443cd 70 gprs_WaitUntilNextRequest,
Joseph Radford 0:2df78a4443cd 71
Joseph Radford 0:2df78a4443cd 72 gprs_RxTimeout, ///< no response
Joseph Radford 0:2df78a4443cd 73 gprs_RxError ///< wrong response
Joseph Radford 0:2df78a4443cd 74
Joseph Radford 0:2df78a4443cd 75
Joseph Radford 0:2df78a4443cd 76 };
Joseph Radford 0:2df78a4443cd 77 mode_t mode; ///< the current state in the state machine
Joseph Radford 0:2df78a4443cd 78 mode_t returnMode; ///< the state to go back to when the expected reply returns from the SIM900
Joseph Radford 0:2df78a4443cd 79
Joseph Radford 0:2df78a4443cd 80 ///
Joseph Radford 0:2df78a4443cd 81 /// \brief The at_req enum stores what AT command should be sent/was just sent to the SIM900
Joseph Radford 0:2df78a4443cd 82 ///
Joseph Radford 0:2df78a4443cd 83 enum at_req {
Joseph Radford 0:2df78a4443cd 84 atreq_Test, ///< Ping the SIM900
Joseph Radford 0:2df78a4443cd 85 atreq_CheckSMS, ///< Check if an SMS is available
Joseph Radford 0:2df78a4443cd 86 atreq_SendSMS ///< Send an SMS, according to m_lastRequest
Joseph Radford 0:2df78a4443cd 87 };
Joseph Radford 0:2df78a4443cd 88 at_req m_atReq;
Joseph Radford 0:2df78a4443cd 89
Joseph Radford 0:2df78a4443cd 90 request_t m_lastRequest;
Joseph Radford 0:2df78a4443cd 91 GprsRequest m_lastMessage;
Joseph Radford 0:2df78a4443cd 92
Joseph Radford 0:2df78a4443cd 93 Serial * m_serial; //!< Serial port for comms with SIM900
Joseph Radford 0:2df78a4443cd 94
Joseph Radford 0:2df78a4443cd 95 DigitalOut * m_sim900_pwr; //!< pin used to enable the SIM900 power switch
Joseph Radford 0:2df78a4443cd 96 DigitalOut * m_sim900_on; //!< pin used to drive the power key
Joseph Radford 0:2df78a4443cd 97
Joseph Radford 0:2df78a4443cd 98 uint8_t m_reqReg; ///< request register
Joseph Radford 0:2df78a4443cd 99
Joseph Radford 0:2df78a4443cd 100 unsigned char txBuf[GPRS_BUF_LEN];
Joseph Radford 0:2df78a4443cd 101 uint16_t txBufLen;
Joseph Radford 0:2df78a4443cd 102 unsigned char rxBuf[GPRS_BUF_LEN];
Joseph Radford 0:2df78a4443cd 103
Joseph Radford 0:2df78a4443cd 104 UsbComms *m_usb;
Joseph Radford 0:2df78a4443cd 105 CircBuff *m_rxBuff;
Joseph Radford 0:2df78a4443cd 106
Joseph Radford 0:2df78a4443cd 107 };
Joseph Radford 0:2df78a4443cd 108
Joseph Radford 0:2df78a4443cd 109 #endif
Joseph Radford 0:2df78a4443cd 110
Joseph Radford 0:2df78a4443cd 111 #endif /* GPRSHANDLER_H_ */
Joseph Radford 0:2df78a4443cd 112