Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
Revision 41:5a436163dddf, committed 2018-10-22
- Comitter:
- FCH_31
- Date:
- Mon Oct 22 09:37:50 2018 +0000
- Parent:
- 36:14a8da4108d5
- Commit message:
- avec radio;
Changed in this revision
diff -r 14a8da4108d5 -r 5a436163dddf Controller.cpp --- a/Controller.cpp Tue Oct 16 07:29:51 2018 +0000 +++ b/Controller.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -19,7 +19,6 @@ #ifndef TEST_ENVIRONMENT #include "Tftlcd.h" -#include "Lora.h" #endif @@ -34,9 +33,9 @@ using namespace misnet; -static DataBase dataBase ; // Database creation -static MessageFactory messageFactory ; // Messages Maker (Sensors, Config, Synchro ...) -static ExtMemory extMemory ; // Memoire externe +static DataBase dataBase ; // Database creation +static MessageFactory messageFactory ; // Messages Maker (Sensors, Config, Synchro ...) +static ExtMemory extMemory ; // Memoire externe #ifndef TEST_ENVIRONMENT Tftlcd tftlcd ; // eventuellement a déplacer (uniquement valable sur les conf nucléo) @@ -65,10 +64,11 @@ #ifndef TEST_ENVIRONMENT void Controller::start (){ // @brief Start the Controller - initInterfaces () ; // Primary interface uart, i2c, spi ... - extMemory.read (&dataBase) ; // Read memory to know the list of sensor availables, fill DataBase - initSensors () ; // Depend of the list of sensors launch each - initActuators () ; // Depend of the list of actuator launch each + + initInterfaces () ; // Primary interface uart, i2c, spi ... + extMemory.read (&dataBase) ; // Read memory to know the list of sensor availables, fill DataBase + initSensors () ; // Depend of the list of sensors launch each + initActuators () ; // Depend of the list of actuator launch each // Read Radio parameter in Database for Lora interface (example) uint32_t freq ; @@ -80,14 +80,16 @@ int16_t payload_heartbeat_period; dataBase.getRadioParameter ( freq, bw, sf, pwr, bsz, terminal_heartbeat_period, payload_heartbeat_period) ; - initLora ( freq, bw, sf, pwr ) ; // Initialise the radio module + //initLora ( freq, bw, sf, pwr ) ; // Initialise the radio module - printf( "*** APP *** start %ld %d %d %d %d %d \r\n",freq, bw, sf, pwr, bsz, time) ; + printf( "*** CTRL *** start %ld %d %d %d %d %d \r\n",freq, bw, sf, pwr, bsz, time) ; tftlcd.Update ( freq, bw, sf, pwr, bsz, payload_heartbeat_period ) ; // Show information - printf( "*** APP_ *** Start Controller (Send message GoodHealth)\r\n"); + printf( "*** CTRL *** Start Controller (Send message GoodHealth)\r\n"); + messageFactory.buildGoodhealth () ; + //sendMessageLora () ; } @@ -97,11 +99,13 @@ debugSerial = new RawSerial (USBTX,USBRX, 230400); // Debug Link tftlcd.Init () ; // I2C, SPI, UART .... + + printf( "*** CTRL *** End of Init Interface \r\n"); } void Controller::initSensors(){ - printf( "*** APPP *** initSensors \r\n"); + printf( "*** CTRL *** initSensors \r\n"); // depend of the list identified (example) //bme280 = new BME280(i2c_rt); // depend of the list identified @@ -118,7 +122,7 @@ void Controller::manageSensors () { readSensors () ; - messageFactory.buildSensors () ; + messageFactory.buildSensors () ; sendMessage () ; } @@ -144,23 +148,23 @@ void Controller::getScheduling (uint16_t &TimerPayload, uint16_t &TimerGoodhealth, uint16_t &TimerSynchro, uint16_t &TimerListening ) { - TimerPayload = 3L ; // TODO Dépend de la lecture de la memoire (ici simulé) + TimerPayload = 5L ; // TODO Dépend de la lecture de la memoire (ici simulé) TimerGoodhealth = 60L ; TimerSynchro = 0L ; TimerListening = 0L ; } void Controller::sendMessage () { - printf( "*** APP_ *** sendMessage \r\n"); - sendMessageLora () ; + printf( "*** CTRL *** sendMessage \r\n"); + //sendMessageLora () ; } void Controller::readSensors () { - printf( "*** APP_ *** readSensors \r\n"); - printf("*** APP *** loop on all channels\r\n"); + printf("*** CTRL *** readSensors \r\n"); + printf("*** CTRL *** loop on all channels\r\n"); short nbSensors = dataBase.getNbService(Service::SENSOR); - printf("*** APP *** there are %d sensors in this payload\r\n", nbSensors); + printf("*** CTRL *** there are %d sensors in this payload\r\n", nbSensors); // depend of the list identified // Each sensor sends an event in the db //iks01a2.read () ;
diff -r 14a8da4108d5 -r 5a436163dddf Controller.hpp --- a/Controller.hpp Tue Oct 16 07:29:51 2018 +0000 +++ b/Controller.hpp Mon Oct 22 09:37:50 2018 +0000 @@ -21,10 +21,29 @@ #include "DataBase.hpp" + namespace misnet { class Controller; } +// A deplacer ... +typedef struct { + uint8_t addrType ; // Smart Tool/ Gen / Iot/ Asset + uint16_t terminalAddr ; // + uint8_t subnetAddr ; // + uint8_t raw[2] ; // Raw value content Type and Terminal/Network id + // TODO Finish coding raw value +} ModeParameter ; + + + +#define SMART_TOOL_MODE 0x00 +#define GENERIC_MODE 0x40 +#define IOT_MODE 0x80 +#define BROADCAST_MODE 0xC0 + + + class misnet::Controller {
diff -r 14a8da4108d5 -r 5a436163dddf DataBase.cpp --- a/DataBase.cpp Tue Oct 16 07:29:51 2018 +0000 +++ b/DataBase.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -61,7 +61,7 @@ _terminal_heartbeat_period = terminal_heartbeat_period ; _payload_heartbeat_period = payload_heartbeat_period ; - printf( "*** DTB *** setRadioParameter %ld %d %d %d %d %d %d\r\n", _rf_frequency, _lora_bw, + printf( "*** DTB *** setRadioParameter %u %d %d %d %d %d %d\r\n", _rf_frequency, _lora_bw, _lora_sf, _tx_output_power, _buffer_size_max,_terminal_heartbeat_period, _payload_heartbeat_period); } #endif
diff -r 14a8da4108d5 -r 5a436163dddf DataBase.hpp --- a/DataBase.hpp Tue Oct 16 07:29:51 2018 +0000 +++ b/DataBase.hpp Mon Oct 22 09:37:50 2018 +0000 @@ -48,14 +48,16 @@ BROADCAST_IOT = 3 // Broadcast IOT (the terminal is not attached to a gateway) }; + public: DataBase (); ~DataBase (); + void init () ; TERMINAL_TYPE getTerminalType() { - return this->_terminal_type; + //return this->_terminal_type; // FC to compile } short getNbService (Service::DEVICE_TYPE cdt); // return the number of declared channels for the payload
diff -r 14a8da4108d5 -r 5a436163dddf ExtMemory.cpp --- a/ExtMemory.cpp Tue Oct 16 07:29:51 2018 +0000 +++ b/ExtMemory.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -20,6 +20,8 @@ // ===================================== Methods of class void ExtMemory::read (DataBase* dataBase) { + + printf ( "*** EXTM *** Read start \n\r"); // read eeprom and initialize database //(Example) @@ -29,7 +31,7 @@ int32_t pos=0; ServiceDefinition sd,prev_sd; Header hd; - EEPROM ep(I2C_SDA, I2C_SCL, EEPROM_ADDR, EEPROM::T24C04); + //EEPROM ep (I2C_SDA, I2C_SCL, EEPROM_ADDR, EEPROM::T24C04); // FC to compile DEBUG( "*** EXTMEM Reading external memory ***\n"); @@ -38,8 +40,8 @@ #endif // ---- read header block - ep.read(pos, (void *) &hd, sizeof(hd)); - if (ep.getError() != 0) error(ep.getErrorMessage()); + //ep.read(pos, (void *) &hd, sizeof(hd)); + //if (ep.getError() != 0) error(ep.getErrorMessage()); pos += sizeof(hd); DEBUG("*** [reading header] services:%d mode:0x%02x payloadID:0x%04x ***\n", hd.nb_of_services, hd.operating_mode, hd.payload_id); @@ -50,7 +52,10 @@ std::vector<Service*> services = std::vector<Service*>(); Component* component; std::string name[6] = {"HTS221","LPS22HB","LSM303D","LSM6DSL","BME280","DS18B20"}; // debug purpose + + /* FC pour débloquer l'execution while(servicesNbr<servicesTotal){ + while(ep.read(pos, (void *) &sd, sizeof(sd)),(servicesNbr<servicesTotal)){ pos += sizeof(sd); if (ep.getError() != 0) { error(ep.getErrorMessage()); continue;} @@ -85,6 +90,7 @@ services.clear(); DEBUG("\n"); } + */ Payload * payload = new Payload((misnet::Payload::PAYLOAD_ID) hd.payload_id, components, hd.payload_base_period); dataBase->setPayload(payload); @@ -247,7 +253,12 @@ // // Enregistrement de la payload dans la database // // --------------------------------------------- // dataBase->setPayload(payload); + + printf ( "*** EXTM *** Read done \n\r"); + } + +/* void ExtMemory::populate (void) { int32_t pos=0; @@ -330,4 +341,5 @@ pos += sizeof(sd); printf("service5 ID:0x%02x type:0x%02x code:0x%04x\n", sd_r.component_id, sd_r.service_type, sd_r.mistnet_code); -} \ No newline at end of file +} +*/ \ No newline at end of file
diff -r 14a8da4108d5 -r 5a436163dddf ExtMemory.hpp --- a/ExtMemory.hpp Tue Oct 16 07:29:51 2018 +0000 +++ b/ExtMemory.hpp Mon Oct 22 09:37:50 2018 +0000 @@ -43,7 +43,7 @@ uint8_t value_type; uint8_t service_type; uint8_t component_id; - uint8_t value_type; + // uint8_t value_type; FC to compile uint8_t component_group; uint8_t service_state; uint8_t access_type;
diff -r 14a8da4108d5 -r 5a436163dddf Lora.cpp --- a/Lora.cpp Tue Oct 16 07:29:51 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,463 +0,0 @@ -/* - * MISNet - * - * Lora: Radio Management - * - * Created on: August 17, 2018 Author: Francis CHATAIN - * - */ - - -// ===================================== Includes -#include "Lora.h" -#include "mbed.h" -#include "main.h" -#include "sx1280-hal.h" - -// ========================================================================== DEFINE -#define MODE_LORA // Lora modulation - -#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) -#define MODE_ADDR 0x8000 - - -// ========================================================================== HW -DigitalOut F_CS ( D6 ) ; // MBED description of pin -DigitalOut SD_CS ( D8 ) ; // MBED description of pin -DigitalOut ANT_SW ( A3 ) ; -DigitalOut TxLed ( A4 ) ; -DigitalOut RxLed ( A5 ) ; - - -// ========================================================================== VARIABLES -uint16_t RxIrqMask ; // Mask of IRQs to listen to in rx mode -uint16_t TxIrqMask ; // Mask of IRQs to listen to in tx mode - - -uint32_t valueTimeTx ; -uint32_t valueTimeLoop ; - -int dataCounter = 0 ; -uint8_t oldFreq ; -uint8_t oldBw ; -uint8_t oldPwr ; -uint8_t oldSf ; -uint8_t oldTimer ; - -// States of the application -typedef enum { APP_LOWPOWER, APP_RX, APP_RX_TIMEOUT, APP_RX_ERROR, APP_TX, APP_TX_TIMEOUT, } AppStates_t ; -AppStates_t AppState = APP_LOWPOWER; // Init State of the application - -PacketStatus_t PacketStatus ; -int8_t RssiValue = 0 ; -int8_t SnrValue = 0 ; - -ModulationParams_t modulationParams; -PacketParams_t PacketParams ; // Locals parameters and status for radio API -PacketStatus_t packetStatus ; // NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING - -uint32_t RF_FREQUENCY ; // HzNominal frequency -RadioLoRaBandwidths_t LORA_BW ; /* 200; 400; 800; 1600 */ -RadioLoRaSpreadingFactors_t LORA_SF ; /* SF5; SF6=; SF7; SF8 ; SF9; SF10; SF11 ; SF12 */ -int8_t TX_OUTPUT_POWER ; /* Output power in dBm [-18..+13] dBm */ -uint8_t BUFFER_SIZE_MAX ; /* Payload size max */ -int16_t TIMER ; /* timer entre reemission en ms */ -uint8_t BUFFER_SIZE_MIN ; /* Payload return size */ - - -// ========================================================================== Function -void initRadio () ; -void setRadioTx () ; -void setRadioRx () ; -void watchDogRxCRNoReceived () ; - - - -Timer timerRadio ; -Timeout watchDogRx ; -Timeout watchDogTx ; - -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 - -RadioCallbacks_t callbacks = { - &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 ); - - - -//=============================================================================================================================== -void initLora (uint32_t rf,RadioLoRaBandwidths_t bw,RadioLoRaSpreadingFactors_t sf,int8_t pwr) -//=============================================================================================================================== -{ - // Default value initialisation - printf( "*** LORA *** Lora Initialisation \r\n"); - - RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in rx mode - TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in tx mode - - RF_FREQUENCY = rf ; // HzNominal frequency - LORA_BW = bw ; /* 200; 400; 800; 1600 */ - LORA_SF = sf ; /* SF5; SF6=; SF7; SF8 ; SF9; SF10; SF11 ; SF12 */ - TX_OUTPUT_POWER = pwr ; /* Output power in dBm [-18..+13] dBm */ - BUFFER_SIZE_MAX = 100 ; /* Payload size max */ - BUFFER_SIZE_MIN = 5 ; /* Payload return size */ - TIMER = 1000 ; /* timer entre reemission en ms */ - - - - Radio.Reset () ; - Radio.Init () ; - initRadio () ; - Radio.SetRegulatorMode ( USE_DCDC ) ; // Can also be set in LDO mode but consume more power - wait_ms ( 10 ) ; // wait for on board DC/DC start-up time - - TxLed = 0 ; - RxLed = 0 ; - -} - - -//=============================================================================================================================== -void sendMessageLora () { -//=============================================================================================================================== - uint8_t Buffer [BUFFER_SIZE_MAX] ; // Buffer - char frameMISNET [BUFFER_SIZE_MAX] ; // Misnet Frame - uint8_t *pointer ; - char *ptr_int ; - - - dataCounter = dataCounter + 1 ; - memset ( &Buffer , 0x00, BUFFER_SIZE_MAX ); - memset ( &frameMISNET , 0x00, BUFFER_SIZE_MAX ); - - - uint16_t clearPart = 0x0 ; - - uint32_t servicePayload = 0x0 ; - //char serviceMessage[16] ; // TRACES - - uint8_t SFT = 0 ; - uint8_t DFT = 0 ; - uint8_t FDL = 8 ; - uint8_t BL = 7 ; - uint8_t DMI = 66 ; - uint16_t RCA = 0xBEEF & 0x7FFF ; - uint32_t MIC = 0xCAFECAFE & 0xFFFFFFFF ; - - - clearPart = MODE_ADDR | ( ID_TERMINAL << 6 ) | ID_GATEWAY ; - printf( "*** LORA *** CLEAR PART= %8X \r\n ", clearPart); - - servicePayload = (uint32_t)( (SFT & 0x03) << 30) | - (uint32_t)( (DFT & 0x03) << 28) | - (uint32_t)( (FDL & 0x3F) << 22) | - (uint32_t)( (BL & 0x07) << 19) | - (uint32_t)( (DMI & 0xFF) << 11) | - (RCA & 0x7FF) ; - - //sprintf (serviceMessage, "%08X%08X", servicePayload, MIC) ; // traces - //printf( "*** LORA *** SERVICE Payload = %08X \r\n ", servicePayload); - //printf( "*** LORA *** SERVICE MIC = %08X \r\n ", MIC); - - // CLEAR PART + Indianess correction - pointer = (uint8_t*) &clearPart ; for (int i = 0, j=1 ; i<2 ; i++, j--) frameMISNET[j] = pointer[i] ; - - // SERVICE + Indianess correction - pointer = (uint8_t*) &servicePayload ; for (int i=0, j=3 ; i<4 ; i++, j--) frameMISNET[2+i] = pointer[j] ; - pointer = (uint8_t*) &MIC ; for (int i=0, j=3 ; i<4 ; i++, j--) frameMISNET[6+i] = pointer[j] ; - - printf( "*** LORA *** START Buffer "); for (int i = 0 ; i<10 ; i++) printf ("%02X,", frameMISNET[i] ) ; printf( "\n") ; - - - int n = sprintf (frameMISNET, "%1c%1c", ID_TERMINAL, ID_GATEWAY); - - pointer = (uint8_t*) &dataCounter ; for (int i = 0 ; i<4 ; i++) frameMISNET[2+i] = pointer[i] ; - //(int32*)&frameMISNET[2]=(int32*)&ptr_int; // -> aton OR ntoa - - printf( "*** LORA *** TX SEND %05d ", dataCounter); - for (int i = 0 ; i<10 ; i++) printf ("%d,", frameMISNET[i] ) ; printf( "\n") ; - - - // Send SF, BW, COUNTER, POWER, FREQ, TIMETX, TIMELOOP, RSSIVALUE - frameMISNET[6] = LORA_SF ; - ptr_int = (char*) &LORA_BW ; - frameMISNET[7]= ptr_int[1] ; - frameMISNET[8]= ptr_int[0] ; - frameMISNET[9] = TX_OUTPUT_POWER ; - ptr_int = (char*) &RF_FREQUENCY ; for (int i = 0 ; i<4 ; i++) frameMISNET[10+i] = ptr_int[i] ; - ptr_int = (char*) &valueTimeTx ; for (int i = 0 ; i<4 ; i++) frameMISNET[14+i] = ptr_int[i] ; //printf( "*** LORA *** TimeTx %d %d ", valueTimeTx, valueTimeLoop); //delay temps Tx - ptr_int = (char*) &valueTimeLoop ; for (int i = 0 ; i<4 ; i++) frameMISNET[18+i] = ptr_int[i] ; //delay temps Loop - frameMISNET[22] = RssiValue ; - - memcpy ( Buffer , frameMISNET , 23 ); - - valueTimeTx = 0 ; - valueTimeLoop = 0 ; - timerRadio.reset () ; // Record tile for close loop - timerRadio.start () ; - setRadioTx () ; - TxLed = 1 ; - PacketParams.Params.LoRa.PayloadLength = 23 ; - Radio.SetPacketParams ( &PacketParams ) ; - Radio.SendPayload ( Buffer , 23,( TickTime_t ) {RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE} ); - TxLed = 0 ; - - //printf( "*** LORA *** ARM watchDogRxRxRxRx \r\n" ); - watchDogRx.attach (&watchDogRxCRNoReceived, 1.0); // Arm watchDogRx if the response is not received in less 500 ms => force retry -} -//=============================================================================================================================== - - -// Time out si pas de message de CR recu -void watchDogRxCRNoReceived () { - printf( "*** LORA *** watchDogRxNoReceive NO RESPONSE \r\n"); -} // Force new emission - - - - -//=============================================================================================================================== -void initRadio () { -//=============================================================================================================================== - F_CS = 1 ; - SD_CS = 1 ; - ANT_SW = 1 ; - - // SET MODULATION - modulationParams.PacketType = PACKET_TYPE_LORA ; - modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; - modulationParams.Params.LoRa.Bandwidth = LORA_BW_0200 ; - modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ; - // SET PACKET PARAM - PacketParams.PacketType = PACKET_TYPE_LORA ; - PacketParams.Params.LoRa.PreambleLength = 0x08 ; - PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; - PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MAX ; - PacketParams.Params.LoRa.Crc = LORA_CRC_ON ; - PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; - // RADIO - Radio.SetStandby ( STDBY_RC ) ; - Radio.SetPacketType ( modulationParams.PacketType ); - Radio.SetModulationParams ( &modulationParams ) ; - Radio.SetPacketParams ( &PacketParams ) ; - Radio.SetBufferBaseAddresses ( 0x00, 0x00 ); - Radio.SetTxParams ( TX_OUTPUT_POWER, RADIO_RAMP_20_US ) ; - Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; - //AppState = APP_LOWPOWER; -} -//=============================================================================================================================== - - - -//=============================================================================================================================== -void setRadioTx () { -//=============================================================================================================================== - RxLed = 0 ; - TxLed = 0 ; - F_CS = 1 ; - SD_CS = 1 ; - ANT_SW = 1 ; - - // SET MODULATION - modulationParams.PacketType = PACKET_TYPE_LORA ; - modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; - modulationParams.Params.LoRa.Bandwidth = LORA_BW ; - modulationParams.Params.LoRa.SpreadingFactor = LORA_SF ; - - // SET PACKET PARAM - PacketParams.PacketType = PACKET_TYPE_LORA ; - PacketParams.Params.LoRa.PreambleLength = 0x08 ; - PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; - PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MAX ; - PacketParams.Params.LoRa.Crc = LORA_CRC_ON ; - PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; - - // RADIO - 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 ( TxIrqMask , TxIrqMask , IRQ_RADIO_NONE, IRQ_RADIO_NONE ); - Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; - - //AppState = APP_LOWPOWER; - - } - - -//=============================================================================================================================== -void setRadioRx () { -//=============================================================================================================================== - RxLed = 0 ; - TxLed = 0 ; - - F_CS = 1 ; - SD_CS = 1 ; - ANT_SW = 1 ; - - // SET MODULATION - modulationParams.PacketType = PACKET_TYPE_LORA ; - modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; - modulationParams.Params.LoRa.Bandwidth = LORA_BW_0200 ; - modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ; - - // SET PACKET PARAM - PacketParams.PacketType = PACKET_TYPE_LORA ; - PacketParams.Params.LoRa.PreambleLength = 0x08 ; - PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; - PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MIN ; - PacketParams.Params.LoRa.Crc = LORA_CRC_ON ; - PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; - - // RADIO - Radio.SetStandby ( STDBY_RC ) ; - Radio.SetPacketType ( modulationParams.PacketType ); - Radio.SetModulationParams ( &modulationParams ) ; - Radio.SetPacketParams ( &PacketParams ) ; - Radio.SetRfFrequency ( RF_FREQUENCY + 440000UL) ; - - Radio.SetBufferBaseAddresses ( 0x00, 0x00 ); - Radio.SetDioIrqParams ( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ) ; - Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x00000000 } ) ; -// Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; -} -//=============================================================================================================================== - - - - -// ============================================================================ RADIO CALLBACK -void OnTxDone ( void ) { -//============================================================================== - valueTimeTx = timerRadio.read_ms () ; - printf( "*** LORA *** OnTxDone \r\n" ); - TxLed = 0 ; - setRadioRx () ; -} -//============================================================================== - - - -//void OnRxDone ( void ) { AppState = APP_RX ; } -//============================================================================== -void OnRxDone ( void ) { -//============================================================================== - uint8_t Buffer1 [BUFFER_SIZE_MAX+1]; // Buffer Radio - uint8_t BufferSize = BUFFER_SIZE_MAX ; // Size of the buffer - - RxLed = 1 ; // Show the reception - - printf( "*** LORA *** RX DONE \r\n" ); - valueTimeLoop = timerRadio.read_ms () ; - timerRadio.stop () ; - watchDogRx.detach () ; - //printf( "*** LORA *** DISARM watchDogRx \r\n" ); - - Radio.GetPacketStatus(&packetStatus) ; - RssiValue = packetStatus.LoRa.RssiPkt ; - - memset ( &Buffer1 , 0x00, BUFFER_SIZE_MAX ); - Radio.GetPayload ( Buffer1, &BufferSize, BUFFER_SIZE_MAX ); - - RxLed = 0 ; // Show the reception - - Buffer1[7] = 0 ; - - printf ( "*** LORA *** RX DONE => %s \r\n", Buffer1 ); wait(1) ; // flush serial - - // Extract value - - switch (Buffer1[2]) { - case '1': RF_FREQUENCY = 2400000000UL ; break ; - case '2': RF_FREQUENCY = 2400680000UL ; break ; - case '3': RF_FREQUENCY = 2423840000UL ; break ; - case '4': RF_FREQUENCY = 2424520000UL ; break ; - case '5': RF_FREQUENCY = 2448840000UL ; break ; - case '6': RF_FREQUENCY = 2449520000UL ; break ; - case '7': RF_FREQUENCY = 2473840000UL ; break ; - case '8': RF_FREQUENCY = 2474520000UL ; break ; - } - - switch (Buffer1[3]) { - case '1': LORA_BW = LORA_BW_0200 ; break ; - case '2': LORA_BW = LORA_BW_0400 ; break ; - case '3': LORA_BW = LORA_BW_0800 ; break ; - case '4': LORA_BW = LORA_BW_1600 ; break ; - } - - switch (Buffer1[4]) { - case '1': TX_OUTPUT_POWER = -18 ; break ; - case '2': TX_OUTPUT_POWER = 0 ; break ; - case '3': TX_OUTPUT_POWER = 8 ; break ; - case '4': TX_OUTPUT_POWER = 10 ; break ; - case '5': TX_OUTPUT_POWER = 13 ; break ; - } - - switch (Buffer1[5]) { - case '1': LORA_SF = LORA_SF5 ; break ; - case '2': LORA_SF = LORA_SF6 ; break ; - case '3': LORA_SF = LORA_SF7 ; break ; - case '4': LORA_SF = LORA_SF8 ; break ; - case '5': LORA_SF = LORA_SF9 ; break ; - case '6': LORA_SF = LORA_SF10 ; break ; - case '7': LORA_SF = LORA_SF12 ; break ; - } - - int OLD_TIMER = TIMER ; - - switch (Buffer1[6]) { - case '1': TIMER = 50 ; break ; - case '2': TIMER = 75 ; break ; - case '3': TIMER = 125 ; break ; - case '4': TIMER = 250 ; break ; - case '5': TIMER = 500 ; break ; - case '6': TIMER = 1000 ; break ; - case '7': TIMER = 2000 ; break ; - } - - RxLed = 0 ; - - if (oldFreq != Buffer1[2] || oldBw != Buffer1[3] || oldPwr != Buffer1[4] || oldSf != Buffer1[5] || oldTimer != Buffer1[6] ) { - oldFreq = Buffer1[2] ; - oldBw = Buffer1[3] ; - oldPwr = Buffer1[4] ; - oldSf = Buffer1[5] ; - oldTimer = Buffer1[6] ; - //printf ( "*** LORA *** Reset Radio \r\n" ); - //app.updateDisplay ( LORA_SF, LORA_BW, TX_OUTPUT_POWER, BUFFER_SIZE_MAX, RF_FREQUENCY, TIMER ) ; - } - - if (OLD_TIMER != TIMER) { - //wakeUpTerminal.detach (); - //wakeUpTerminal.attach (&wakeUpTerminalFunction, (float) TIMER/1000); - } -} -//============================================================================== - -void OnTxTimeout ( void ) { AppState = APP_TX_TIMEOUT ;} -void OnRxTimeout ( void ) { AppState = APP_RX_TIMEOUT ; } -void OnRxError ( IrqErrorCode_t errorCode ) { AppState = APP_RX_ERROR ; } -void OnRangingDone ( IrqRangingCode_t val ) { } -void OnCadDone ( bool channelActivityDetected ){ } - -
diff -r 14a8da4108d5 -r 5a436163dddf Lora.h --- a/Lora.h Tue Oct 16 07:29:51 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -/* - * MISNet - * - * Lora: Radio Management - * - * Created on: August 17, 2018 Author: Francis CHATAIN - * - */ -#ifndef __LORA_H__ -#define __LORA_H__ - -#include "mbed.h" -#include "sx1280-hal.h" - - -void initLora(uint32_t rf,RadioLoRaBandwidths_t bw,RadioLoRaSpreadingFactors_t sf,int8_t pwr) ; -void sendMessageLora () ; - -#endif \ No newline at end of file
diff -r 14a8da4108d5 -r 5a436163dddf Loracpp.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Loracpp.txt Mon Oct 22 09:37:50 2018 +0000 @@ -0,0 +1,463 @@ +/* + * MISNet + * + * Lora: Radio Management + * + * Created on: August 17, 2018 Author: Francis CHATAIN + * + */ + + +// ===================================== Includes +#include "Lora.h" +#include "mbed.h" +#include "main.h" +#include "sx1280-hal.h" + +// ========================================================================== DEFINE +#define MODE_LORA // Lora modulation + +#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) +#define MODE_ADDR 0x8000 + + +// ========================================================================== HW +DigitalOut F_CS ( D6 ) ; // MBED description of pin +DigitalOut SD_CS ( D8 ) ; // MBED description of pin +DigitalOut ANT_SW ( A3 ) ; +DigitalOut TxLed ( A4 ) ; +DigitalOut RxLed ( A5 ) ; + + +// ========================================================================== VARIABLES +uint16_t RxIrqMask ; // Mask of IRQs to listen to in rx mode +uint16_t TxIrqMask ; // Mask of IRQs to listen to in tx mode + + +uint32_t valueTimeTx ; +uint32_t valueTimeLoop ; + +int dataCounter = 0 ; +uint8_t oldFreq ; +uint8_t oldBw ; +uint8_t oldPwr ; +uint8_t oldSf ; +uint8_t oldTimer ; + +// States of the application +typedef enum { APP_LOWPOWER, APP_RX, APP_RX_TIMEOUT, APP_RX_ERROR, APP_TX, APP_TX_TIMEOUT, } AppStates_t ; +AppStates_t AppState = APP_LOWPOWER; // Init State of the application + +PacketStatus_t PacketStatus ; +int8_t RssiValue = 0 ; +int8_t SnrValue = 0 ; + +ModulationParams_t modulationParams; +PacketParams_t PacketParams ; // Locals parameters and status for radio API +PacketStatus_t packetStatus ; // NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING + +uint32_t RF_FREQUENCY ; // HzNominal frequency +RadioLoRaBandwidths_t LORA_BW ; /* 200; 400; 800; 1600 */ +RadioLoRaSpreadingFactors_t LORA_SF ; /* SF5; SF6=; SF7; SF8 ; SF9; SF10; SF11 ; SF12 */ +int8_t TX_OUTPUT_POWER ; /* Output power in dBm [-18..+13] dBm */ +uint8_t BUFFER_SIZE_MAX ; /* Payload size max */ +int16_t TIMER ; /* timer entre reemission en ms */ +uint8_t BUFFER_SIZE_MIN ; /* Payload return size */ + + +// ========================================================================== Function +void initRadio () ; +void setRadioTx () ; +void setRadioRx () ; +void watchDogRxCRNoReceived () ; + + + +Timer timerRadio ; +Timeout watchDogRx ; +Timeout watchDogTx ; + +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 + +RadioCallbacks_t callbacks = { + &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 ); + + + +//=============================================================================================================================== +void initLora (uint32_t rf,RadioLoRaBandwidths_t bw,RadioLoRaSpreadingFactors_t sf,int8_t pwr) +//=============================================================================================================================== +{ + // Default value initialisation + printf( "*** LORA *** Lora Initialisation \r\n"); + + RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in rx mode + TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in tx mode + + RF_FREQUENCY = rf ; // HzNominal frequency + LORA_BW = bw ; /* 200; 400; 800; 1600 */ + LORA_SF = sf ; /* SF5; SF6=; SF7; SF8 ; SF9; SF10; SF11 ; SF12 */ + TX_OUTPUT_POWER = pwr ; /* Output power in dBm [-18..+13] dBm */ + BUFFER_SIZE_MAX = 100 ; /* Payload size max */ + BUFFER_SIZE_MIN = 5 ; /* Payload return size */ + TIMER = 1000 ; /* timer entre reemission en ms */ + + + + Radio.Reset () ; + Radio.Init () ; + initRadio () ; + Radio.SetRegulatorMode ( USE_DCDC ) ; // Can also be set in LDO mode but consume more power + wait_ms ( 10 ) ; // wait for on board DC/DC start-up time + + TxLed = 0 ; + RxLed = 0 ; + +} + + +//=============================================================================================================================== +void sendMessageLora () { +//=============================================================================================================================== + uint8_t Buffer [BUFFER_SIZE_MAX] ; // Buffer + char frameMISNET [BUFFER_SIZE_MAX] ; // Misnet Frame + uint8_t *pointer ; + char *ptr_int ; + + + dataCounter = dataCounter + 1 ; + memset ( &Buffer , 0x00, BUFFER_SIZE_MAX ); + memset ( &frameMISNET , 0x00, BUFFER_SIZE_MAX ); + + + uint16_t clearPart = 0x0 ; + + uint32_t servicePayload = 0x0 ; + //char serviceMessage[16] ; // TRACES + + uint8_t SFT = 0 ; + uint8_t DFT = 0 ; + uint8_t FDL = 8 ; + uint8_t BL = 7 ; + uint8_t DMI = 66 ; + uint16_t RCA = 0xBEEF & 0x7FFF ; + uint32_t MIC = 0xCAFECAFE & 0xFFFFFFFF ; + + + clearPart = MODE_ADDR | ( ID_TERMINAL << 6 ) | ID_GATEWAY ; + printf( "*** LORA *** CLEAR PART= %8X \r\n ", clearPart); + + servicePayload = (uint32_t)( (SFT & 0x03) << 30) | + (uint32_t)( (DFT & 0x03) << 28) | + (uint32_t)( (FDL & 0x3F) << 22) | + (uint32_t)( (BL & 0x07) << 19) | + (uint32_t)( (DMI & 0xFF) << 11) | + (RCA & 0x7FF) ; + + //sprintf (serviceMessage, "%08X%08X", servicePayload, MIC) ; // traces + //printf( "*** LORA *** SERVICE Payload = %08X \r\n ", servicePayload); + //printf( "*** LORA *** SERVICE MIC = %08X \r\n ", MIC); + + // CLEAR PART + Indianess correction + pointer = (uint8_t*) &clearPart ; for (int i = 0, j=1 ; i<2 ; i++, j--) frameMISNET[j] = pointer[i] ; + + // SERVICE + Indianess correction + pointer = (uint8_t*) &servicePayload ; for (int i=0, j=3 ; i<4 ; i++, j--) frameMISNET[2+i] = pointer[j] ; + pointer = (uint8_t*) &MIC ; for (int i=0, j=3 ; i<4 ; i++, j--) frameMISNET[6+i] = pointer[j] ; + + printf( "*** LORA *** START Buffer "); for (int i = 0 ; i<10 ; i++) printf ("%02X,", frameMISNET[i] ) ; printf( "\n") ; + + + int n = sprintf (frameMISNET, "%1c%1c", ID_TERMINAL, ID_GATEWAY); + + pointer = (uint8_t*) &dataCounter ; for (int i = 0 ; i<4 ; i++) frameMISNET[2+i] = pointer[i] ; + //(int32*)&frameMISNET[2]=(int32*)&ptr_int; // -> aton OR ntoa + + printf( "*** LORA *** TX SEND %05d ", dataCounter); + for (int i = 0 ; i<10 ; i++) printf ("%d,", frameMISNET[i] ) ; printf( "\n") ; + + + // Send SF, BW, COUNTER, POWER, FREQ, TIMETX, TIMELOOP, RSSIVALUE + frameMISNET[6] = LORA_SF ; + ptr_int = (char*) &LORA_BW ; + frameMISNET[7]= ptr_int[1] ; + frameMISNET[8]= ptr_int[0] ; + frameMISNET[9] = TX_OUTPUT_POWER ; + ptr_int = (char*) &RF_FREQUENCY ; for (int i = 0 ; i<4 ; i++) frameMISNET[10+i] = ptr_int[i] ; + ptr_int = (char*) &valueTimeTx ; for (int i = 0 ; i<4 ; i++) frameMISNET[14+i] = ptr_int[i] ; //printf( "*** LORA *** TimeTx %d %d ", valueTimeTx, valueTimeLoop); //delay temps Tx + ptr_int = (char*) &valueTimeLoop ; for (int i = 0 ; i<4 ; i++) frameMISNET[18+i] = ptr_int[i] ; //delay temps Loop + frameMISNET[22] = RssiValue ; + + memcpy ( Buffer , frameMISNET , 23 ); + + valueTimeTx = 0 ; + valueTimeLoop = 0 ; + timerRadio.reset () ; // Record tile for close loop + timerRadio.start () ; + setRadioTx () ; + TxLed = 1 ; + PacketParams.Params.LoRa.PayloadLength = 23 ; + Radio.SetPacketParams ( &PacketParams ) ; + Radio.SendPayload ( Buffer , 23,( TickTime_t ) {RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE} ); + TxLed = 0 ; + + //printf( "*** LORA *** ARM watchDogRxRxRxRx \r\n" ); + watchDogRx.attach (&watchDogRxCRNoReceived, 1.0); // Arm watchDogRx if the response is not received in less 500 ms => force retry +} +//=============================================================================================================================== + + +// Time out si pas de message de CR recu +void watchDogRxCRNoReceived () { + printf( "*** LORA *** watchDogRxNoReceive NO RESPONSE \r\n"); +} // Force new emission + + + + +//=============================================================================================================================== +void initRadio () { +//=============================================================================================================================== + F_CS = 1 ; + SD_CS = 1 ; + ANT_SW = 1 ; + + // SET MODULATION + modulationParams.PacketType = PACKET_TYPE_LORA ; + modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; + modulationParams.Params.LoRa.Bandwidth = LORA_BW_0200 ; + modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ; + // SET PACKET PARAM + PacketParams.PacketType = PACKET_TYPE_LORA ; + PacketParams.Params.LoRa.PreambleLength = 0x08 ; + PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; + PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MAX ; + PacketParams.Params.LoRa.Crc = LORA_CRC_ON ; + PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; + // RADIO + Radio.SetStandby ( STDBY_RC ) ; + Radio.SetPacketType ( modulationParams.PacketType ); + Radio.SetModulationParams ( &modulationParams ) ; + Radio.SetPacketParams ( &PacketParams ) ; + Radio.SetBufferBaseAddresses ( 0x00, 0x00 ); + Radio.SetTxParams ( TX_OUTPUT_POWER, RADIO_RAMP_20_US ) ; + Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; + //AppState = APP_LOWPOWER; +} +//=============================================================================================================================== + + + +//=============================================================================================================================== +void setRadioTx () { +//=============================================================================================================================== + RxLed = 0 ; + TxLed = 0 ; + F_CS = 1 ; + SD_CS = 1 ; + ANT_SW = 1 ; + + // SET MODULATION + modulationParams.PacketType = PACKET_TYPE_LORA ; + modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; + modulationParams.Params.LoRa.Bandwidth = LORA_BW ; + modulationParams.Params.LoRa.SpreadingFactor = LORA_SF ; + + // SET PACKET PARAM + PacketParams.PacketType = PACKET_TYPE_LORA ; + PacketParams.Params.LoRa.PreambleLength = 0x08 ; + PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; + PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MAX ; + PacketParams.Params.LoRa.Crc = LORA_CRC_ON ; + PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; + + // RADIO + 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 ( TxIrqMask , TxIrqMask , IRQ_RADIO_NONE, IRQ_RADIO_NONE ); + Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; + + //AppState = APP_LOWPOWER; + + } + + +//=============================================================================================================================== +void setRadioRx () { +//=============================================================================================================================== + RxLed = 0 ; + TxLed = 0 ; + + F_CS = 1 ; + SD_CS = 1 ; + ANT_SW = 1 ; + + // SET MODULATION + modulationParams.PacketType = PACKET_TYPE_LORA ; + modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ; + modulationParams.Params.LoRa.Bandwidth = LORA_BW_0200 ; + modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ; + + // SET PACKET PARAM + PacketParams.PacketType = PACKET_TYPE_LORA ; + PacketParams.Params.LoRa.PreambleLength = 0x08 ; + PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; + PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MIN ; + PacketParams.Params.LoRa.Crc = LORA_CRC_ON ; + PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ; + + // RADIO + Radio.SetStandby ( STDBY_RC ) ; + Radio.SetPacketType ( modulationParams.PacketType ); + Radio.SetModulationParams ( &modulationParams ) ; + Radio.SetPacketParams ( &PacketParams ) ; + Radio.SetRfFrequency ( RF_FREQUENCY + 440000UL) ; + + Radio.SetBufferBaseAddresses ( 0x00, 0x00 ); + Radio.SetDioIrqParams ( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ) ; + Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x00000000 } ) ; +// Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; +} +//=============================================================================================================================== + + + + +// ============================================================================ RADIO CALLBACK +void OnTxDone ( void ) { +//============================================================================== + valueTimeTx = timerRadio.read_ms () ; + printf( "*** LORA *** OnTxDone \r\n" ); + TxLed = 0 ; + setRadioRx () ; +} +//============================================================================== + + + +//void OnRxDone ( void ) { AppState = APP_RX ; } +//============================================================================== +void OnRxDone ( void ) { +//============================================================================== + uint8_t Buffer1 [BUFFER_SIZE_MAX+1]; // Buffer Radio + uint8_t BufferSize = BUFFER_SIZE_MAX ; // Size of the buffer + + RxLed = 1 ; // Show the reception + + printf( "*** LORA *** RX DONE \r\n" ); + valueTimeLoop = timerRadio.read_ms () ; + timerRadio.stop () ; + watchDogRx.detach () ; + //printf( "*** LORA *** DISARM watchDogRx \r\n" ); + + Radio.GetPacketStatus(&packetStatus) ; + RssiValue = packetStatus.LoRa.RssiPkt ; + + memset ( &Buffer1 , 0x00, BUFFER_SIZE_MAX ); + Radio.GetPayload ( Buffer1, &BufferSize, BUFFER_SIZE_MAX ); + + RxLed = 0 ; // Show the reception + + Buffer1[7] = 0 ; + + printf ( "*** LORA *** RX DONE => %s \r\n", Buffer1 ); wait(1) ; // flush serial + + // Extract value + + switch (Buffer1[2]) { + case '1': RF_FREQUENCY = 2400000000UL ; break ; + case '2': RF_FREQUENCY = 2400680000UL ; break ; + case '3': RF_FREQUENCY = 2423840000UL ; break ; + case '4': RF_FREQUENCY = 2424520000UL ; break ; + case '5': RF_FREQUENCY = 2448840000UL ; break ; + case '6': RF_FREQUENCY = 2449520000UL ; break ; + case '7': RF_FREQUENCY = 2473840000UL ; break ; + case '8': RF_FREQUENCY = 2474520000UL ; break ; + } + + switch (Buffer1[3]) { + case '1': LORA_BW = LORA_BW_0200 ; break ; + case '2': LORA_BW = LORA_BW_0400 ; break ; + case '3': LORA_BW = LORA_BW_0800 ; break ; + case '4': LORA_BW = LORA_BW_1600 ; break ; + } + + switch (Buffer1[4]) { + case '1': TX_OUTPUT_POWER = -18 ; break ; + case '2': TX_OUTPUT_POWER = 0 ; break ; + case '3': TX_OUTPUT_POWER = 8 ; break ; + case '4': TX_OUTPUT_POWER = 10 ; break ; + case '5': TX_OUTPUT_POWER = 13 ; break ; + } + + switch (Buffer1[5]) { + case '1': LORA_SF = LORA_SF5 ; break ; + case '2': LORA_SF = LORA_SF6 ; break ; + case '3': LORA_SF = LORA_SF7 ; break ; + case '4': LORA_SF = LORA_SF8 ; break ; + case '5': LORA_SF = LORA_SF9 ; break ; + case '6': LORA_SF = LORA_SF10 ; break ; + case '7': LORA_SF = LORA_SF12 ; break ; + } + + int OLD_TIMER = TIMER ; + + switch (Buffer1[6]) { + case '1': TIMER = 50 ; break ; + case '2': TIMER = 75 ; break ; + case '3': TIMER = 125 ; break ; + case '4': TIMER = 250 ; break ; + case '5': TIMER = 500 ; break ; + case '6': TIMER = 1000 ; break ; + case '7': TIMER = 2000 ; break ; + } + + RxLed = 0 ; + + if (oldFreq != Buffer1[2] || oldBw != Buffer1[3] || oldPwr != Buffer1[4] || oldSf != Buffer1[5] || oldTimer != Buffer1[6] ) { + oldFreq = Buffer1[2] ; + oldBw = Buffer1[3] ; + oldPwr = Buffer1[4] ; + oldSf = Buffer1[5] ; + oldTimer = Buffer1[6] ; + //printf ( "*** LORA *** Reset Radio \r\n" ); + //app.updateDisplay ( LORA_SF, LORA_BW, TX_OUTPUT_POWER, BUFFER_SIZE_MAX, RF_FREQUENCY, TIMER ) ; + } + + if (OLD_TIMER != TIMER) { + //wakeUpTerminal.detach (); + //wakeUpTerminal.attach (&wakeUpTerminalFunction, (float) TIMER/1000); + } +} +//============================================================================== + +void OnTxTimeout ( void ) { AppState = APP_TX_TIMEOUT ;} +void OnRxTimeout ( void ) { AppState = APP_RX_TIMEOUT ; } +void OnRxError ( IrqErrorCode_t errorCode ) { AppState = APP_RX_ERROR ; } +void OnRangingDone ( IrqRangingCode_t val ) { } +void OnCadDone ( bool channelActivityDetected ){ } + +
diff -r 14a8da4108d5 -r 5a436163dddf Lorah.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lorah.txt Mon Oct 22 09:37:50 2018 +0000 @@ -0,0 +1,19 @@ +/* + * MISNet + * + * Lora: Radio Management + * + * Created on: August 17, 2018 Author: Francis CHATAIN + * + */ +#ifndef __LORA_H__ +#define __LORA_H__ + +#include "mbed.h" +#include "sx1280-hal.h" + + +void initLora(uint32_t rf,RadioLoRaBandwidths_t bw,RadioLoRaSpreadingFactors_t sf,int8_t pwr) ; +void sendMessageLora () ; + +#endif \ No newline at end of file
diff -r 14a8da4108d5 -r 5a436163dddf Radio.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Radio.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -0,0 +1,436 @@ +/* + * MISNet + * + * TERMINAL Radio module + * + * Created on: September 19, 2018 Author: Francis CHATAIN + * + */ + +// ================================================================= INCLUDES + +#include "mbed.h" +#include "main.h" +#include "Radio.h" +#include "sx1280-hal.h" +#include <string.h> + + +// ================================================================= VARIABLE & DEFINE + +extern "C"{ + int _getpid () { return -1;} + int _kill (int pid, int sig) { return -1; } + extern int _write () ; //{return -1;} +} + +//DigitalOut ledReceive (PA_8) ; +//DigitalOut ledSend (PB_13) ; +DigitalOut ledReceive (A5) ; +DigitalOut ledSend (A4) ; + + +/****************************************************************************** + * Declaration of RADIO variables and function + *****************************************************************************/ + +// FEM TxEN:PB3 RxEN:PB9 +//DigitalOut femTx (PB_3); +//DigitalOut femRx (PB_9); + +#define BUFFER_SIZE 100 +uint8_t BufferSize = BUFFER_SIZE; +uint8_t Buffer[BUFFER_SIZE]; + +int8_t RssiValue = 0 ; +int8_t SnrValue = 0 ; + +typedef enum { APP_IDLE=0, APP_LOWPOWER, APP_RX, APP_RX_TIMEOUT, APP_RX_ERROR, APP_TX, APP_TX_TIMEOUT,} AppStates_t; +AppStates_t AppState = APP_LOWPOWER ; + +ModulationParams_t ModulationParams ; +ModulationParams_t ModulationParamsEmitter ; +ModulationParams_t ModulationParamsReceiver; + +PacketParams_t PacketParamsReceiver ; +PacketStatus_t PacketStatusReceiver ; + +PacketParams_t PacketParamsEmitter ; + + +// Radio Callback event +void OnTxDone (void) { AppState = APP_TX ; } +void OnRxDone (void) { AppState = APP_RX ; } +void OnTxTimeout (void) { AppState = APP_TX_TIMEOUT ; } +void OnRxTimeout (void) { AppState = APP_RX_TIMEOUT ; } +void OnRxError (IrqErrorCode_t errorCode) { AppState = APP_RX_ERROR ; } +void OnRangingDone (IrqRangingCode_t val) { } +void OnCadDone (bool channelActivityDetected){} + +RadioCallbacks_t callbacks ={ + &OnTxDone , &OnRxDone , // tx / rx Done + NULL , NULL , // syncWordDone headerDone + &OnTxTimeout , &OnRxTimeout , // txTimeout rxTimeout + &OnRxError , // rxError + NULL , NULL , // rangingDone / cadDone +}; + +// Timeout callback +#define TX_TIMEOUT_VALUE 100 // ms +#define RX_TIMEOUT_VALUE 0x00000000 // or 100 (ms) +#define RX_TIMEOUT_TICK_SIZE RADIO_TICK_SIZE_1000_US + +uint16_t RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT ; +uint16_t TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT ; + + +int8_t rssi=0, snr=0; + +// SX1280 MOSI:PA7 MISO:PA6 CLK:PA5 CS:PA4 BSY:PB7 DIO1:PB6 DIO2:PB5 DIO3:PB4 RST:PB8 +// SX1280Hal Radio (PA_7, PA_6, PA_5, PA_4, PB_7, PB_6, PB_5, PB_4, PB_8, &callbacks);//mosi miso clk cs bsy dio1 dio2 dio3 rst [DONGLE] +SX1280Hal Radio ( D11 , D12 , D13 , D7 , D3 , D5 , NC , NC , A0 , &callbacks ); // [NUCLEO] + +//Radio Factory Parameter Sender and Receiver only diff the Central Frequency emetter are shited by 800 Mhz +uint8_t _modulation = PACKET_TYPE_LORA; +int _spreadingFactor = 2 ; +int _bandWidth = 1 ; +int _codingRate = 0 ; +unsigned long _frequencySend = 2400000000UL ; +unsigned long _frequencyReceive = 2400000000UL ; +int _outputPower = 13 ; // -18 to +13 dBm +int _size = 10 ; + +int _iq = 1 ; +int _crc = 0 ; +uint8_t _ar[] = { 0xDD, 0xA0, 0x96, 0x69, 0xDD } ; // only used in GENERIC and BLE mode +uint8_t _crcSeedLocal[3] = { 0x00, 0x45, 0x67 } ; // only used in GFSK, FLRC + + +// Futur use with FLRC modulation +//int _mode = 4 ; +//int _modeShape = 1 ; +//int _modeIndex = 2 ; +//int _whitening = 1 ; +//int _bitrateBandwidth = 12 ; + +// ============================================================================================ Declaration Internal function + +RadioLoRaCodingRates_t returnCrLORA (int index) ; +RadioLoRaSpreadingFactors_t returnSfLORA (int index) ; +RadioLoRaBandwidths_t returnBwLORA (int index) ; + +void setFemTxRx (bool tx) ; // only if FEM HW + +/* Evolution FLRC + * RadioCrcTypes_t returnCrcLen (int index) ; + * RadioFlrcBitrates_t returnBrbwFLRC (int index) ; + * RadioFlrcCodingRates_t returnCrFLRC (int index) ; + * RadioModShapings_t returnMs (int index) ; + */ + +// ============================================================================================ EXTERNAL FUNCTION + + +// ============================================================================================ Radio Self Test + +bool radioSelfTest (uint16_t *rev) { + Radio.Init(); + *rev = Radio.GetFirmwareVersion () ; + // printf("*** RAD_ *** Selftest : Firmware R%u\r\n", rev); + wait(0.2); + //printf((rev==0xffff?"Self test FAIL\r\n":"Self test PASS\r\n")); + if (*rev==0xffff) return false ; + else return true ; +} + +// ============================================================================================ Radio Initialisation + + +void radioInitReceiver (RadioParameter radioParameter ) { + _modulation = radioParameter.modulation ; + _spreadingFactor = radioParameter.spreadingFactor ; + _bandWidth = radioParameter.bandWidth ; + _codingRate = radioParameter.codingRate ; + _frequencyReceive = radioParameter.frequency ; + + if( _modulation == PACKET_TYPE_LORA ) { + ModulationParamsReceiver.PacketType = PACKET_TYPE_LORA; + ModulationParamsReceiver.Params.LoRa.SpreadingFactor = returnSfLORA (_spreadingFactor) ; + ModulationParamsReceiver.Params.LoRa.Bandwidth = returnBwLORA (_bandWidth) ; + ModulationParamsReceiver.Params.LoRa.CodingRate = returnCrLORA (_codingRate) ; + PacketParamsReceiver.PacketType = PACKET_TYPE_LORA; + PacketParamsReceiver.Params.LoRa.PreambleLength = 0x08; + PacketParamsReceiver.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; + PacketParamsReceiver.Params.LoRa.PayloadLength = 7 ; + PacketParamsReceiver.Params.LoRa.Crc = _crc==1?LORA_CRC_ON:LORA_CRC_OFF; + PacketParamsReceiver.Params.LoRa.InvertIQ = _iq==1?LORA_IQ_INVERTED:LORA_IQ_NORMAL; + //Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength; + } +} + +void radioInitEmitter (RadioParameter radioParameter ) { + _modulation = radioParameter.modulation ; + _spreadingFactor = radioParameter.spreadingFactor ; + _bandWidth = radioParameter.bandWidth ; + _codingRate = radioParameter.codingRate ; + _size = radioParameter.size ; + _frequencySend = radioParameter.frequency ; + + if( _modulation == PACKET_TYPE_LORA ) { + ModulationParamsEmitter.PacketType = PACKET_TYPE_LORA ; + ModulationParamsEmitter.Params.LoRa.SpreadingFactor = returnSfLORA (_spreadingFactor) ; + ModulationParamsEmitter.Params.LoRa.Bandwidth = returnBwLORA (_bandWidth) ; + ModulationParamsEmitter.Params.LoRa.CodingRate = returnCrLORA (_codingRate) ; + PacketParamsEmitter.PacketType = PACKET_TYPE_LORA ; + PacketParamsEmitter.Params.LoRa.PreambleLength = 0x08 ; + PacketParamsEmitter.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH ; + PacketParamsEmitter.Params.LoRa.PayloadLength = _size ; + PacketParamsEmitter.Params.LoRa.Crc = _crc==1?LORA_CRC_ON:LORA_CRC_OFF ; + PacketParamsEmitter.Params.LoRa.InvertIQ = _iq==1?LORA_IQ_INVERTED:LORA_IQ_NORMAL; + //Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength; + } +} + + +void radioInitRadio () { + Radio.SetStandby ( STDBY_RC ) ; + Radio.SetCrcSeed ( _crcSeedLocal ) ; + Radio.SetCrcPolynomial ( 0x0123 ) ; + Radio.SetPollingMode ( ) ; + Radio.SetBufferBaseAddresses ( 0x00, 0x00 ) ; + Radio.SetSyncWord ( 1, _ar ) ; +} + +void radioStartReceive (RadioParameter radioParameter) { + _frequencyReceive = radioParameter.frequency ; + _outputPower = radioParameter.outputPower ; + +// setFemTxRx (0) ; + ledSend = 0 ; + ledReceive = 0 ; + + Radio.SetPacketType ( ModulationParamsReceiver.PacketType ) ; + Radio.SetModulationParams ( &ModulationParamsReceiver ) ; + Radio.SetPacketParams ( &PacketParamsReceiver ) ; + Radio.SetRfFrequency ( _frequencyReceive ) ; + Radio.SetDioIrqParams ( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ) ; + Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; + + AppState = APP_LOWPOWER ; + memset ( &Buffer , 0x00, BufferSize ) ; +} + + +void radioSend (RadioParameter radioParameter, uint8_t *frame, uint8_t len) { + _frequencySend = radioParameter.frequency ; + _outputPower = radioParameter.outputPower ; + + ledSend = 1 ; + ledReceive = 0 ; +// setFemTxRx(1); + + Radio.SetPacketType ( ModulationParamsEmitter.PacketType ) ; + Radio.SetModulationParams ( &ModulationParamsEmitter ) ; + Radio.SetPacketParams ( &PacketParamsEmitter ) ; + Radio.SetRfFrequency ( _frequencySend ) ; + Radio.SetTxParams ( _outputPower, RADIO_RAMP_20_US ) ; + Radio.SetDioIrqParams ( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); + Radio.SendPayload ( frame, len, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } ); +} + +// ============================================================================================ Radio Handler +bool radioHandler(uint8_t *frame, uint8_t *len, int8_t *rssi, int8_t *snr){ + + bool event = false ; + Radio.ProcessIrqs(); + switch( AppState ) { + case APP_RX: + printf ("*** RADIO *** radioHandler APP RX \r\n"); + AppState = APP_LOWPOWER; + memset ( &Buffer , 0, BUFFER_SIZE ) ; + ledReceive = !ledReceive; + Radio.GetPayload( Buffer, len, BUFFER_SIZE ); + //cdc2->printf ("APP-RX Buffer = %s\r\n", Buffer); + //showRssiSnr () ; + Radio.GetPacketStatus(&PacketStatusReceiver); + *rssi = PacketStatusReceiver.LoRa.RssiPkt; + *snr = PacketStatusReceiver.LoRa.SnrPkt; + memcpy (frame, Buffer, *len) ; + event = true ; + //printBytes (Buffer, 30) ; + setFemTxRx(0); + Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); + Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); + ledReceive = !ledReceive; + break; + + case APP_TX: + printf ("*** RADIO *** radioHandler APP TX \r\n"); + AppState = APP_LOWPOWER; + //cdc2->printf ("APP-TX \r\n"); + setFemTxRx(0); // if fem + Radio.SetPacketType ( ModulationParamsReceiver.PacketType ) ; + Radio.SetModulationParams ( &ModulationParamsReceiver ) ; + Radio.SetPacketParams ( &PacketParamsReceiver ) ; + Radio.SetRfFrequency ( _frequencyReceive ) ; + + Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); + Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); + ledSend = 0 ; + break; + + case APP_RX_TIMEOUT: + printf ("*** RADIO *** radioHandler APP RX Timeout \r\n"); + AppState = APP_LOWPOWER; + setFemTxRx(0); + Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); + Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); + break; + + case APP_RX_ERROR: + AppState = APP_LOWPOWER; + break; + + case APP_TX_TIMEOUT: + printf ("*** RADIO *** radioHandler APP TX Timeout \r\n"); + AppState = APP_LOWPOWER; + //cdc2->printf ("APP-TX \r\n"); + setFemTxRx(0); + Radio.SetPacketType ( ModulationParamsReceiver.PacketType ) ; + Radio.SetModulationParams ( &ModulationParamsReceiver ) ; + Radio.SetPacketParams ( &PacketParamsReceiver ) ; + Radio.SetRfFrequency ( _frequencyReceive ) ; + + Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); + Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); + ledSend = 0 ; + break; + + case APP_LOWPOWER: + break; + + default: + // Set low power + break; + } + return event ; +} + + + + +// ====================================================================================================== INTERNAL FUNCTION + +RadioLoRaCodingRates_t returnCrLORA (int index) { + // coding rate for LoRa + switch(index){ + case 0: return LORA_CR_4_5; + case 1: return LORA_CR_4_6; + case 2: return LORA_CR_4_7; + case 3: return LORA_CR_4_8; + case 4: return LORA_CR_LI_4_5; + case 5: return LORA_CR_LI_4_6; + case 6: return LORA_CR_LI_4_7; + default : return LORA_CR_4_5; + } +} + + +// SF for LoRa +RadioLoRaSpreadingFactors_t returnSfLORA(int index) { + switch(index){ + case 0: return LORA_SF5 ; + case 1: return LORA_SF6 ; + case 2: return LORA_SF7 ; + case 3: return LORA_SF8 ; + case 4: return LORA_SF9 ; + case 5: return LORA_SF10; + case 6: return LORA_SF11; + case 7: return LORA_SF12; + default : return LORA_SF7 ; + } +} +RadioModShapings_t returnMs(int index){ + // shaping for FLRC GFSK and BLE + switch(index){ + case 0: return RADIO_MOD_SHAPING_BT_OFF ; + case 1: return RADIO_MOD_SHAPING_BT_1_0 ; + case 2: return RADIO_MOD_SHAPING_BT_0_5 ; + default : return RADIO_MOD_SHAPING_BT_1_0 ; + } +} +RadioLoRaBandwidths_t returnBwLORA(int index){ + // bandwidth for LoRa + switch(index){ + case 0: return LORA_BW_0200 ; + case 1: return LORA_BW_0400 ; + case 2: return LORA_BW_0800 ; + case 3: return LORA_BW_1600 ; + default : return LORA_BW_1600 ; + } +} + + +void setFemTxRx(bool tx) { + /* Hoel module + if (tx) { femTx=1 ; femRx=0 ; } + else { femRx=1 ; femTx=0 ; } + */ +} + + +/* Futur Use + * + * else if( _modulation == PACKET_TYPE_FLRC ) { + ModulationParams.PacketType = PACKET_TYPE_FLRC; + ModulationParams.Params.Flrc.BitrateBandwidth = returnBrbwFLRC (_bitrateBandwidth);// FLRC_BR_0_260_BW_0_3; + ModulationParams.Params.Flrc.CodingRate = returnCrFLRC (codingRate);//FLRC_CR_1_2; + ModulationParams.Params.Flrc.ModulationShaping = returnMs (_modeShape);//RADIO_MOD_SHAPING_BT_1_0; + PacketParams.PacketType = PACKET_TYPE_FLRC; + PacketParams.Params.Flrc.PreambleLength = PREAMBLE_LENGTH_32_BITS; + PacketParams.Params.Flrc.SyncWordLength = FLRC_SYNCWORD_LENGTH_4_BYTE; + PacketParams.Params.Flrc.SyncWordMatch = RADIO_RX_MATCH_SYNCWORD_1; + PacketParams.Params.Flrc.HeaderType = RADIO_PACKET_VARIABLE_LENGTH; + PacketParams.Params.Flrc.PayloadLength = 32 ; + PacketParams.Params.Flrc.CrcLength = RADIO_CRC_3_BYTES; + PacketParams.Params.Flrc.Whitening = _whitening==1?RADIO_WHITENING_ON:RADIO_WHITENING_OFF;//RADIO_WHITENING_OFF; + //Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Flrc.PayloadLength; + } + * + * + * + *RadioFlrcBitrates_t returnBrbwFLRC(int index){ + // bitrate and bandwidth for FLRC + switch(index){ + case 0: return FLRC_BR_1_300_BW_1_2; + case 1: return FLRC_BR_1_040_BW_1_2; + case 2: return FLRC_BR_0_650_BW_0_6; + case 3: return FLRC_BR_0_520_BW_0_6; + case 4: return FLRC_BR_0_325_BW_0_3; + case 5: return FLRC_BR_0_260_BW_0_3; + default : return FLRC_BR_1_300_BW_1_2; + } +} +RadioFlrcCodingRates_t returnCrFLRC(int index){ + switch(index){ + case 0: return FLRC_CR_1_2; + case 1: return FLRC_CR_3_4; + case 2: return FLRC_CR_3_4; + default : return FLRC_CR_1_2; + } +} + +RadioCrcTypes_t returnCrcLen(int index){ + // CRC length for GFSK and FLRC + switch(index){ + case 0: return RADIO_CRC_OFF; + case 1: return RADIO_CRC_1_BYTES; + case 2: return RADIO_CRC_2_BYTES; + case 3: return RADIO_CRC_3_BYTES; + default : return RADIO_CRC_OFF; + } +} + * + * + * + */
diff -r 14a8da4108d5 -r 5a436163dddf Radio.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Radio.h Mon Oct 22 09:37:50 2018 +0000 @@ -0,0 +1,41 @@ +/* + * lora.h + * + * Created on: 2 sept. 2018 + * Author: F.Chatain + */ + +#ifndef RADIO_H_ +#define RADIO_H_ + +#include "sx1280.h" +#include "mbed.h" +//#include "main.h" + + +#define FRAME_SIZE 100 +#define COMMANDLINE_SIZE 100 + +typedef struct { + uint8_t modulation ; // LORA / FLRC + int spreadingFactor ; // SFx + int bandWidth ; // 200 400 ... + int codingRate ; // 4/5 + unsigned long frequency ; // en Hz + int outputPower ; // -18 to 13 (ne pas dépasser 5 FEM en service) + int size ; // message size +} RadioParameter ; + + +bool radioSelfTest (uint16_t *rev) ; +void radioInitEmitter (RadioParameter radioParameter ); +void radioInitReceiver (RadioParameter radioParameter ); + +void radioInitRadio () ; +void radioSend (RadioParameter radioParameter, uint8_t *frame, uint8_t len ) ; +void radioStartReceive (RadioParameter radioParameter); +bool radioHandler (uint8_t *frame, uint8_t *len, int8_t *rssi, int8_t *snr); + +//void usbHandler (USBSerial *cdc) ; + +#endif /* RADIO_H_ */
diff -r 14a8da4108d5 -r 5a436163dddf Service.cpp --- a/Service.cpp Tue Oct 16 07:29:51 2018 +0000 +++ b/Service.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -2,7 +2,7 @@ using namespace misnet; -Service::Service(DEVICE_TYPE type, +Service::Service( DEVICE_TYPE type, MISNET_CODE misnet_code, STATE state, ACCESS_TYPE access_type,
diff -r 14a8da4108d5 -r 5a436163dddf Service.hpp --- a/Service.hpp Tue Oct 16 07:29:51 2018 +0000 +++ b/Service.hpp Mon Oct 22 09:37:50 2018 +0000 @@ -28,6 +28,7 @@ public: typedef uint8_t MISNET_CODE ; + typedef uint8_t DEVICE_TYPE ; // FC to compile enum SERVICE_TYPE { SENSOR = 1, @@ -90,7 +91,7 @@ } ; // Constructor - /* + Service( DEVICE_TYPE type, MISNET_CODE misnet_code, STATE state, @@ -105,7 +106,7 @@ ACTION action, OUTPUT_MODE output_mode, std::string comment); -*/ + virtual ~Service() { }
diff -r 14a8da4108d5 -r 5a436163dddf Tftlcd.cpp --- a/Tftlcd.cpp Tue Oct 16 07:29:51 2018 +0000 +++ b/Tftlcd.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -795,11 +795,16 @@ //========================================================================================= void Tftlcd::Update (uint32_t freq, uint16_t bw, uint8_t sf, int8_t pwr, uint8_t bsz, uint16_t timeM ) { //========================================================================================= - sprintf (bufferDisplay, "SF/BW : %1d / %03d " , sf/16, bw); tft2.drawString (40,190,bufferDisplay) ; // SFX - sprintf (bufferDisplay, "POWER : %d " , pwr) ; tft2.drawString (40,210,bufferDisplay) ; // POWER - sprintf (bufferDisplay, "SIZE : %2d " , bsz) ; tft2.drawString (40,230,bufferDisplay) ; // Buffer size - sprintf (bufferDisplay, "TIMER : %04d " , timeM) ; tft2.drawString (40,250,bufferDisplay) ; // Timer - sprintf (bufferDisplay, "FREQ : %lu " , freq) ; tft2.drawString (40,286,bufferDisplay) ; // Frequency + printf( "*** TFTL *** Update Radio values\r\n") ; + + sprintf (bufferDisplay, "SF/BW : %1d / %03d " , sf/16, bw); tft2.drawString (40,190,bufferDisplay) ; // SFX + sprintf (bufferDisplay, "POWER : %d " , pwr) ; tft2.drawString (40,210,bufferDisplay) ; // POWER + sprintf (bufferDisplay, "SIZE : %2d " , bsz) ; tft2.drawString (40,230,bufferDisplay) ; // Buffer size + sprintf (bufferDisplay, "TIMER : %04d " , timeM) ; tft2.drawString (40,250,bufferDisplay) ; // Timer + sprintf (bufferDisplay, "FREQ : %lu " , freq) ; tft2.drawString (40,286,bufferDisplay) ; // Frequency + + printf( "*** TFTL *** Update Radio values Done \r\n") ; + } //=========================================================================================
diff -r 14a8da4108d5 -r 5a436163dddf main.cpp --- a/main.cpp Tue Oct 16 07:29:51 2018 +0000 +++ b/main.cpp Mon Oct 22 09:37:50 2018 +0000 @@ -15,20 +15,33 @@ #include "main.h" #include "Controller.hpp" +#include "Radio.h" + using namespace std; using namespace misnet; // INSTANCE of CONTROLLER OBJECT -Controller app ; // Core of controller start also +Controller controller ; // Core of controller start also + +// --------------------- A mettre dans la database +RadioParameter radioParam ; // Serial Read +RadioParameter radioParamFactory ; // Contain Factory +RadioParameter radioParamEmitter ; // Contain Config Emet +RadioParameter radioParamReceiver ; // Contain Config Receiver +ModeParameter modeParam ; // Mission Mode + + +// A deplacer +static char *print_double ( char* str, double v, int decimalDigits=2) ; //****************************************************************************** // Timers //****************************************************************************** uint16_t TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening = 0L ; -volatile uint32_t listenFlag=0, syncFlag=0, goodHealthFlag=0, payloadFlag=0, irqFlag=0; +volatile uint32_t listenFlag=0, syncFlag=0, goodHealthFlag=0, payloadFlag=0, irqFlag=0, statPayLoadCounter = 0 ; LowPowerTicker wakeUpPayload ; // normal wake up void wakeUpPayloadCallback (void) ; @@ -55,11 +68,11 @@ // ============================================================================ Setup void setup () { - app.start (); // Start contgroller + controller.start (); // Start controller // -------------------------------------------------- Scheduler by IRQ or watch dog - app.getScheduling (TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening) ; // What mode ? + controller.getScheduling (TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening) ; // What mode ? wakeUpPayload.attach (&wakeUpPayloadCallback, (float)TimerPayload ) ; // Mode A + All Mode wakeUpGoodhealth.attach (&wakeUpGoodhealthCallback, (float)TimerGoodhealth) ; // Mode A + All Mode @@ -71,8 +84,40 @@ wakeUpListening.attach (&wakeUpListeningCallback,(float)TimerListening) ; // Mode C - // TODO : Assicier l'IRQ du TAC switch au handler d'exception wakeUpIrqTacSwitch + // TODO : Associer l'IRQ du TAC switch au handler d'exception wakeUpIrqTacSwitch + + // ============================ A mettre dans l'init de la database et de la radio + radioParamFactory.modulation = PACKET_TYPE_LORA ; + radioParamFactory.spreadingFactor = 2 ; + radioParamFactory.bandWidth = 1 ; + radioParamFactory.codingRate = 0 ; + radioParamFactory.frequency = 2400000000UL ; + radioParamFactory.outputPower = -18 ; + + radioParamReceiver = radioParamFactory ; + radioParam = radioParamFactory ; + radioParamFactory.outputPower = 0 ; + radioParamEmitter = radioParamFactory ; + + modeParam.addrType = 1 ; + modeParam.terminalAddr = 1 ; + modeParam.subnetAddr = 0 ; + modeParam.raw[0] = GENERIC_MODE ; + modeParam.raw[1] = 0x01 ; + + uint16_t FIRMWARE_Radio = 0 ; + bool radioStatus ; // Status I/F + radioStatus = radioSelfTest (&FIRMWARE_Radio) ; // Radio Test + + if (radioStatus) printf ("*** MAIN *** RADIO OK \r\n"); else printf ("*** MAIN *** RADIO NOK \r\n") ; + + radioInitEmitter ( radioParamEmitter ) ; + radioInitReceiver ( radioParamReceiver) ; + radioInitRadio () ; + //radioStartReceive (radioParamReceiver) ; + + printf ("*** MAIN *** SETUP End \r\n"); } //============================================================================== @@ -80,32 +125,73 @@ // ============================================================================= LOOP void loop () { + + // A deplacer + #define FRAME_SIZE 100 + uint8_t frame[FRAME_SIZE] ; + char message[FRAME_SIZE], buffer1[FRAME_SIZE] ; + uint8_t _len ; + int8_t _rssi ; + int8_t _snr ; + while(1) { + if(listenFlag){ // Listen radio + printf ("*** MAIN *** LOOP : wakeUpListeningCallback \r\n"); listenFlag=0; - app.manageListening(); - printf ("*** MAIN *** wakeUpListeningCallback \r\n"); + controller.manageListening(); } if(syncFlag){ // Prepare response + printf ("*** MAIN *** LOOP : wakeUpSynchroCallback \r\n"); syncFlag=0; - app.manageSynchro(); - printf ("*** MAIN *** wakeUpSynchroCallback \r\n"); + controller.manageSynchro(); } if(goodHealthFlag){ // Prepare response + printf ("*** MAIN *** LOOP : wakeUpGoodhealthCallback r\n"); goodHealthFlag=0; - app.manageGoodhealth(); - printf ("*** MAIN *** wakeUpGoodhealthCallback r\n"); + controller.manageGoodhealth(); } if(payloadFlag){ // read Sensors + printf ("*** MAIN *** LOOP : wakeUpPayloadCallback cptr=%d\r\n", statPayLoadCounter); payloadFlag=0; - app.manageSensors(); - printf ("*** MAIN *** wakeUpPayloadCallback \r\n"); + //controller.manageSensors(); + // To test ciphering and radio send a simple message + + memset ( &frame , 0 , FRAME_SIZE ) ; + memset ( &message , 0 , FRAME_SIZE ) ; + // Fab a simple test message + frame[0] = 200 ; + frame[1] = 55 ; + frame[2] = 'T' ; + frame[3] = 'E' ; + frame[4] = 'S' ; + frame[5] = 'T' ; + frame[6] = 'S' ; + + int n = sprintf ( message, "%c%c___%s___", + 0x42, + 55, + print_double (buffer1, statPayLoadCounter)); + + memcpy ( frame , message , FRAME_SIZE ); + + // Send Message + _len = strlen (message) ; + radioParamEmitter.size = _len ; + radioInitEmitter (radioParamEmitter) ; + radioSend (radioParamEmitter, frame, _len); + memset ( &frame , 0 , FRAME_SIZE ) ; } + + if (radioHandler (frame, &_len, &_rssi, &_snr) ) { + printf ("*** MAIN *** LOOP : radioHandler \r\n"); + } + if(irqFlag){ // handle IRQ actions + printf ("*** MAIN *** LOOP : wakeUpIrqTacSwitch \r\n"); irqFlag=0; - app.manageConfiguration(); - printf ("*** MAIN *** wakeUpIrqTacSwitch \r\n"); - } + controller.manageConfiguration(); + } // deepsleep (); // breaks UART //sleep () ; wait(1); @@ -128,7 +214,8 @@ // ============================================================ WATCH DOG PAYLOAD void wakeUpPayloadCallback (void) { - //printf ("*** MAIN *** wakeUpPayloadCallback \r\n"); + statPayLoadCounter++ ; + //printf ("*** MAIN *** wakeUpPayloadCallback : %d \r\n", statPayLoadCounter); //app.manageSensors () ; // read Sensors payloadFlag=1; } @@ -157,6 +244,42 @@ //***************************************************************************** +// A deplacer + +/* 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; +} -