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 Decoder.cpp Source File

Decoder.cpp

00001 /*
00002  * Decoder.cpp
00003  *
00004  *  Created on: 16.05.2016
00005  *      Author: Adrian
00006  */
00007 
00008 #include "Decoder.h "
00009 #include <RawSerial.h>
00010 
00011 Decoder::Decoder(mbed::RawSerial* serial) {
00012     this->serial = serial;
00013     this->serial->attach(this,&Decoder::rxInterrupt,this->serial->RxIrq);
00014     setActualState(INIT);
00015     setBufferPosition(0);
00016 }
00017 
00018 Decoder::~Decoder() {
00019 
00020 }
00021 
00022 void Decoder::setActualState(DecoderState newState){
00023     actualState = newState;
00024 
00025 }
00026 DecoderState Decoder::getActualState(){
00027     return actualState;
00028 }
00029 
00030 void Decoder::getCharacterFromSerial(){
00031     lastReceivedChar = serial->getc();
00032 }
00033 
00034 bool Decoder::hasReceived(char specificChar){
00035     bool received=false;
00036 
00037     if(lastReceivedChar == specificChar){
00038         received = true;
00039         setActualState(RECEIVE);
00040     }
00041 
00042     return received;
00043 }
00044 
00045 void Decoder::bufferReceivedCharacterAtBegin(){
00046     receiveBuffer[0]=lastReceivedChar;
00047 }
00048 
00049 void Decoder::bufferReceivedCharacter(){
00050     receiveBuffer[bufferPosition]=lastReceivedChar;
00051     incrementBufferPosition();
00052 }
00053 
00054 void Decoder::setBufferPosition(uint8_t newPosition){
00055     bufferPosition = 0;
00056 }
00057 
00058 void Decoder::incrementBufferPosition(){
00059     if(getActualState()!=INIT && bufferPosition < MESSAGE_LENGHT){
00060         bufferPosition++;
00061     }
00062 }
00063 
00064 bool Decoder::isBufferFilled(){
00065     bool isFilled=false;
00066     if(bufferPosition==MESSAGE_LENGHT){
00067         isFilled=true;
00068     }
00069     return isFilled;
00070 }
00071 
00072 void Decoder::clearReceiveBuffer(){
00073     int i;
00074     for(i=0;i<MESSAGE_LENGHT;i++){
00075         receiveBuffer[i]=0x20;
00076     }
00077 }
00078 
00079 void Decoder::rxInterrupt(){
00080     if(serial->readable()){
00081         getCharacterFromSerial();
00082 
00083         if(hasReceived(0xB5)){
00084             setBufferPosition(0);
00085         }
00086 
00087         bufferReceivedCharacter();
00088 
00089         if(isBufferFilled()){
00090             decodeReceiveBuffer();
00091         }
00092     }
00093 }
00094 
00095 char* Decoder::getReceiveBuffer(){
00096     return receiveBuffer;
00097 }
00098 
00099 void Decoder::decodeReceiveBuffer(){
00100 
00101     lastPoslhh.iTOW = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+3]<<24|
00102             receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+2]<<16|
00103             receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+1]<<8|
00104             receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+0];
00105 
00106     lastPoslhh.lon = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+7]<<24|
00107                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+6]<<16|
00108                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+5]<<8|
00109                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+4];
00110 
00111     lastPoslhh.lat = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+11]<<24|
00112                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+10]<<16|
00113                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+9]<<8|
00114                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+8];
00115 
00116     lastPoslhh.height = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+15]<<24|
00117                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+14]<<16|
00118                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+13]<<8|
00119                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+12];
00120 
00121     lastPoslhh.hMSL = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+19]<<24|
00122                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+18]<<16|
00123                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+17]<<8|
00124                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+16];
00125 
00126     lastPoslhh.hAcc = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+23]<<24|
00127                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+22]<<16|
00128                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+21]<<8|
00129                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+20];
00130 
00131     lastPoslhh.vAcc = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+27]<<24|
00132                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+26]<<16|
00133                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+25]<<8|
00134                 receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+24];
00135 
00136 }
00137 
00138 POSLHH Decoder::getLastPoslhh(){
00139     return lastPoslhh;
00140 }
00141