Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
Diff: main.cpp
- Revision:
- 8:cd489b7c49a0
- Parent:
- 7:1d890cab51bd
- Child:
- 10:1b37e3b41947
--- a/main.cpp Sun Aug 20 15:16:24 2017 +0000 +++ b/main.cpp Wed Aug 22 13:03:00 2018 +0000 @@ -1,548 +1,116 @@ +/* + * MISNet + * + * Main TERMINAL VERSION HALF DUPLEX + * + * Created on: August 17, 2018 Author: Francis CHATAIN + * + */ + #include "mbed.h" -#include "radio.h" #include "sx1280-hal.h" #include "stdio.h" -#include "XNucleoIKS01A2.h" - -#include "DmTftHX8353C.h" -#include "DmTftS6D0164.h" -#include "DmTftIli9325.h" -#include "DmTftIli9341.h" -#include "DmTftSsd2119.h" -#include "DmTftRa8875.h" - -#define FIRMWARE_VERSION ( ( char* )"Firmware Version: 1.0" ) // display firmware version on RS232 -#define MODE_LORA // Lora modulation -#define RF_FREQUENCY 2400000000UL // HzNominal frequency -#define TX_OUTPUT_POWER -18 // Output power in dBm [-18..+13] dBm +#include <string> -typedef enum // States of the application -{ - APP_LOWPOWER, - APP_RX, - APP_RX_TIMEOUT, - APP_RX_ERROR, - APP_TX, - APP_TX_TIMEOUT, -}AppStates_t; - -#define ID_TERMINAL1 '1' -#define ID_TERMINAL2 '2' -#define ID_GATEWAY '1' - -float temperature = 0.0 ; -float humidite = 0.0 ; - -float etalonTemp1 = 6.3F ; -float etalonTemp2 = 8.7F ; +#include "main.h" +#include "Application.h" -#define log(...) printf(__VA_ARGS__) - -#define MESSAGESIZE 34 // Defines the size of the token defining message type in the payload -char Message[MESSAGESIZE] = "MSG DATA IOT TERMINAL"; - -int cptr = 0 ; - -#define BUFFER_SIZE 34 // Payload size -uint8_t BufferSize = BUFFER_SIZE; // Size of the buffer -uint8_t Buffer[BUFFER_SIZE]; // Buffer - -AppStates_t AppState = APP_LOWPOWER; // State of the application - -int8_t RssiValue = 0; -int8_t SnrValue = 0; - -void OnTxDone ( void ); // Function to be executed on Radio Tx Done event -void OnRxDone ( void ); // Function to be executed on Radio Rx Done event -void OnTxTimeout ( void ); // Function executed on Radio Tx Timeout event -void OnRxTimeout ( void ); // Function executed on Radio Rx Timeout event -void OnRxError ( IrqErrorCode_t ); // Function executed on Radio Rx Error event +using namespace std; -RadioCallbacks_t callbacks = // All the callbacks are stored in a structure -{ - &OnTxDone, // txDone - &OnRxDone, // rxDone - NULL, // syncWordDone - NULL, // headerDone - &OnTxTimeout, // txTimeout - &OnRxTimeout, // rxTimeout - &OnRxError, // rxError - NULL, // rangingDone - NULL, // cadDone -}; - -// mosi, miso, sclk, nss, busy, dio1, dio2, dio3, rst, callbacks... -SX1280Hal Radio ( D11 , D12 , D13 , D7 , D3 , D5 , NC , NC , A0 , &callbacks ); +// INSTANCE of APPLICATION OBJECT -DigitalOut ANT_SW ( A3 ) ; -DigitalOut TxLed ( A4 ) ; -DigitalOut RxLed ( A5 ) ; -DigitalOut F_CS ( D6 ) ; // MBED description of pin -DigitalOut SD_CS ( D8 ) ; // MBED description of pin - -#define TX_TIMEOUT_VALUE 100 // ms Number of tick size steps for tx timeout -#define RX_TIMEOUT_VALUE 100 // ms Number of tick size steps for rx timeout -#define RX_TIMEOUT_TICK_SIZE RADIO_TICK_SIZE_1000_US // Size of ticks (used for Tx and Rx timeout) - -uint16_t RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in rx mode -uint16_t TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in tx mode - -PacketParams_t PacketParams; // Locals parameters and status for radio API -PacketStatus_t PacketStatus; // NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING - -ModulationParams_t modulationParams; +Application app ; // Core of application start also -/* Instantiate the expansion board */ -static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5); - -/* Retrieve the composing elements of the expansion board */ -static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer; -static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor; -static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor; -static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro; -static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer; - -uint8_t id1, id2, id3, id4, id5, id6, id7; -float valueTH1, valueTH2, valueTP1, valueTP2; -float OldvalueTH1, OldvalueTH2, OldvalueTP1, OldvalueTP2; -char buffer1[32], buffer2[32], buffer3[32], buffer4[32]; -int32_t axesA[3], axesM[3], axesG1[3], axesG2[3]; -int32_t OldaxesA[3], OldaxesM[3], OldaxesG1[3], OldaxesG2[3]; +//****************************************************************************** +// Watch Dog functionnality +//****************************************************************************** +uint16_t TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening = 0L ; -static char *print_double ( char* str, double v, int decimalDigits=2) ; -void baud ( int baudrate ) ; -void sendRadio ( char TERMINAL, char GATEWAY, float value1, float value2) ; - - -DmTftIli9341 tft(D10, D9, D11, D12, D13); /* DmTftIli9341(PinName cs, PinName dc, PinName mosi, PinName miso, PinName clk) DM_TFT28_105 */ - -int bmpWidth, bmpHeight; -uint8_t bmpImageoffset; - -/****************************************************************************** - * Global variables - *****************************************************************************/ - -extern uint8_t dmlogo[]; - -/****************************************************************************** - * Local functions - *****************************************************************************/ +LowPowerTicker wakeUpPayload ; // normal wake up +void wakeUpPayloadCallback (void) ; -// LITTLE ENDIAN! -uint16_t read16(uint8_t *src) -{ - uint16_t d; - uint8_t b; - b = *src; - d = *(src+1); - d <<= 8; - d |= b; - return d; -} +LowPowerTicker wakeUpGoodhealth ; // GoodHealth wake up +void wakeUpGoodhealthCallback (void) ; -// LITTLE ENDIAN! -uint32_t read32(uint8_t *src) -{ - uint32_t d; - uint16_t b; - - b = read16(src); - d = read16(src+2); - d <<= 16; - d |= b; - return d; -} +LowPowerTicker wakeUpSynchro ; // Synchro wake up (Mode B) +void wakeUpSynchroCallback (void) ; -void drawBmpFromFlash(int x, int y) -{ - uint16_t pos = bmpImageoffset; - - uint16_t p; // pixel - uint8_t g, b; - int i, j; // line, column - - for(i=bmpHeight; i>0; i--) { - for(j=0; j<bmpWidth; j++) { - b = *(dmlogo+pos++); - g = *(dmlogo+pos++); - p = *(dmlogo+pos++); +LowPowerTicker wakeUpListening ; // Listening wake up (Mode C) +void wakeUpListeningCallback (void) ; - p >>= 3; - p <<= 6; - - g >>= 2; - p |= g; - p <<= 5; - - b >>= 3; - p |= b; - - // write out the 16 bits of color - tft.setPixel(j, i+y, p); - } - } -} +void setup () ; // Init Terminal +void loop () ; // Main Loop -int bmpReadHeader() { - uint32_t fileSize; - uint32_t headerSize; - uint16_t bmpDepth; - uint16_t pos = 0; - log("reading bmp header\r\n"); - log("Magic byte is: %d \r\n", read16(dmlogo)); - - - if (read16(dmlogo) !=0x4D42){ // read magic byte - log("Magic byte not found\r\n"); - return false; - } - - pos += 2; - - // read file size - fileSize = read32(dmlogo+pos); - log("filesize is: %d \r\n", fileSize); - log(""); - pos += 4; - - pos += 4; // Skip creator bytes - - bmpImageoffset = read32(dmlogo+pos); - pos += 4; - - // read DIB header - headerSize = read32(dmlogo+pos); - pos +=4; - bmpWidth = read32(dmlogo+pos); - pos += 4; - bmpHeight = read32(dmlogo+pos); - pos += 4; - - //if (bmpHeight == -40) bmpHeight = 40 ; - - - log("Image size: %d\r\n", fileSize); - log("Image offset: %d\r\n", bmpImageoffset); - log("Header size: %d\r\n", headerSize); - log("Image width: %d\r\n", bmpWidth ); - log("Image height: %d\r\n", bmpHeight ); - - - if (read16(dmlogo+pos) != 1){ - // number of color planes must be 1 - return false; - } - - pos += 2; - - bmpDepth = read16(dmlogo+pos); - pos +=2; - log("Bitdepth: %d\r\n", bmpDepth); - - - if (read16(dmlogo+pos) != 0) { - // compression not supported! - return false; - } - - pos += 2; // Should really be 2?? - - return true; -} +// ============================================================================ Main +int main( ) { setup () ; loop () ; } +// ============================================================================ -void updateDisplay (float temp1, float hum, float temp2, float press, int cptr1, int cptr2) ; -void updateLed (bool led1, bool led2) ; - -/* Specify serial datarate for UART debug output */ -void baud ( int baudrate ) { Serial s( USBTX, USBRX ); s.baud( baudrate );} - - char bufferDisplay[50] ; - - int IDTerminal = 1 ; - int IDGateway = 1 ; - float temp1 = 20.0F ; - float temp2 = 20.0F ; - float hum = 50.0F ; - int press = 1000 ; - +// ============================================================================ Setup void setup () { - baud (115200); - printf( "\n\n\r SX1280 Terminal IoT LORA MODULATION 2.4GHz (%s)\n\n\r", FIRMWARE_VERSION ); - - F_CS = 1 ; - SD_CS = 1 ; - ANT_SW = 1 ; - - wait_ms( 500 ); // wait for on board DC/DC start-up time - - Radio.Init ( ); - Radio.SetRegulatorMode ( USE_DCDC ); // Can also be set in LDO mode but consume more power - - memset ( &Buffer, 0x00, BufferSize ); - - RxLed = 0; - TxLed = 0; - - modulationParams.PacketType = PACKET_TYPE_LORA ; - modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ; - modulationParams.Params.LoRa.Bandwidth = LORA_BW_0400 ; - modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; - - PacketParams.PacketType = PACKET_TYPE_LORA ; - PacketParams.Params.LoRa.PreambleLength = 0x08 ; - PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; - PacketParams.Params.LoRa.PayloadLength = 34 ; - PacketParams.Params.LoRa.CrcMode = LORA_CRC_ON ; - PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; - Radio.SetStandby ( STDBY_RC ); - Radio.SetPacketType ( modulationParams.PacketType ); - Radio.SetModulationParams ( &modulationParams ); - Radio.SetPacketParams ( &PacketParams ); - Radio.SetRfFrequency ( RF_FREQUENCY ); - Radio.SetBufferBaseAddresses ( 0x00, 0x00 ); - Radio.SetTxParams ( TX_OUTPUT_POWER, RADIO_RAMP_20_US ); - Radio.SetDioIrqParams ( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); - Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); - - AppState = APP_LOWPOWER; + app.start (); // Start Application + + // -------------------------------------------------- Scheduler by IRQ or watch dog + + app.getScheduling (TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening) ; // What mode ? + + wakeUpPayload.attach (&wakeUpPayloadCallback, (float)TimerPayload ) ; // All mode - /* Enable all sensors */ - hum_temp->enable (); - press_temp->enable (); - magnetometer->enable (); - accelerometer->enable (); - acc_gyro->enable_x (); - acc_gyro->enable_g (); - - printf("\r\n--- Starting new run ---\r\n"); + wakeUpGoodhealth.attach (&wakeUpGoodhealthCallback, (float)TimerGoodhealth) ; // All Mode + + if ( TimerSynchro !=0) + wakeUpSynchro.attach (&wakeUpSynchroCallback, (float)TimerSynchro) ; // Mode B + + if ( TimerSynchro !=0) + wakeUpListening.attach (&wakeUpListeningCallback,(float)TimerListening) ; // Mode C +} +//============================================================================== - hum_temp->read_id (&id1); - printf("HTS221 humidity & temperature = 0x%X\r\n", id1); - press_temp->read_id (&id2); - printf("LPS22HB pressure & temperature = 0x%X\r\n", id2); - magnetometer->read_id (&id3); - printf("LSM303AGR magnetometer = 0x%X\r\n", id3); - accelerometer->read_id (&id4); - printf("LSM303AGR accelerometer = 0x%X\r\n", id4); - acc_gyro->read_id (&id5); - printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id5); - - tft.init(); - //tft.drawString(0,32,"www."); - //tft.drawString(12,48,"displaymodule"); - //tft.drawString(88,64,".com"); - - tft.drawString (20,80,"TERMINAL IoT MISNet V1.0"); - - tft.drawRectangle (05, 70 , 230, 105, GREEN); - tft.drawRectangle (05, 125, 230, 175, RED); - tft.drawRectangle (05, 185, 230, 270, BLUE); - tft.drawRectangle (05, 280, 230, 310, YELLOW); - - sprintf (bufferDisplay, "ID Terminal : %1d ", IDTerminal); - tft.drawString (40,130,bufferDisplay); - sprintf (bufferDisplay, "ID Gateway : %1d ", IDGateway); - tft.drawString (40,150,bufferDisplay); - - updateDisplay ( 0.0, 0.0, 0.0, 0.0, 0, 0 ) ; - updateLed (false, false) ; - - if (! bmpReadHeader()) { - log("bad bmp\r\n"); - //return -1; - } - drawBmpFromFlash(20, 10); +// ============================================================================= LOOP +void loop () { + while(1) { + // deepsleep (); // perd la conf uart + sleep () ; + } } - - int cpt1, cpt2 = 0 ; - bool led1, led2 ; +// No action : all event by IRQ +//============================================================================== -void loop () { - - TxLed = 0 ; - RxLed = 0 ; - wait (1) ; - F_CS = 1 ; - SD_CS = 1 ; - ANT_SW = 1 ; - led1 = led2 = false ; - - /* Enable all sensors */ - hum_temp->enable (); - press_temp->enable (); - magnetometer->enable (); - accelerometer->enable (); - acc_gyro->enable_x (); - acc_gyro->enable_g (); - - printf("============================================================== \r\n"); - hum_temp->get_temperature (&valueTH1) ; - hum_temp->get_humidity (&valueTH2) ; - printf("HTS221 : [temp] %7s C, [hum] %s%%\r\n" , print_double(buffer1, valueTH1), print_double(buffer2, valueTH2)); - press_temp->get_temperature (&valueTP1) ; - press_temp->get_pressure (&valueTP2) ; - printf("LPS22HB : [temp] %7s C, [press] %s mbar\r\n" , print_double(buffer3, valueTP1), print_double(buffer4, valueTP2)); - magnetometer->get_m_axes (axesM) ; - printf("LSM303AGR : [mag/mgauss] %6ld, %6ld, %6ld\r\n", axesM[0], axesM[1], axesM[2]); - accelerometer->get_x_axes (axesA) ; - printf("LSM303AGR : [acc/mg] %6ld, %6ld, %6ld\r\n", axesA[0], axesA[1], axesA[2]); - acc_gyro->get_x_axes (axesG1) ; - printf("LSM6DSL : [acc/mg] %6ld, %6ld, %6ld\r\n", axesG1[0], axesG1[1], axesG1[2]); - acc_gyro->get_g_axes (axesG2) ; - printf("LSM6DSL : [gyro/mdps] %6ld, %6ld, %6ld\r\n", axesG2[0], axesG2[1], axesG2[2]); - printf("============================================================== \r\n"); - - - valueTH1 = valueTH1 - etalonTemp1 ; - valueTP1 = valueTP1 - etalonTemp2 ; - - /* Disable all sensors */ - hum_temp->disable (); - press_temp->disable (); - magnetometer->disable (); - accelerometer->disable (); - acc_gyro->disable_x (); - acc_gyro->disable_g (); - - if ( abs(OldvalueTH1 - valueTH1) > 0.25F || - abs(OldvalueTH2 - valueTH2) > 0.25F || - abs(OldaxesA[0] - axesA[0]) > 20 ) { - OldvalueTH1 = valueTH1 ; - OldvalueTH2 = valueTH2 ; - OldaxesA[0] = axesA[0] ; - led1 = true ; - updateLed (led1, led2) ; - sendRadio (ID_TERMINAL1, ID_GATEWAY, valueTH1, valueTH2) ; - cpt1++ ; - - } - if ( abs(OldvalueTP1 - valueTP1) > 0.25F || - abs(OldvalueTP2 - valueTP2) > 0.25F || - abs(OldaxesM[0] - axesM[0]) > 20 ) { - OldvalueTP1 = valueTP1 ; - OldvalueTP2 = valueTP2 ; - OldaxesM[0] = axesM[0] ; - led2 = true ; - updateLed (led1, led2) ; - sendRadio (ID_TERMINAL2, ID_GATEWAY, valueTP1, valueTP2) ; - cpt2++ ; - - } - - updateDisplay(valueTH1, valueTH2, valueTP1, valueTP2, cpt1, cpt2) ; - wait (0.8) ; - if (led1 ||led2) - updateLed (false, false) ; - -} - - -int main( ) { setup () ; while (1) loop () ; } - -void OnTxDone ( void ) { /*printf( "*** TERM *** OnTxDone \r\n" ); */ AppState = APP_TX ; } -void OnRxDone ( void ) { printf( "*** TERM *** OnRxDone \r\n" ); AppState = APP_RX ; } -void OnTxTimeout ( void ) { printf( "*** TERM *** OnTxTimeout \r\n" ); AppState = APP_TX_TIMEOUT ; } -void OnRxTimeout ( void ) { printf( "*** TERM *** OnRxTimeout \r\n" ); AppState = APP_RX_TIMEOUT ; } -void OnRxError ( IrqErrorCode_t errorCode ) { printf( "*** TERM *** OnRxError \r\n" ); AppState = APP_RX_ERROR ; } -void OnRangingDone ( IrqRangingCode_t val ) { printf( "*** TERM *** OnRangingDone \r\n" ); } -void OnCadDone ( bool channelActivityDetected ) { printf( "*** TERM *** OnCadDone \r\n" ); } -void updateDisplay (float temp1, float hum, float temp2, float press, int cptr1, int cptr2) { - sprintf (bufferDisplay, "Temperature1 : %02.2f C", temp1); - tft.drawString (20,190,bufferDisplay) ; - sprintf (bufferDisplay, "Humidite : %02.2f % ", hum); - tft.drawString (20,210,bufferDisplay); - sprintf (bufferDisplay, "Temperature2 : %02.2f C", temp2); - tft.drawString (20,230,bufferDisplay); - sprintf (bufferDisplay, "Pression : %05.1f mb", press); - tft.drawString (20,250,bufferDisplay); - sprintf (bufferDisplay, "Tx #1:%04d", cptr1); - tft.drawString (20,286,bufferDisplay); - sprintf (bufferDisplay, "#2:%04d", cptr2); - tft.drawString (140,286,bufferDisplay); +// ============================================================ WATCH DOG PAYLOAD +void wakeUpPayloadCallback (void) { + printf ("*** MAIN *** wakeUpPayloadCallback \r\n"); + app.readSensors () ; // read Sensors + app.buildMessageSensors () ; // Prepare response + app.sendMessage () ; // send message } - -void updateLed (bool led1, bool led2) { - if (led1) - tft.fillCircle (115, 295, 8, RED) ; - else - tft.fillCircle (115, 295, 8, BLACK) ; - - if (led2) - tft.fillCircle (210, 295, 8, RED) ; - else - tft.fillCircle (210, 295, 8, BLACK) ; - - tft.drawCircle (115, 295, 8, WHITE) ; - tft.drawCircle (210, 295, 8, WHITE) ; - +// ============================================================ WATCH DOG GOODHEALTH +void wakeUpGoodhealthCallback (void) { + printf ("*** MAIN *** wakeUpGoodhealthCallback ========================== \r\n"); + app.readSensors () ; // read Sensors + //app.buildMessageGoodhealth () ; // Prepare response + //app.sendMessage () ; // send message } +// ============================================================ WATCH DOG SYNCHRO +void wakeUpSynchroCallback (void) { + printf ("*** MAIN *** wakeUpSynchroCallback \r\n"); + //app.sendMessageSynchro () ; // send message + //app.sendMessage () ; // send message +} +// ============================================================ WATCH DOG LISTENING +void wakeUpListeningCallback (void) { + printf ("*** MAIN *** wakeUpListeningCallback \r\n"); + //app.startListening (duration) ; // send message +} +//***************************************************************************** - /* - Radio.GetPacketStatus(&packetStatus); - RssiValue = packetStatus.Lr24.RssiPkt; - SnrValue = packetStatus.Lr24.SnrPkt; - printf("rssi: %d; snr: %d\n\r", RssiValue, SnrValue ); - */ - -void sendRadio (char TERMINAL, char GATEWAY, float value1, float value2) { - TxLed = 1 ; - memset ( &Buffer , 0x00, BufferSize ); - memset ( &Message, 0x00, BufferSize ); - int n = sprintf ( Message, "%c%c%5s%5s", - TERMINAL, - GATEWAY, - print_double(buffer1, value1), - print_double(buffer2, value2) ); - memcpy ( Buffer , Message , MESSAGESIZE ); - printf ( "*** TERM *** Message = %s \r\n", Buffer ); - Radio.SetDioIrqParams ( TxIrqMask , TxIrqMask , IRQ_RADIO_NONE, IRQ_RADIO_NONE ); - Radio.SendPayload ( Buffer , BufferSize,( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } ); - TxLed = 0 ; - } - - - -/* Helper function for printing floats & doubles */ -static char *print_double(char* str, double v, int decimalDigits) -{ - int i = 1; - int intPart, fractPart; - int len; - char *ptr; + - /* prepare decimal digits multiplicator */ - for (;decimalDigits!=0; i*=10, decimalDigits--); - - /* calculate integer & fractinal parts */ - intPart = (int)v; - fractPart = (int)((v-(double)(int)v)*i); - - /* fill in integer part */ - sprintf(str, "%i.", intPart); - - /* prepare fill in of fractional part */ - len = strlen(str); - ptr = &str[len]; - /* fill in leading fractional zeros */ - for (i/=10;i>1; i/=10, ptr++) { - if (fractPart >= i) { - break; - } - *ptr = '0'; - } - /* fill in (rest of) fractional part */ - sprintf(ptr, "%i", fractPart); - - return str; -}