Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
FCH_31
Date:
Mon Oct 22 09:37:50 2018 +0000
Revision:
41:5a436163dddf
Parent:
21:8524d815c587
avec radio;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FCH_31 8:cd489b7c49a0 1 /*
FCH_31 8:cd489b7c49a0 2 * MISNet
FCH_31 8:cd489b7c49a0 3 *
FCH_31 8:cd489b7c49a0 4 * Main TERMINAL VERSION HALF DUPLEX
FCH_31 8:cd489b7c49a0 5 *
FCH_31 8:cd489b7c49a0 6 * Created on: August 17, 2018 Author: Francis CHATAIN
FCH_31 8:cd489b7c49a0 7 *
FCH_31 8:cd489b7c49a0 8 */
FCH_31 8:cd489b7c49a0 9
GregCr 1:22e02d1cfbca 10 #include "mbed.h"
GregCr 1:22e02d1cfbca 11 #include "sx1280-hal.h"
FCH_31 3:3adb454ba1d2 12 #include "stdio.h"
FCH_31 8:cd489b7c49a0 13 #include <string>
GregCr 1:22e02d1cfbca 14
FCH_31 8:cd489b7c49a0 15 #include "main.h"
patrick_duc 21:8524d815c587 16 #include "Controller.hpp"
FCH_31 7:1d890cab51bd 17
FCH_31 41:5a436163dddf 18 #include "Radio.h"
FCH_31 41:5a436163dddf 19
FCH_31 7:1d890cab51bd 20
FCH_31 8:cd489b7c49a0 21 using namespace std;
patrick_duc 20:b0281e8a375a 22 using namespace misnet;
GregCr 1:22e02d1cfbca 23
patrick_duc 21:8524d815c587 24 // INSTANCE of CONTROLLER OBJECT
GregCr 1:22e02d1cfbca 25
FCH_31 41:5a436163dddf 26 Controller controller ; // Core of controller start also
FCH_31 41:5a436163dddf 27
FCH_31 41:5a436163dddf 28 // --------------------- A mettre dans la database
FCH_31 41:5a436163dddf 29 RadioParameter radioParam ; // Serial Read
FCH_31 41:5a436163dddf 30 RadioParameter radioParamFactory ; // Contain Factory
FCH_31 41:5a436163dddf 31 RadioParameter radioParamEmitter ; // Contain Config Emet
FCH_31 41:5a436163dddf 32 RadioParameter radioParamReceiver ; // Contain Config Receiver
FCH_31 41:5a436163dddf 33 ModeParameter modeParam ; // Mission Mode
FCH_31 41:5a436163dddf 34
FCH_31 41:5a436163dddf 35
FCH_31 41:5a436163dddf 36 // A deplacer
FCH_31 41:5a436163dddf 37 static char *print_double ( char* str, double v, int decimalDigits=2) ;
FCH_31 2:57f098de07c7 38
FCH_31 2:57f098de07c7 39
FCH_31 8:cd489b7c49a0 40 //******************************************************************************
lo 15:9c1c4368670f 41 // Timers
FCH_31 8:cd489b7c49a0 42 //******************************************************************************
FCH_31 8:cd489b7c49a0 43 uint16_t TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening = 0L ;
FCH_31 41:5a436163dddf 44 volatile uint32_t listenFlag=0, syncFlag=0, goodHealthFlag=0, payloadFlag=0, irqFlag=0, statPayLoadCounter = 0 ;
lo 15:9c1c4368670f 45
FCH_31 8:cd489b7c49a0 46 LowPowerTicker wakeUpPayload ; // normal wake up
FCH_31 8:cd489b7c49a0 47 void wakeUpPayloadCallback (void) ;
FCH_31 7:1d890cab51bd 48
FCH_31 8:cd489b7c49a0 49 LowPowerTicker wakeUpGoodhealth ; // GoodHealth wake up
FCH_31 8:cd489b7c49a0 50 void wakeUpGoodhealthCallback (void) ;
FCH_31 7:1d890cab51bd 51
FCH_31 8:cd489b7c49a0 52 LowPowerTicker wakeUpSynchro ; // Synchro wake up (Mode B)
FCH_31 8:cd489b7c49a0 53 void wakeUpSynchroCallback (void) ;
FCH_31 7:1d890cab51bd 54
FCH_31 8:cd489b7c49a0 55 LowPowerTicker wakeUpListening ; // Listening wake up (Mode C)
FCH_31 8:cd489b7c49a0 56 void wakeUpListeningCallback (void) ;
FCH_31 7:1d890cab51bd 57
FCH_31 8:cd489b7c49a0 58 void setup () ; // Init Terminal
FCH_31 8:cd489b7c49a0 59 void loop () ; // Main Loop
FCH_31 10:1b37e3b41947 60 void wakeUpIrqTacSwitch () ; // IRQ Tac Switch
FCH_31 7:1d890cab51bd 61
FCH_31 7:1d890cab51bd 62
FCH_31 8:cd489b7c49a0 63 // ============================================================================ Main
FCH_31 8:cd489b7c49a0 64 int main( ) { setup () ; loop () ; }
FCH_31 8:cd489b7c49a0 65 // ============================================================================
FCH_31 7:1d890cab51bd 66
FCH_31 7:1d890cab51bd 67
FCH_31 8:cd489b7c49a0 68 // ============================================================================ Setup
FCH_31 2:57f098de07c7 69 void setup () {
GregCr 1:22e02d1cfbca 70
FCH_31 41:5a436163dddf 71 controller.start (); // Start controller
FCH_31 8:cd489b7c49a0 72
FCH_31 8:cd489b7c49a0 73 // -------------------------------------------------- Scheduler by IRQ or watch dog
FCH_31 8:cd489b7c49a0 74
FCH_31 41:5a436163dddf 75 controller.getScheduling (TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening) ; // What mode ?
FCH_31 8:cd489b7c49a0 76
FCH_31 10:1b37e3b41947 77 wakeUpPayload.attach (&wakeUpPayloadCallback, (float)TimerPayload ) ; // Mode A + All Mode
FCH_31 10:1b37e3b41947 78 wakeUpGoodhealth.attach (&wakeUpGoodhealthCallback, (float)TimerGoodhealth) ; // Mode A + All Mode
FCH_31 8:cd489b7c49a0 79
FCH_31 8:cd489b7c49a0 80 if ( TimerSynchro !=0)
FCH_31 10:1b37e3b41947 81 wakeUpSynchro.attach (&wakeUpSynchroCallback, (float)TimerSynchro) ; // Mode B
FCH_31 8:cd489b7c49a0 82
FCH_31 8:cd489b7c49a0 83 if ( TimerSynchro !=0)
FCH_31 10:1b37e3b41947 84 wakeUpListening.attach (&wakeUpListeningCallback,(float)TimerListening) ; // Mode C
FCH_31 10:1b37e3b41947 85
FCH_31 10:1b37e3b41947 86
FCH_31 41:5a436163dddf 87 // TODO : Associer l'IRQ du TAC switch au handler d'exception wakeUpIrqTacSwitch
FCH_31 10:1b37e3b41947 88
FCH_31 41:5a436163dddf 89
FCH_31 41:5a436163dddf 90 // ============================ A mettre dans l'init de la database et de la radio
FCH_31 41:5a436163dddf 91 radioParamFactory.modulation = PACKET_TYPE_LORA ;
FCH_31 41:5a436163dddf 92 radioParamFactory.spreadingFactor = 2 ;
FCH_31 41:5a436163dddf 93 radioParamFactory.bandWidth = 1 ;
FCH_31 41:5a436163dddf 94 radioParamFactory.codingRate = 0 ;
FCH_31 41:5a436163dddf 95 radioParamFactory.frequency = 2400000000UL ;
FCH_31 41:5a436163dddf 96 radioParamFactory.outputPower = -18 ;
FCH_31 41:5a436163dddf 97
FCH_31 41:5a436163dddf 98 radioParamReceiver = radioParamFactory ;
FCH_31 41:5a436163dddf 99 radioParam = radioParamFactory ;
FCH_31 41:5a436163dddf 100 radioParamFactory.outputPower = 0 ;
FCH_31 41:5a436163dddf 101 radioParamEmitter = radioParamFactory ;
FCH_31 41:5a436163dddf 102
FCH_31 41:5a436163dddf 103 modeParam.addrType = 1 ;
FCH_31 41:5a436163dddf 104 modeParam.terminalAddr = 1 ;
FCH_31 41:5a436163dddf 105 modeParam.subnetAddr = 0 ;
FCH_31 41:5a436163dddf 106 modeParam.raw[0] = GENERIC_MODE ;
FCH_31 41:5a436163dddf 107 modeParam.raw[1] = 0x01 ;
FCH_31 41:5a436163dddf 108
FCH_31 41:5a436163dddf 109 uint16_t FIRMWARE_Radio = 0 ;
FCH_31 41:5a436163dddf 110 bool radioStatus ; // Status I/F
FCH_31 41:5a436163dddf 111 radioStatus = radioSelfTest (&FIRMWARE_Radio) ; // Radio Test
FCH_31 41:5a436163dddf 112
FCH_31 41:5a436163dddf 113 if (radioStatus) printf ("*** MAIN *** RADIO OK \r\n"); else printf ("*** MAIN *** RADIO NOK \r\n") ;
FCH_31 41:5a436163dddf 114
FCH_31 41:5a436163dddf 115 radioInitEmitter ( radioParamEmitter ) ;
FCH_31 41:5a436163dddf 116 radioInitReceiver ( radioParamReceiver) ;
FCH_31 41:5a436163dddf 117 radioInitRadio () ;
FCH_31 41:5a436163dddf 118 //radioStartReceive (radioParamReceiver) ;
FCH_31 41:5a436163dddf 119
FCH_31 41:5a436163dddf 120 printf ("*** MAIN *** SETUP End \r\n");
FCH_31 10:1b37e3b41947 121
FCH_31 8:cd489b7c49a0 122 }
FCH_31 8:cd489b7c49a0 123 //==============================================================================
FCH_31 4:41a92fbf702a 124
FCH_31 7:1d890cab51bd 125
FCH_31 8:cd489b7c49a0 126 // ============================================================================= LOOP
FCH_31 8:cd489b7c49a0 127 void loop () {
FCH_31 41:5a436163dddf 128
FCH_31 41:5a436163dddf 129 // A deplacer
FCH_31 41:5a436163dddf 130 #define FRAME_SIZE 100
FCH_31 41:5a436163dddf 131 uint8_t frame[FRAME_SIZE] ;
FCH_31 41:5a436163dddf 132 char message[FRAME_SIZE], buffer1[FRAME_SIZE] ;
FCH_31 41:5a436163dddf 133 uint8_t _len ;
FCH_31 41:5a436163dddf 134 int8_t _rssi ;
FCH_31 41:5a436163dddf 135 int8_t _snr ;
FCH_31 41:5a436163dddf 136
FCH_31 8:cd489b7c49a0 137 while(1) {
FCH_31 41:5a436163dddf 138
lo 15:9c1c4368670f 139 if(listenFlag){ // Listen radio
FCH_31 41:5a436163dddf 140 printf ("*** MAIN *** LOOP : wakeUpListeningCallback \r\n");
lo 15:9c1c4368670f 141 listenFlag=0;
FCH_31 41:5a436163dddf 142 controller.manageListening();
lo 15:9c1c4368670f 143 }
lo 15:9c1c4368670f 144 if(syncFlag){ // Prepare response
FCH_31 41:5a436163dddf 145 printf ("*** MAIN *** LOOP : wakeUpSynchroCallback \r\n");
lo 15:9c1c4368670f 146 syncFlag=0;
FCH_31 41:5a436163dddf 147 controller.manageSynchro();
lo 15:9c1c4368670f 148 }
lo 15:9c1c4368670f 149 if(goodHealthFlag){ // Prepare response
FCH_31 41:5a436163dddf 150 printf ("*** MAIN *** LOOP : wakeUpGoodhealthCallback r\n");
lo 15:9c1c4368670f 151 goodHealthFlag=0;
FCH_31 41:5a436163dddf 152 controller.manageGoodhealth();
lo 15:9c1c4368670f 153 }
lo 15:9c1c4368670f 154 if(payloadFlag){ // read Sensors
FCH_31 41:5a436163dddf 155 printf ("*** MAIN *** LOOP : wakeUpPayloadCallback cptr=%d\r\n", statPayLoadCounter);
lo 15:9c1c4368670f 156 payloadFlag=0;
FCH_31 41:5a436163dddf 157 //controller.manageSensors();
FCH_31 41:5a436163dddf 158 // To test ciphering and radio send a simple message
FCH_31 41:5a436163dddf 159
FCH_31 41:5a436163dddf 160 memset ( &frame , 0 , FRAME_SIZE ) ;
FCH_31 41:5a436163dddf 161 memset ( &message , 0 , FRAME_SIZE ) ;
FCH_31 41:5a436163dddf 162 // Fab a simple test message
FCH_31 41:5a436163dddf 163 frame[0] = 200 ;
FCH_31 41:5a436163dddf 164 frame[1] = 55 ;
FCH_31 41:5a436163dddf 165 frame[2] = 'T' ;
FCH_31 41:5a436163dddf 166 frame[3] = 'E' ;
FCH_31 41:5a436163dddf 167 frame[4] = 'S' ;
FCH_31 41:5a436163dddf 168 frame[5] = 'T' ;
FCH_31 41:5a436163dddf 169 frame[6] = 'S' ;
FCH_31 41:5a436163dddf 170
FCH_31 41:5a436163dddf 171 int n = sprintf ( message, "%c%c___%s___",
FCH_31 41:5a436163dddf 172 0x42,
FCH_31 41:5a436163dddf 173 55,
FCH_31 41:5a436163dddf 174 print_double (buffer1, statPayLoadCounter));
FCH_31 41:5a436163dddf 175
FCH_31 41:5a436163dddf 176 memcpy ( frame , message , FRAME_SIZE );
FCH_31 41:5a436163dddf 177
FCH_31 41:5a436163dddf 178 // Send Message
FCH_31 41:5a436163dddf 179 _len = strlen (message) ;
FCH_31 41:5a436163dddf 180 radioParamEmitter.size = _len ;
FCH_31 41:5a436163dddf 181 radioInitEmitter (radioParamEmitter) ;
FCH_31 41:5a436163dddf 182 radioSend (radioParamEmitter, frame, _len);
FCH_31 41:5a436163dddf 183 memset ( &frame , 0 , FRAME_SIZE ) ;
lo 15:9c1c4368670f 184 }
FCH_31 41:5a436163dddf 185
FCH_31 41:5a436163dddf 186 if (radioHandler (frame, &_len, &_rssi, &_snr) ) {
FCH_31 41:5a436163dddf 187 printf ("*** MAIN *** LOOP : radioHandler \r\n");
FCH_31 41:5a436163dddf 188 }
FCH_31 41:5a436163dddf 189
lo 15:9c1c4368670f 190 if(irqFlag){ // handle IRQ actions
FCH_31 41:5a436163dddf 191 printf ("*** MAIN *** LOOP : wakeUpIrqTacSwitch \r\n");
lo 15:9c1c4368670f 192 irqFlag=0;
FCH_31 41:5a436163dddf 193 controller.manageConfiguration();
FCH_31 41:5a436163dddf 194 }
lo 15:9c1c4368670f 195 // deepsleep (); // breaks UART
FCH_31 12:e9ec35413787 196 //sleep () ;
FCH_31 12:e9ec35413787 197 wait(1);
FCH_31 8:cd489b7c49a0 198 }
FCH_31 4:41a92fbf702a 199 }
FCH_31 8:cd489b7c49a0 200 // No action : all event by IRQ
FCH_31 8:cd489b7c49a0 201 //==============================================================================
FCH_31 7:1d890cab51bd 202
FCH_31 7:1d890cab51bd 203
FCH_31 2:57f098de07c7 204
FCH_31 10:1b37e3b41947 205
FCH_31 10:1b37e3b41947 206 // IRQ du tac switch TODO
FCH_31 10:1b37e3b41947 207 // ============================================================ IRQ TAC SWITCH
FCH_31 10:1b37e3b41947 208 void wakeUpIrqTacSwitch (void) {
lo 15:9c1c4368670f 209 //printf ("*** MAIN *** wakeUpIrqTacSwitch \r\n");
lo 15:9c1c4368670f 210 //app.manageConfiguration () ; // IRQ
lo 15:9c1c4368670f 211 irqFlag=1;
FCH_31 10:1b37e3b41947 212 }
FCH_31 10:1b37e3b41947 213
FCH_31 10:1b37e3b41947 214
FCH_31 8:cd489b7c49a0 215 // ============================================================ WATCH DOG PAYLOAD
FCH_31 8:cd489b7c49a0 216 void wakeUpPayloadCallback (void) {
FCH_31 41:5a436163dddf 217 statPayLoadCounter++ ;
FCH_31 41:5a436163dddf 218 //printf ("*** MAIN *** wakeUpPayloadCallback : %d \r\n", statPayLoadCounter);
lo 15:9c1c4368670f 219 //app.manageSensors () ; // read Sensors
lo 15:9c1c4368670f 220 payloadFlag=1;
FCH_31 7:1d890cab51bd 221 }
FCH_31 10:1b37e3b41947 222
FCH_31 8:cd489b7c49a0 223 // ============================================================ WATCH DOG GOODHEALTH
FCH_31 8:cd489b7c49a0 224 void wakeUpGoodhealthCallback (void) {
lo 15:9c1c4368670f 225 //printf ("*** MAIN *** wakeUpGoodhealthCallback ========================== \r\n");
lo 15:9c1c4368670f 226 //app.manageGoodhealth () ; // Prepare response
lo 15:9c1c4368670f 227 goodHealthFlag=1;
FCH_31 7:1d890cab51bd 228 }
FCH_31 10:1b37e3b41947 229
FCH_31 8:cd489b7c49a0 230 // ============================================================ WATCH DOG SYNCHRO
FCH_31 8:cd489b7c49a0 231 void wakeUpSynchroCallback (void) {
lo 15:9c1c4368670f 232 //printf ("*** MAIN *** wakeUpSynchroCallback \r\n");
lo 15:9c1c4368670f 233 //app.manageSynchro () ; // Prepare response
lo 15:9c1c4368670f 234 syncFlag=1;
FCH_31 8:cd489b7c49a0 235 }
FCH_31 10:1b37e3b41947 236
FCH_31 8:cd489b7c49a0 237 // ============================================================ WATCH DOG LISTENING
FCH_31 8:cd489b7c49a0 238 void wakeUpListeningCallback (void) {
lo 15:9c1c4368670f 239 //printf ("*** MAIN *** wakeUpListeningCallback \r\n");
lo 15:9c1c4368670f 240 //app.manageListening () ; // Ecoute radio
lo 15:9c1c4368670f 241 listenFlag=1;
FCH_31 8:cd489b7c49a0 242 }
FCH_31 10:1b37e3b41947 243
FCH_31 8:cd489b7c49a0 244 //*****************************************************************************
FCH_31 7:1d890cab51bd 245
FCH_31 8:cd489b7c49a0 246
FCH_31 41:5a436163dddf 247 // A deplacer
FCH_31 41:5a436163dddf 248
FCH_31 41:5a436163dddf 249 /* Helper function for printing floats & doubles */
FCH_31 41:5a436163dddf 250 static char *print_double(char* str, double v, int decimalDigits)
FCH_31 41:5a436163dddf 251 {
FCH_31 41:5a436163dddf 252 int i = 1;
FCH_31 41:5a436163dddf 253 int intPart, fractPart;
FCH_31 41:5a436163dddf 254 int len;
FCH_31 41:5a436163dddf 255 char *ptr;
FCH_31 41:5a436163dddf 256
FCH_31 41:5a436163dddf 257 /* prepare decimal digits multiplicator */
FCH_31 41:5a436163dddf 258 for (;decimalDigits!=0; i*=10, decimalDigits--);
FCH_31 41:5a436163dddf 259
FCH_31 41:5a436163dddf 260 /* calculate integer & fractinal parts */
FCH_31 41:5a436163dddf 261 intPart = (int)v;
FCH_31 41:5a436163dddf 262 fractPart = (int)((v-(double)(int)v)*i);
FCH_31 41:5a436163dddf 263
FCH_31 41:5a436163dddf 264 /* fill in integer part */
FCH_31 41:5a436163dddf 265 sprintf(str, "%i.", intPart);
FCH_31 41:5a436163dddf 266
FCH_31 41:5a436163dddf 267 /* prepare fill in of fractional part */
FCH_31 41:5a436163dddf 268 len = strlen(str);
FCH_31 41:5a436163dddf 269 ptr = &str[len];
FCH_31 41:5a436163dddf 270
FCH_31 41:5a436163dddf 271 /* fill in leading fractional zeros */
FCH_31 41:5a436163dddf 272 for (i/=10;i>1; i/=10, ptr++) {
FCH_31 41:5a436163dddf 273 if (fractPart >= i) {
FCH_31 41:5a436163dddf 274 break;
FCH_31 41:5a436163dddf 275 }
FCH_31 41:5a436163dddf 276 *ptr = '0';
FCH_31 41:5a436163dddf 277 }
FCH_31 41:5a436163dddf 278
FCH_31 41:5a436163dddf 279 /* fill in (rest of) fractional part */
FCH_31 41:5a436163dddf 280 sprintf(ptr, "%i", fractPart);
FCH_31 41:5a436163dddf 281
FCH_31 41:5a436163dddf 282 return str;
FCH_31 41:5a436163dddf 283 }
FCH_31 4:41a92fbf702a 284
FCH_31 4:41a92fbf702a 285