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
Handlers/GprsHandler.h@0:2df78a4443cd, 2016-04-10 (annotated)
- Committer:
- Joseph Radford
- Date:
- Sun Apr 10 15:47:33 2016 +1000
- Revision:
- 0:2df78a4443cd
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |