lora sensnode

Dependencies:   libmDot mbed-rtos mbed

Fork of mDot_LoRa_Sensornode by Adrian Mitevski

app/Decoder.cpp

Committer:
mitea1
Date:
2016-07-06
Revision:
0:f2815503561f

File content as of revision 0:f2815503561f:

/*
 * 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;
}