Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

main.cpp

Committer:
FCH_31
Date:
2018-10-22
Revision:
41:5a436163dddf
Parent:
21:8524d815c587

File content as of revision 41:5a436163dddf:

/*
 *  MISNet   
 *
 *  Main   TERMINAL VERSION HALF DUPLEX 
 *
 *  Created on: August 17, 2018    Author: Francis CHATAIN
 *
 */
 
#include "mbed.h"
#include "sx1280-hal.h"
#include "stdio.h"
#include <string>

#include "main.h"
#include "Controller.hpp"

#include "Radio.h"


using namespace std;
using namespace misnet;

//  INSTANCE of CONTROLLER OBJECT 

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, statPayLoadCounter = 0 ; 
 
LowPowerTicker  wakeUpPayload                   ;       // normal wake up 
void wakeUpPayloadCallback      (void)          ; 

LowPowerTicker  wakeUpGoodhealth                ;       // GoodHealth wake up 
void wakeUpGoodhealthCallback   (void)          ; 

LowPowerTicker  wakeUpSynchro                   ;       // Synchro wake up  (Mode B)
void wakeUpSynchroCallback      (void)          ; 

LowPowerTicker  wakeUpListening                 ;       // Listening wake up (Mode C)
void wakeUpListeningCallback    (void)          ; 

void            setup ()                        ;       // Init Terminal 
void            loop  ()                        ;       // Main Loop 
void            wakeUpIrqTacSwitch ()           ;       // IRQ Tac Switch


// ============================================================================ Main
int main( ) { setup () ; loop () ; }
// ============================================================================


// ============================================================================ Setup
void setup () {

    controller.start    ();         // Start controller 
    
    // -------------------------------------------------- Scheduler  by IRQ or watch dog 
    
    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 
    
    if ( TimerSynchro !=0) 
        wakeUpSynchro.attach   (&wakeUpSynchroCallback,     (float)TimerSynchro)    ;       // Mode B
        
    if ( TimerSynchro !=0) 
        wakeUpListening.attach (&wakeUpListeningCallback,(float)TimerListening)     ;       // Mode C    
       
        
     // 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");
           
}
//==============================================================================


// ============================================================================= 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;  
            controller.manageListening();
        }  
        if(syncFlag){       // Prepare response
            printf ("*** MAIN ***  LOOP : wakeUpSynchroCallback   \r\n");
            syncFlag=0; 
            controller.manageSynchro();
        } 
        if(goodHealthFlag){ // Prepare response
            printf ("*** MAIN ***  LOOP : wakeUpGoodhealthCallback  r\n");
            goodHealthFlag=0; 
            controller.manageGoodhealth(); 
        } 
        if(payloadFlag){    // read Sensors
            printf ("*** MAIN ***  LOOP : wakeUpPayloadCallback cptr=%d\r\n", statPayLoadCounter); 
            payloadFlag=0; 
            //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; 
            controller.manageConfiguration(); 
         } 
        // deepsleep ();    // breaks UART 
        //sleep () ; 
        wait(1);
    } 
}
// No action : all event by IRQ 
//==============================================================================




// IRQ du tac switch    TODO 
// ============================================================ IRQ TAC SWITCH
void wakeUpIrqTacSwitch (void) {
    //printf ("*** MAIN ***  wakeUpIrqTacSwitch   \r\n");  
    //app.manageConfiguration         () ;   // IRQ  
    irqFlag=1; 
}


// ============================================================ WATCH DOG PAYLOAD 
void wakeUpPayloadCallback (void) {
    statPayLoadCounter++ ; 
    //printf ("*** MAIN ***  wakeUpPayloadCallback : %d  \r\n", statPayLoadCounter); 
    //app.manageSensors         () ;   // read Sensors   
    payloadFlag=1; 
}

// ============================================================ WATCH DOG GOODHEALTH
void wakeUpGoodhealthCallback (void) {
    //printf ("*** MAIN ***  wakeUpGoodhealthCallback  ==========================   \r\n");
    //app.manageGoodhealth () ;   // Prepare response  
    goodHealthFlag=1; 
}

// ============================================================ WATCH DOG SYNCHRO
void wakeUpSynchroCallback (void) {
    //printf ("*** MAIN ***  wakeUpSynchroCallback   \r\n");
    //app.manageSynchro () ;   // Prepare response  
    syncFlag=1;
}

// ============================================================ WATCH DOG LISTENING
void wakeUpListeningCallback (void) {
    //printf ("*** MAIN ***  wakeUpListeningCallback   \r\n");
    //app.manageListening () ;   // Ecoute radio  
    listenFlag=1;   
}

//*****************************************************************************


// 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;
}