A multifunctional and modular Firmware for Multitech's mDot based on ARM mBed provides a widerange of functionality for several Sensors such as MAX44009, BME280, MPU9250, SI1143 and uBlox. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

Dependencies:   mDot_LoRa_Sensornode_Flowmeter_impl mbed-rtos mbed

LoRa-Sensornode Firmware for Multitech mDot

A multifunctional and modular Firmware for Multitech's mDot which provides a widerange of functionality for several Sensors. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

/media/uploads/mitea1/logo-lora-600x370.png /media/uploads/mitea1/mt_mdot_family_642px.png

Supported Sensors

Idea

The Firmware has some predefined Application Modes running different Tasks(Measurements). Each mode can be used in a different Scenario. Application_Modes define which sensors are used, how often they aquire data and how often the data has to be sent via LoRa. Lets say you just want to measure the Light then you choose an Application_Mode (or define one) that only runs TaskLight for light measurement. As a standard all measurements are taken every second and sent via LoRa but you can change that interval depending on your usage Scenario

Committer:
mitea1
Date:
Sat Oct 08 09:55:41 2016 +0000
Revision:
7:87cbeafdba06
LoRa Downlink Messages can now be received. Command Receiver and Handler implemented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitea1 7:87cbeafdba06 1 /*
mitea1 7:87cbeafdba06 2 * TaskCommandHandler.cpp
mitea1 7:87cbeafdba06 3 *
mitea1 7:87cbeafdba06 4 * Created on: Sep 11, 2016
mitea1 7:87cbeafdba06 5 * Author: Adrian
mitea1 7:87cbeafdba06 6 */
mitea1 7:87cbeafdba06 7
mitea1 7:87cbeafdba06 8 #include "TaskCommandHandler.h"
mitea1 7:87cbeafdba06 9
mitea1 7:87cbeafdba06 10 TaskCommandHandler::TaskCommandHandler(Queue<CommandMessage,COMMAND_QUEUE_LENGHT>* queue,
mitea1 7:87cbeafdba06 11 osPriority priority, uint32_t stackSize, unsigned char* stackPointer){
mitea1 7:87cbeafdba06 12 setQueue(queue);
mitea1 7:87cbeafdba06 13 setPriority(priority);
mitea1 7:87cbeafdba06 14 setStackSize(stackSize);
mitea1 7:87cbeafdba06 15 setStackPointer(stackPointer);
mitea1 7:87cbeafdba06 16 setState(SLEEPING);
mitea1 7:87cbeafdba06 17 }
mitea1 7:87cbeafdba06 18
mitea1 7:87cbeafdba06 19 TaskCommandHandler::~TaskCommandHandler() {
mitea1 7:87cbeafdba06 20 // TODO Auto-generated destructor stub
mitea1 7:87cbeafdba06 21 }
mitea1 7:87cbeafdba06 22
mitea1 7:87cbeafdba06 23 osStatus TaskCommandHandler::start(){
mitea1 7:87cbeafdba06 24 setState(RUNNING);
mitea1 7:87cbeafdba06 25 this->thread = new rtos::Thread(callBack,this);
mitea1 7:87cbeafdba06 26 attachIdleHook(NULL);
mitea1 7:87cbeafdba06 27 }
mitea1 7:87cbeafdba06 28
mitea1 7:87cbeafdba06 29 osStatus TaskCommandHandler::stop(){
mitea1 7:87cbeafdba06 30 thread->terminate();
mitea1 7:87cbeafdba06 31 setState(SLEEPING);
mitea1 7:87cbeafdba06 32 delete this->thread;
mitea1 7:87cbeafdba06 33 }
mitea1 7:87cbeafdba06 34
mitea1 7:87cbeafdba06 35 void TaskCommandHandler::callBack(void const* data){
mitea1 7:87cbeafdba06 36 // WOODHAMMER METHOD of Casting!
mitea1 7:87cbeafdba06 37 const TaskCommandHandler* constInstance = static_cast<const TaskCommandHandler* >(data);
mitea1 7:87cbeafdba06 38 TaskCommandHandler* instance = const_cast<TaskCommandHandler*>(constInstance);
mitea1 7:87cbeafdba06 39
mitea1 7:87cbeafdba06 40 instance->handleCommands();
mitea1 7:87cbeafdba06 41 }
mitea1 7:87cbeafdba06 42
mitea1 7:87cbeafdba06 43 void TaskCommandHandler::attachIdleHook(void (*fptr) (void)){
mitea1 7:87cbeafdba06 44 this->thread->attach_idle_hook(fptr);
mitea1 7:87cbeafdba06 45 }
mitea1 7:87cbeafdba06 46
mitea1 7:87cbeafdba06 47 void TaskCommandHandler::handleCommands(){
mitea1 7:87cbeafdba06 48
mitea1 7:87cbeafdba06 49 while(true){
mitea1 7:87cbeafdba06 50 getCommandMessages();
mitea1 7:87cbeafdba06 51 processCommands();
mitea1 7:87cbeafdba06 52 osDelay(COMMANDHANLDER_TASK_DELAY_MS);
mitea1 7:87cbeafdba06 53 }
mitea1 7:87cbeafdba06 54 }
mitea1 7:87cbeafdba06 55
mitea1 7:87cbeafdba06 56 void TaskCommandHandler::getCommandMessages(){
mitea1 7:87cbeafdba06 57 commandReceiveEvent = queue->get(0);
mitea1 7:87cbeafdba06 58 }
mitea1 7:87cbeafdba06 59
mitea1 7:87cbeafdba06 60 void TaskCommandHandler::processCommands(){
mitea1 7:87cbeafdba06 61
mitea1 7:87cbeafdba06 62 debugSerial->printf("\n");
mitea1 7:87cbeafdba06 63 if (commandReceiveEvent.status == osEventMessage) {
mitea1 7:87cbeafdba06 64
mitea1 7:87cbeafdba06 65 CommandMessage* commandMessage = (CommandMessage*) commandReceiveEvent.value.p;
mitea1 7:87cbeafdba06 66 // Do your own stuff according to the received command
mitea1 7:87cbeafdba06 67 // For example turn on LED if 0x00 was sent or turn it off if 0x01 was sent
mitea1 7:87cbeafdba06 68 // DigitalOut* pinD6 = new DigitalOut(PA_1);
mitea1 7:87cbeafdba06 69 //
mitea1 7:87cbeafdba06 70 // switch(commandMessage->getCommandHex()){
mitea1 7:87cbeafdba06 71 //
mitea1 7:87cbeafdba06 72 // case LORA_COMMAND_ACTION_0:
mitea1 7:87cbeafdba06 73 // pinD6->write(0);
mitea1 7:87cbeafdba06 74 // break;
mitea1 7:87cbeafdba06 75 //
mitea1 7:87cbeafdba06 76 // case LORA_COMMAND_ACTION_1:
mitea1 7:87cbeafdba06 77 // pinD6->write(1);
mitea1 7:87cbeafdba06 78 // break;
mitea1 7:87cbeafdba06 79 //
mitea1 7:87cbeafdba06 80 // }
mitea1 7:87cbeafdba06 81
mitea1 7:87cbeafdba06 82 debugSerial->printf("Received Command: %s\n",commandMessage->getCommandString().c_str());
mitea1 7:87cbeafdba06 83
mitea1 7:87cbeafdba06 84 }
mitea1 7:87cbeafdba06 85
mitea1 7:87cbeafdba06 86 }
mitea1 7:87cbeafdba06 87
mitea1 7:87cbeafdba06 88 void TaskCommandHandler::setQueue(Queue<CommandMessage,COMMAND_QUEUE_LENGHT>* queueCommand){
mitea1 7:87cbeafdba06 89 this->queue = queueCommand;
mitea1 7:87cbeafdba06 90 }
mitea1 7:87cbeafdba06 91
mitea1 7:87cbeafdba06 92 void TaskCommandHandler::setPriority(osPriority priority){
mitea1 7:87cbeafdba06 93 this->priority = priority;
mitea1 7:87cbeafdba06 94 }
mitea1 7:87cbeafdba06 95
mitea1 7:87cbeafdba06 96 void TaskCommandHandler::setStackSize(uint32_t stacksize){
mitea1 7:87cbeafdba06 97 this->stack_size = stacksize;
mitea1 7:87cbeafdba06 98 }
mitea1 7:87cbeafdba06 99
mitea1 7:87cbeafdba06 100 void TaskCommandHandler::setStackPointer(unsigned char* stackPointer){
mitea1 7:87cbeafdba06 101 this->stack_pointer = stackPointer;
mitea1 7:87cbeafdba06 102 }
mitea1 7:87cbeafdba06 103
mitea1 7:87cbeafdba06 104 void TaskCommandHandler::setDebugSerial(RawSerial* debugSerial){
mitea1 7:87cbeafdba06 105 this->debugSerial = debugSerial;
mitea1 7:87cbeafdba06 106 }
mitea1 7:87cbeafdba06 107
mitea1 7:87cbeafdba06 108 void TaskCommandHandler::setState(TASK_STATE state){
mitea1 7:87cbeafdba06 109 this->state = state;
mitea1 7:87cbeafdba06 110 }
mitea1 7:87cbeafdba06 111
mitea1 7:87cbeafdba06 112 TASK_STATE TaskCommandHandler::getState(){
mitea1 7:87cbeafdba06 113 return state;
mitea1 7:87cbeafdba06 114 }
mitea1 7:87cbeafdba06 115
mitea1 7:87cbeafdba06 116
mitea1 7:87cbeafdba06 117
mitea1 7:87cbeafdba06 118
mitea1 7:87cbeafdba06 119
mitea1 7:87cbeafdba06 120