Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
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()); }