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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TaskFlowMeter.cpp Source File

TaskFlowMeter.cpp

00001 /*
00002  * TaskFlowMeter.cpp
00003  *
00004  *  Created on: 23.10.2018
00005  *      Author: Adrian
00006  */
00007 
00008 #include "TaskFlowMeter.h"
00009 
00010 TaskFlowMeter::TaskFlowMeter(FlowMeter* flowMeter, Mutex* mutex, Queue<FlowMeterMessage,FLOWMETER_QUEUE_LENGTH>* queue) {
00011     this->flowMeter = flowMeter;
00012     setMutex(mutex);
00013     setQueue(queue);
00014 }
00015 TaskFlowMeter::TaskFlowMeter(FlowMeter* flowMeter, Mutex* mutex, Queue<FlowMeterMessage,FLOWMETER_QUEUE_LENGTH>* queue,
00016         osPriority priority, uint32_t stackSize, unsigned char* stackPointer){
00017     this->flowMeter = flowMeter;
00018     setMutex(mutex);
00019     setQueue(queue);
00020     setPriority(priority);
00021     setStackSize(stackSize);
00022     setStackPointer(stackPointer);
00023     setState(SLEEPING);
00024 }
00025 
00026 TaskFlowMeter::~TaskFlowMeter() {
00027     // TODO Auto-generated destructor stub
00028 }
00029 
00030 osStatus TaskFlowMeter::start(){
00031     this->setState(RUNNING);
00032     this->thread = new rtos::Thread(callBack,this);
00033 }
00034 
00035 osStatus TaskFlowMeter::stop(){
00036     thread->terminate();
00037     setState(SLEEPING);
00038     delete this->thread;
00039 }
00040 
00041 void TaskFlowMeter::callBack(void const* data){
00042     // WOODHAMMER METHOD of Casting!
00043     const TaskFlowMeter* constInstance = static_cast<const TaskFlowMeter* >(data);
00044     TaskFlowMeter* instance = const_cast<TaskFlowMeter*>(constInstance);
00045 
00046     instance->measure();
00047 }
00048 
00049 void TaskFlowMeter::attachIdleHook(void (*fptr) (void)){
00050     this->thread->attach_idle_hook(fptr);
00051 }
00052 
00053 void TaskFlowMeter::measure(){
00054     FlowMeterMessage flowMeterMessage;
00055 
00056     while(true){
00057         mutexFlowMeter->lock(osWaitForever);
00058         flowMeterMessage.setCurrentFlowrate(flowMeter->getCurrentFlowrate());
00059         flowMeterMessage.setCurrentVolume(flowMeter->getCurrentVolume());
00060         flowMeterMessage.setTotalFlowrate(flowMeter->getTotalFlowrate());
00061         flowMeterMessage.setTotalVolume(flowMeter->getTotalVolume());
00062         mutexFlowMeter->unlock();
00063 
00064         queue->put(&flowMeterMessage,osWaitForever);
00065         osDelay(FLOWMETER__TASK_DELAY_MS);
00066     }
00067 }
00068 
00069 void TaskFlowMeter::setQueue(Queue<FlowMeterMessage,FLOWMETER_QUEUE_LENGTH>* queueFlowMeter){
00070     this->queue = queueFlowMeter;
00071 }
00072 
00073 void TaskFlowMeter::setMutex(Mutex* mutex){
00074     this->mutexFlowMeter = mutex;
00075 }
00076 
00077 void TaskFlowMeter::setPriority(osPriority priority){
00078     this->priority = priority;
00079 }
00080 
00081 void TaskFlowMeter::setStackSize(uint32_t stackSize){
00082     this->stack_size = stackSize;
00083 }
00084 
00085 void TaskFlowMeter::setStackPointer(unsigned char* stackPointer){
00086     this->stack_pointer = stackPointer;
00087 }
00088 
00089 void TaskFlowMeter::setState(TASK_STATE taskState){
00090     this->state = taskState;
00091 }
00092 
00093 TASK_STATE  TaskFlowMeter::getState(){
00094     return this->state;
00095 }