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:
Fri Nov 02 17:01:02 2018 +0000
Revision:
10:4051c38bf73f
Parent:
9:c4e378f4801d
wtf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitea1 9:c4e378f4801d 1 /*
mitea1 9:c4e378f4801d 2 * TaskFlowMeter.cpp
mitea1 9:c4e378f4801d 3 *
mitea1 9:c4e378f4801d 4 * Created on: 23.10.2018
mitea1 9:c4e378f4801d 5 * Author: Adrian
mitea1 9:c4e378f4801d 6 */
mitea1 9:c4e378f4801d 7
mitea1 9:c4e378f4801d 8 #include "TaskFlowMeter.h"
mitea1 9:c4e378f4801d 9
mitea1 9:c4e378f4801d 10 TaskFlowMeter::TaskFlowMeter(FlowMeter* flowMeter, Mutex* mutex, Queue<FlowMeterMessage,FLOWMETER_QUEUE_LENGTH>* queue) {
mitea1 9:c4e378f4801d 11 this->flowMeter = flowMeter;
mitea1 9:c4e378f4801d 12 setMutex(mutex);
mitea1 9:c4e378f4801d 13 setQueue(queue);
mitea1 9:c4e378f4801d 14 }
mitea1 9:c4e378f4801d 15 TaskFlowMeter::TaskFlowMeter(FlowMeter* flowMeter, Mutex* mutex, Queue<FlowMeterMessage,FLOWMETER_QUEUE_LENGTH>* queue,
mitea1 9:c4e378f4801d 16 osPriority priority, uint32_t stackSize, unsigned char* stackPointer){
mitea1 9:c4e378f4801d 17 this->flowMeter = flowMeter;
mitea1 9:c4e378f4801d 18 setMutex(mutex);
mitea1 9:c4e378f4801d 19 setQueue(queue);
mitea1 9:c4e378f4801d 20 setPriority(priority);
mitea1 9:c4e378f4801d 21 setStackSize(stackSize);
mitea1 9:c4e378f4801d 22 setStackPointer(stackPointer);
mitea1 9:c4e378f4801d 23 setState(SLEEPING);
mitea1 9:c4e378f4801d 24 }
mitea1 9:c4e378f4801d 25
mitea1 9:c4e378f4801d 26 TaskFlowMeter::~TaskFlowMeter() {
mitea1 9:c4e378f4801d 27 // TODO Auto-generated destructor stub
mitea1 9:c4e378f4801d 28 }
mitea1 9:c4e378f4801d 29
mitea1 9:c4e378f4801d 30 osStatus TaskFlowMeter::start(){
mitea1 9:c4e378f4801d 31 this->setState(RUNNING);
mitea1 9:c4e378f4801d 32 this->thread = new rtos::Thread(callBack,this);
mitea1 9:c4e378f4801d 33 }
mitea1 9:c4e378f4801d 34
mitea1 9:c4e378f4801d 35 osStatus TaskFlowMeter::stop(){
mitea1 9:c4e378f4801d 36 thread->terminate();
mitea1 9:c4e378f4801d 37 setState(SLEEPING);
mitea1 9:c4e378f4801d 38 delete this->thread;
mitea1 9:c4e378f4801d 39 }
mitea1 9:c4e378f4801d 40
mitea1 9:c4e378f4801d 41 void TaskFlowMeter::callBack(void const* data){
mitea1 9:c4e378f4801d 42 // WOODHAMMER METHOD of Casting!
mitea1 9:c4e378f4801d 43 const TaskFlowMeter* constInstance = static_cast<const TaskFlowMeter* >(data);
mitea1 9:c4e378f4801d 44 TaskFlowMeter* instance = const_cast<TaskFlowMeter*>(constInstance);
mitea1 9:c4e378f4801d 45
mitea1 9:c4e378f4801d 46 instance->measure();
mitea1 9:c4e378f4801d 47 }
mitea1 9:c4e378f4801d 48
mitea1 9:c4e378f4801d 49 void TaskFlowMeter::attachIdleHook(void (*fptr) (void)){
mitea1 9:c4e378f4801d 50 this->thread->attach_idle_hook(fptr);
mitea1 9:c4e378f4801d 51 }
mitea1 9:c4e378f4801d 52
mitea1 9:c4e378f4801d 53 void TaskFlowMeter::measure(){
mitea1 9:c4e378f4801d 54 FlowMeterMessage flowMeterMessage;
mitea1 9:c4e378f4801d 55
mitea1 9:c4e378f4801d 56 while(true){
mitea1 9:c4e378f4801d 57 mutexFlowMeter->lock(osWaitForever);
mitea1 9:c4e378f4801d 58 flowMeterMessage.setCurrentFlowrate(flowMeter->getCurrentFlowrate());
mitea1 9:c4e378f4801d 59 flowMeterMessage.setCurrentVolume(flowMeter->getCurrentVolume());
mitea1 9:c4e378f4801d 60 flowMeterMessage.setTotalFlowrate(flowMeter->getTotalFlowrate());
mitea1 9:c4e378f4801d 61 flowMeterMessage.setTotalVolume(flowMeter->getTotalVolume());
mitea1 9:c4e378f4801d 62 mutexFlowMeter->unlock();
mitea1 9:c4e378f4801d 63
mitea1 9:c4e378f4801d 64 queue->put(&flowMeterMessage,osWaitForever);
mitea1 9:c4e378f4801d 65 osDelay(FLOWMETER__TASK_DELAY_MS);
mitea1 9:c4e378f4801d 66 }
mitea1 9:c4e378f4801d 67 }
mitea1 9:c4e378f4801d 68
mitea1 9:c4e378f4801d 69 void TaskFlowMeter::setQueue(Queue<FlowMeterMessage,FLOWMETER_QUEUE_LENGTH>* queueFlowMeter){
mitea1 9:c4e378f4801d 70 this->queue = queueFlowMeter;
mitea1 9:c4e378f4801d 71 }
mitea1 9:c4e378f4801d 72
mitea1 9:c4e378f4801d 73 void TaskFlowMeter::setMutex(Mutex* mutex){
mitea1 9:c4e378f4801d 74 this->mutexFlowMeter = mutex;
mitea1 9:c4e378f4801d 75 }
mitea1 9:c4e378f4801d 76
mitea1 9:c4e378f4801d 77 void TaskFlowMeter::setPriority(osPriority priority){
mitea1 9:c4e378f4801d 78 this->priority = priority;
mitea1 9:c4e378f4801d 79 }
mitea1 9:c4e378f4801d 80
mitea1 9:c4e378f4801d 81 void TaskFlowMeter::setStackSize(uint32_t stackSize){
mitea1 9:c4e378f4801d 82 this->stack_size = stackSize;
mitea1 9:c4e378f4801d 83 }
mitea1 9:c4e378f4801d 84
mitea1 9:c4e378f4801d 85 void TaskFlowMeter::setStackPointer(unsigned char* stackPointer){
mitea1 9:c4e378f4801d 86 this->stack_pointer = stackPointer;
mitea1 9:c4e378f4801d 87 }
mitea1 9:c4e378f4801d 88
mitea1 9:c4e378f4801d 89 void TaskFlowMeter::setState(TASK_STATE taskState){
mitea1 9:c4e378f4801d 90 this->state = taskState;
mitea1 9:c4e378f4801d 91 }
mitea1 9:c4e378f4801d 92
mitea1 9:c4e378f4801d 93 TASK_STATE TaskFlowMeter::getState(){
mitea1 9:c4e378f4801d 94 return this->state;
mitea1 9:c4e378f4801d 95 }