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:
39:13e66d087ae9
Parent:
38:9b43b2415093

File content as of revision 39:13e66d087ae9:

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

#include "Context.h"

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

#ifdef TEST_ENVIRONMENT
#include <unistd.h>
#endif

#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 

    DEBUG("*** 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 

    DEBUG("*** APP_ ***  Controller started\r\n");

    //DEBUG("*** 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(database.getTerminalId(), database.getGatewayId());

    // I2C, SPI, UART ....
}

/*
void Controller::initSensors() {
    DEBUG("*** 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() {
    DEBUG("*** APP_ ***  sendMessage \r\n");
    sendMessageLora();
}

void Controller::readSensors() {
    DEBUG("*** APP_ ***  readSensors \r\n");
    DEBUG("*** APP *** loop on all channels\r\n");
    short nbSensors = database.getNbService(Service::SENSOR);
    DEBUG("*** 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 = this->_commands.top();
            misnet::TerminalInternalCommand * command = _commands[0].second;
            DEBUG("Next command read.");
            DEBUG("About to execute command...");
            if (command->execute(&database)) {
                DEBUG("Command executed and completed.\n");
                //this->_commands.pop();
                std::pop_heap(_commands.begin(), _commands.end());
                _commands.pop_back();
            }
        else {
                DEBUG("Command executed but not fully completed.\n");
#ifdef TEST_ENVIRONMENT
                sleep(1);
#else
                wait(1);
#endif
            }
        }
    else {
            DEBUG("No command, snoozing.\n");
#ifdef TEST_ENVIRONMENT
            sleep(5);
#else
            wait(1);
#endif
        }
    }
}


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