Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Controller.cpp

Committer:
patrick_duc
Date:
2018-10-19
Branch:
Integration
Revision:
38:9b43b2415093
Parent:
23:d7df2e2d28de
Child:
39:13e66d087ae9

File content as of revision 38:9b43b2415093:

/*
 * MISNet
 *
 *  Controller.cpp
 *
 *  Created on: August 17, 2018
 *      Author: Francis CHATAIN
 *
 */

#include "Context.h"

#ifndef TEST_ENVIRONMENT
#include "mbed
#include "Tftlcd.h"
#include "Lora.h"

#else
#include <unistd.h>
#endif


//#include "main.h"

#include "TerminalInternalCommand.hpp"
#include "Controller.hpp"
#include "DataBase.hpp"
#include "ExtMemory.hpp"


using namespace misnet;


static DataBase dataBase;                   // Database creation

DataBase& Controller::getDatabase() {
    return database;
}

static ExtMemory extMemory;                   // Memoire externe

#ifndef TEST_ENVIRONMENT
Tftlcd     tftlcd      ;   // eventuellement a déplacer   (uniquement valable sur les conf nucléo)
#endif


#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

    // Read Radio parameter in Database for Lora interface   (example)
    uint32_t                        freq    ;
    RadioLoRaBandwidths_t           bw      ;
    RadioLoRaSpreadingFactors_t     sf      ;
    int8_t                          pwr     ;
    uint8_t                         bsz     ;
    int16_t                         terminal_heartbeat_period;
    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

    printf("*** APP ***  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");
    messageFactory.buildGoodhealth();
    //sendMessageLora () ;
}


void Controller::initInterfaces() {
    // Depend of the configuration read on DataBase (memory origin)

    debugSerial = new RawSerial (USBTX,USBRX, 230400);        // Debug Link
    tftlcd.Init () ;
    // I2C, SPI, UART ....
}


void Controller::initSensors() {
    printf("*** APPP ***  initSensors \r\n");
    // depend of the list identified   (example)
    //bme280 = new BME280(i2c_rt);
    // depend of the list identified
    //bme280->init(config->getBME280_MODE());
    //    iks01a2.read () ;
}


void Controller::initActuators() {
    // depend of the list identified   (example)
    //bme280 = new BME280(i2c_rt);
    // depend of the list identified
    //bme280->init(config->getBME280_MODE());
}


/*
void Controller::manageSensors     () {
readSensors                     () ;
messageFactory.buildSensors           () ;
sendMessage                     () ;
}

void Controller::manageGoodhealth  () {
readSensors                     () ;
messageFactory.buildGoodhealth        () ;
//sendMessage                   () ;
}

void Controller::manageSynchro     () {
messageFactory.buildSynchro           () ;
//sendMessage                   () ;
}

void Controller::manageConfiguration   () {
messageFactory.buildConfiguration         () ;
//sendMessage                       () ;
}

void Controller::manageListening () {
}


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é)
    TimerGoodhealth     = 60L;
    TimerSynchro        = 0L;
    TimerListening      = 0L;
}

void Controller::sendMessage() {
    printf( "*** APP_ ***  sendMessage \r\n");
    sendMessageLora();
}


void Controller::readSensors() {
    printf( "*** APP_ ***  readSensors \r\n");
    printf("*** APP *** loop on all channels\r\n");
    short nbSensors = dataBase.getNbService(Service::SENSOR);
    printf("*** APP *** 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 () ;
}


void Controller::writeActuators() {
    // depend of the list identified
    // Each sensor send can put a event in the queu
}
*/
#endif


void misnet::Controller::loop() {
    while (1) {
        DEBUG("Avant test de la file des commandes... ");
        if (! this->_commands.empty()) {
            DEBUG("About to read next command...");
            misnet::TerminalInternalCommand * command = _commands[0].second;
            DEBUG(" Next command read. About to execute command...");
            if (command->execute(&database)) {
                DEBUG(" Command executed and completed.\n");
                std::pop_heap(_commands.begin(), _commands.end());
                _commands.pop_back();
            }
            else {
                DEBUG("Command executed but not fully completed.\n");
                sleep(5);
            }
        }
        else {
            DEBUG("No command, snoozing.\n");
            sleep(5);
        }
    }
}


void Controller::addCommandInQueue(TerminalInternalCommand * command) {
    DEBUG("Adding a command in queue\n");
    //DEBUG("Adding a command in queue :
    %s\n", command->toString().c_str());
    this->_commands.push(command);
}