![](/media/cache/profiles/bfe3d668a830f1ad9c3a627efecf14e7.jpg.50x50_q85.jpg)
lora sensnode
Dependencies: libmDot mbed-rtos mbed
Fork of mDot_LoRa_Sensornode by
Diff: app/Decoder.cpp
- Revision:
- 0:f2815503561f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/Decoder.cpp Wed Jul 06 20:40:36 2016 +0000 @@ -0,0 +1,141 @@ +/* + * Decoder.cpp + * + * Created on: 16.05.2016 + * Author: Adrian + */ + +#include "Decoder.h" +#include <RawSerial.h> + +Decoder::Decoder(mbed::RawSerial* serial) { + this->serial = serial; + this->serial->attach(this,&Decoder::rxInterrupt,this->serial->RxIrq); + setActualState(INIT); + setBufferPosition(0); +} + +Decoder::~Decoder() { + +} + +void Decoder::setActualState(DecoderState newState){ + actualState = newState; + +} +DecoderState Decoder::getActualState(){ + return actualState; +} + +void Decoder::getCharacterFromSerial(){ + lastReceivedChar = serial->getc(); +} + +bool Decoder::hasReceived(char specificChar){ + bool received=false; + + if(lastReceivedChar == specificChar){ + received = true; + setActualState(RECEIVE); + } + + return received; +} + +void Decoder::bufferReceivedCharacterAtBegin(){ + receiveBuffer[0]=lastReceivedChar; +} + +void Decoder::bufferReceivedCharacter(){ + receiveBuffer[bufferPosition]=lastReceivedChar; + incrementBufferPosition(); +} + +void Decoder::setBufferPosition(uint8_t newPosition){ + bufferPosition = 0; +} + +void Decoder::incrementBufferPosition(){ + if(getActualState()!=INIT && bufferPosition < MESSAGE_LENGHT){ + bufferPosition++; + } +} + +bool Decoder::isBufferFilled(){ + bool isFilled=false; + if(bufferPosition==MESSAGE_LENGHT){ + isFilled=true; + } + return isFilled; +} + +void Decoder::clearReceiveBuffer(){ + int i; + for(i=0;i<MESSAGE_LENGHT;i++){ + receiveBuffer[i]=0x20; + } +} + +void Decoder::rxInterrupt(){ + if(serial->readable()){ + getCharacterFromSerial(); + + if(hasReceived(0xB5)){ + setBufferPosition(0); + } + + bufferReceivedCharacter(); + + if(isBufferFilled()){ + decodeReceiveBuffer(); + } + } +} + +char* Decoder::getReceiveBuffer(){ + return receiveBuffer; +} + +void Decoder::decodeReceiveBuffer(){ + + lastPoslhh.iTOW = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+3]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+2]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+1]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+0]; + + lastPoslhh.lon = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+7]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+6]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+5]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+4]; + + lastPoslhh.lat = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+11]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+10]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+9]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+8]; + + lastPoslhh.height = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+15]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+14]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+13]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+12]; + + lastPoslhh.hMSL = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+19]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+18]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+17]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+16]; + + lastPoslhh.hAcc = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+23]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+22]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+21]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+20]; + + lastPoslhh.vAcc = receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+27]<<24| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+26]<<16| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+25]<<8| + receiveBuffer[HEADER_LENGHT+ID_LENGHT+LENGHT_LENGHT+24]; + +} + +POSLHH Decoder::getLastPoslhh(){ + return lastPoslhh; +} +