Demo
Dependents: A_TeseoLocationNEW A_TeseoLocation
Diff: Components/Teseo/Teseo.h
- Revision:
- 0:a77f1f1f8318
- Child:
- 3:2d568ec8da14
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Components/Teseo/Teseo.h Fri Nov 09 17:06:11 2018 +0000 @@ -0,0 +1,369 @@ +/** +******************************************************************************* +* @file Teseo.h +* @author AST / Central Lab +* @version V1.0.0 +* @date May-2017 +* @brief Teseo Location Class +* +******************************************************************************* +* @attention +* +* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> +* +* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* 3. Neither the name of STMicroelectronics nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************** +*/ + +#ifndef __TESEO_H__ +#define __TESEO_H__ + +#include "mbed.h" +#include "GPSProviderImplBase.h" + +#include "TeseoConfig.h" +#include "NMEAParser.h" + +#define STD_UART_BAUD 9600// 9600 +#define FWU_UART_BAUD 115200 +#define TESEO_I2C_ADDRESS 0x3A +#define POWERON_STABLE_SIGNAL_DELAY_MS 150 + +/** Indicates the outputted location information */ +#define LOC_OUTPUT_LOCATION (1) +#define LOC_OUTPUT_NMEA (2) +#define LOC_OUTPUT_PSTM (3) + +#if 1 +#define TESEO_LOG_INFO(...) +#else +#define TESEO_LOG_INFO(...) { \ + if (_serialDebug != NULL) { \ + (_serialDebug->printf(__VA_ARGS__)); \ + } \ + } +#endif + +/** + * @brief Constant that indicates the maximum number of nmea messages to be processed. + */ +#define NMEA_MSGS_NUM 6 //Note: update this constant coherently to eMsg enum type + +/** + * @brief Constant that indicates the maximum number of proprietary nmea messages to be processed. + */ +#define PSTM_NMEA_MSGS_NUM 5 //Note: update this constant coherently to ePSTMsg enum type + +/** + * @brief Constant that indicates the maximum number of positions that can be stored. + */ +#define MAX_STOR_POS 64 + +/** + * @brief Constant that indicates the lenght of the buffer that stores the GPS data read by the GPS expansion. + */ + +#define TESEO_RXBUF_LEN 256//90 +#define TESEO_RXQUEUE_LEN 8 + +/** + * @brief Enumeration structure that containes the two success states of a process + */ +typedef enum { + TESEO_STATUS_SUCCESS = 0, /**< Success status */ + TESEO_STATUS_FAILURE = 1 /**< Failure status */ +} eStatus; + +/** Location event definitions */ +typedef enum { + /** Start result event */ + TESEO_LOC_EVENT_START_RESULT, + /** Stop result event */ + TESEO_LOC_EVENT_STOP_RESULT, +} eTeseoLocEventType; + +/** Teseo Location state */ +typedef enum { + TESEO_LOC_STATE_IDLE, + TESEO_LOC_STATE_RUN, + TESEO_LOC_STATE_FEATURE, + TESEO_LOC_STATE_DEBUG +} eTeseoLocState; + +/** + * @brief Enumeration structure that containes the two states of a debug process + */ +typedef enum { + DEBUG_OFF = 0, /**< In this case, nothing will be printed on the console (nmea strings, positions and so on) */ + DEBUG_ON = 1 /**< In this case, nmea strings and just acquired positions will be printed on the console */ +} eDebugState; + +/** + * @brief Data structure that contains the driver informations + */ +typedef struct TeseoData { + eDebugState debug; /**< Debug status */ + GPGGA_Infos gpgga_data; /**< $GPGGA Data holder */ + GNS_Infos gns_data; /**< $--GNS Data holder */ + GPGST_Infos gpgst_data; /**< $GPGST Data holder */ + GPRMC_Infos gprmc_data; /**< $GPRMC Data holder */ + GSA_Infos gsa_data; /**< $--GSA Data holder */ + GSV_Infos gsv_data; /**< $--GSV Data holder */ + + Geofence_Infos geofence_data; /**< Geofence Data holder */ + Odometer_Infos odo_data; /**< Odometer Data holder */ + Datalog_Infos datalog_data; /**< Datalog Data holder */ + + Ack_Info ack; /**< */ + +} tTeseoData; + +/** Application register this out callback function and Teseo class will pass outputted information to application */ +typedef void (*teseo_app_output_callback)(uint32_t msgId, uint32_t msgType, tTeseoData *pData); +/** Application register this event callback function and Teseo class will pass internal processing event to application */ +typedef void (*teseo_app_event_callback)(eTeseoLocEventType event, uint32_t data); + +class Teseo : public GPSProviderImplBase { +public: + + typedef enum { + TEST, + GETSWVER, + FORCESTANDBY, + RFTESTON, + RFTESTOFF, + LOWPOWER, + FWUPDATE + } eCmd; + + /** NMEA messages types */ + typedef enum { + GPGGA, + GNS, + GPGST, + GPRMC, + GSA, + GSV, + } eMsg; + + /** NMEA proprietary messages types */ + typedef enum { + PSTMGEOFENCE, + PSTMODO, + PSTMDATALOG, + PSTMSGL, + PSTMSAVEPAR + } ePSTMsg; + +private: + + eTeseoLocState _locState; + + DigitalOut _loc_led2; + DigitalOut _reset; + DigitalOut _pps; + DigitalOut _wakeup; + PinName _uartRx; + PinName _uartTx; + + Serial *_uart; + Serial *_serialDebug; + I2C *_i2c; + + tTeseoData pData; + GPGGA_Infos stored_positions[MAX_STOR_POS]; + + int FwWaitAck(); + + Thread *serialStreamThread; + + /** + * Command string + */ + char _teseoCmd[TESEO_RXBUF_LEN]; + + /** + * Message struct + */ + struct _teseoMsg { + uint8_t len; + uint8_t buf[TESEO_RXBUF_LEN]; + }; + +public: + + /** Constructor: Teseo + * Create the Teseo, accept specified configuration + * + * @param [in] resetPin + * GPIO pin to control location chip reset. + * @param [in] wakeupPin + * GPIO pin to detect if the chip is still wakeup. + * @param [in] ppsPin + * GPIO pin... . + * @param [in] uartTxPin + * GPIO pin for serial Tx channel between the host and the GNSS controller. + * @param [in] uartRxPin + * GPIO pin for serial Rx channel between the host and the GNSS controller. + * @param [in] serialDebug + * The debug port for diagnostic messages; can be NULL. + */ + Teseo(PinName resetPin, + PinName wakeupPin, + PinName ppsPin, + PinName uartTxPin, + PinName uartRxPin, + Serial *serialDebug = NULL); + + /** Constructor: Teseo + * Create the Teseo, accept specified configuration + * + * @param [in] resetPin + * GPIO pin to control location chip reset. + * @param [in] wakeupPin + * GPIO pin to detect if the chip is still wakeup. + * @param [in] ppsPin + * GPIO pin... . + * @param [in] uartTxPin + * GPIO pin for serial Tx channel between the host and the GNSS controller. + * @param [in] uartRxPin + * GPIO pin for serial Rx channel between the host and the GNSS controller. + * @param [in] i2cBus + * I2C Bus not supported yet. + * @param [in] serialDebug + * The debug port for diagnostic messages; can be NULL. + */ + Teseo(PinName resetPin, + PinName wakeupPin, + PinName ppsPin, + PinName uartTxPin, + PinName uartRxPin, + I2C *i2cBus, + Serial *serialDebug = NULL); + + /** Register output callback and event callback functions + * @param app_output_cb Teseo class output the location and satellite information to application + * @param app_event_cb Teseo class output the start and stop result to application + */ + void TeseoLocRegOutput(teseo_app_output_callback app_output_cb, teseo_app_event_callback app_event_cb); + + void SendCommand(Teseo::eCmd c); + void SendCommand(char *cmd); + + int EnableLowPower(); + + void ReadSentence(Teseo::eMsg msg); + + eStatus WakeStatus(void){ + return _wakeup.read() ? TESEO_STATUS_SUCCESS : TESEO_STATUS_FAILURE; + } + + void ReadProcess(void); + +private: + + virtual bool setPowerMode(GPSProvider::PowerMode_t pwrMode); + virtual void start(void); + virtual void stop(void); + virtual void process(void); + virtual uint32_t ioctl(uint32_t command, void *arg); + virtual void lpmGetImmediateLocation(void); + virtual void reset(void); + virtual const GPSProvider::LocationUpdateParams_t *getLastLocation(void) const; + + gps_provider_error_t cfgMessageList(int level); + gps_provider_error_t saveConfigParams(void); + + /** Set NMEA stream verbosity */ + virtual void setVerboseMode(int level); + + /** Geofencing */ + virtual bool isGeofencingSupported(void); + virtual gps_provider_error_t enableGeofence(void); + virtual gps_provider_error_t configGeofences(GPSGeofence *geofences[], unsigned geofenceCount); + virtual gps_provider_error_t geofenceReq(void); + gps_provider_error_t cfgGeofenceCircle(void); + + /** Datalogging */ + virtual bool isDataloggingSupported(void); + virtual gps_provider_error_t enableDatalog(void); + virtual gps_provider_error_t configDatalog(GPSDatalog *datalog); + virtual gps_provider_error_t startDatalog(void); + virtual gps_provider_error_t stopDatalog(void); + virtual gps_provider_error_t eraseDatalog(void); + virtual gps_provider_error_t logReqStatus(void); + virtual gps_provider_error_t logReqQuery(GPSProvider::LogQueryParams_t &logReqQuery); + + /* Odometer */ + virtual bool isOdometerSupported(void); + virtual gps_provider_error_t enableOdo(void); + virtual gps_provider_error_t startOdo(unsigned alarmDistance); + virtual gps_provider_error_t stopOdo(void); + virtual gps_provider_error_t resetOdo(void); + + void _InitUART(int br = STD_UART_BAUD); + void _ResetFast(Serial *serialDebug = NULL); + void _Reset(Serial *serialDebug = NULL); + void _SendString(char *buf, int len); + int _WakeUp(); + int _CRC(char *buf, int size); + int _CheckI2C(); + /** + * @brief This function gets a chunck of NMEA messages + * @param msg NMEA message to search for + * @retval eStatus TESEO_STATUS_SUCCESS if the parse process goes ok, TESEO_FAILURE if it doesn't + */ + eStatus _GetMsg(Teseo::eMsg msg, uint8_t *buffer); + /** + * @brief This function gets a chunck of PSTM NMEA messages + * @param msg PSTM NMEA message to search for + * @retval eStatus TESEO_STATUS_SUCCESS if the parse process goes ok, TESEO_FAILURE if it doesn't + */ + void _GetPSTMsg(Teseo::ePSTMsg msg, uint8_t *buffer); + void _GetLocationMsg(Teseo::eMsg msg, uint8_t *buffer); + + void _LocLed2Set(void){ + _loc_led2.write(1); + } + void _LocLed2Reset(void){ + _loc_led2.write(0); + } + + void outputHandler(uint32_t msgId, uint32_t msgType, tTeseoData *pData); + void eventHandler(eTeseoLocEventType event, uint32_t data); + + teseo_app_output_callback appOutCb; + teseo_app_event_callback appEventCb; + + MemoryPool<struct _teseoMsg, TESEO_RXQUEUE_LEN> mpool; + Queue<struct _teseoMsg, TESEO_RXQUEUE_LEN> queue; +}; + +#endif /*__TESEO_H__*/