User interface library for databed on HEL medical exo.
Fork of UI by
UserInterface.cpp
- Committer:
- nathanhonka
- Date:
- 2015-03-25
- Revision:
- 6:e4bd0fd5befb
- Parent:
- 1:7795fb7ee3f3
File content as of revision 6:e4bd0fd5befb:
#include "mbed.h"
#include "MODSERIAL.h"
#include "initDatabed.h"
#include "UserInterface.h"
#include "common.h"
// UI button variables
//int buttonA = 1; // state of remote button
//int buttonA_prev = 1;
// push hold vars
//float tHold = .6; // hold time for sit/stand
//float tIdle = 2; // time out to confirm sit or stance (s)
//int SSconfirm = 0; // sit/stand variable for confirmation process
//float tRelease = .3; // time since last transmission to determine button release
// various timers
//Timer time_StateChange;
//Timer time_pressA;
//Timer time_pressB;
//int buttonB = 1; // state of remote button
//int buttonB_prev = 1;
//char __xbeeBuffer[250];
//int _dataCnt=0;
UI_t UI = BUTTON_NONE;
//float _time_sinceA, _time_sinceB; //time since the button was first pressed
UserInterface::UserInterface(void): _buttonA(1), _buttonA_prev(1), _tHold(.6), _tIdle(2), _SSconfirm(0), _tRelease(.3), _buttonB(1), _buttonB_prev(1), _dataCnt(0) {
}
void UserInterface::readBuffer()
{
while (xbeeUI.readable() && _dataCnt<250) {
_xbeeBuffer[_dataCnt] = xbeeUI.getc();
_dataCnt++;
}
}
/**
* This function returns an array of information about the received characters. count[0] is # of data bytes, count[1] is expected length of the message, given the data length bytes and presence
* of escape characters. count[2] is position of the first data byte.
* @param idx char array containing received data, beginning with the start byte 0x7e
* @param count array that will contain the returned values
* @author Michael Ling
* @date 2/2/2015
*/
void UserInterface::find_length(char *idx, int *count)
{
int pos = 0;
short length;
//This segment reads the length bytes (bytes 2-3 of the message)
if (*(idx+1) == 0x7d) {
length = (*(idx+2) ^ 0x20) << 8;
pos = 3;
} else {
length = *(idx+1) << 8;
pos = 2;
}
if (*(idx+pos) == 0x7d) {
length = length | (*(idx+pos+1)^0x20);
pos += 2;
} else {
length = length | *(idx+pos);
pos += 1;
}
count[0] = (int)length;
//Length incremented by 1--we treat the checksum as a data byte, since it can also be escaped
length += 1;
//Checks for escape characters--for every escape char found, the data section gets 1 byte longer
for (short i = 0; i < length; i += 1) {
if (*(idx+i) == 0x7d) {
length += 1;
}
}
count[1] = (int) length + 3;
count[2] = pos;
}
/**
* This function returns true if calculated checksum matches the checksum at the end of the message.
* @param idx char array containing received data, starting with start byte 0x7e
* @param length number of data bytes in the message
* @author Michael Ling
* @date 2/2/2015
*/
bool UserInterface::checksum_check(char *idx, int length)
{
int pos = 0;
int sum = 0;
for(int i = 0; i < length; i++) {
//In case of an escape character, the true value of the byte is the following byte XOR with 0x20
if (*(idx+pos) == 0x7d) {
sum += (*(idx+pos+1) ^ 0x20);
pos += 2;
} else {
sum += *(idx+pos);
pos += 1;
}
}
//XBEE checksum: sum all data bytes, truncate the sum to the rightmost 8 bytes, and subtract that from 0xff
sum = sum & 0x0ff;
char calcsum = (char)(0xff - sum);
char checksum;
if (*(idx+pos) == 0x7d) {
checksum = *(idx+pos)^0x20;
} else {
checksum = *(idx+pos);
}
if (checksum != calcsum) {
return false;
}
return true;
}
void UserInterface::checkUI_XBee()
{
int sum = 0;
_buttonA_prev = _buttonA;
_buttonB_prev = _buttonB;
char * idx = strchr(_xbeeBuffer,0x7e);
if (idx != NULL) {
int size[3];
find_length(idx, size);
printf("Size: %d, Datacount: %d\r\n", size[1], _dataCnt);
if(_dataCnt >= size[1]) {
_buttonA = (_xbeeBuffer[idx-_xbeeBuffer+21]>>1) & 1; // on DIO1
_buttonB = (_xbeeBuffer[idx-_xbeeBuffer+21]>>2) & 1; // on DIO2
if (checksum_check(idx+size[2], size[0])) {
printf("Checksums match\r\n");
} else {
printf("Checksums don't match\r\n");
}
_dataCnt = 0;
}
if(sum == 0x79c) {
if (_buttonA == 0 && _buttonA_prev == 1) {//buton was just pressed
_time_pressA.reset();
_time_pressA.start();
_time_sinceA = 0;
}
else if(_buttonA == 0) {
_time_sinceA = _time_pressA; //button is still pressed
}
if (_buttonB == 0 && _buttonB_prev == 1) {//button was just pressed
_time_pressB.reset();
_time_pressB.start();
_time_sinceB = 0;
} else if(_buttonB == 0) {
_time_sinceB = _time_pressB; //button is still pressed
}
}
if((_time_pressA-_time_sinceA) >= _tRelease) { //button was released
if(_time_pressA-_tRelease >= _tHold) { //if the button was held before released
UI = BUTTON_A_HOLD; //UI command is a held A button
} else {
UI = BUTTON_A_PRESS; //UI command is a pressed A button
}
_buttonA = 1; //button A is released
_time_pressA.stop(); //reset the button A timer
_time_pressA.reset();
}
if(_time_pressB-_time_sinceB >= _tRelease) { //button was released
if(_time_pressB-_tRelease >= _tHold) { //if the button was held before released
UI = BUTTON_B_HOLD; //UI command is a held B button
} else {
UI = BUTTON_B_PRESS; //UI command is a pressed B button
}
_buttonB = 1; //button B is released
_time_pressB.stop(); //reset the button B timer
_time_pressB.reset();
}
}
memset(_xbeeBuffer,0xFF,250);
_dataCnt = 0;
}
/*void checkUI_XBee()
{
_buttonA_prev = _buttonA;
buttonB_prev = buttonB;
while (xbeeUI.readable() && _dataCnt<250) {
__xbeeBuffer[_dataCnt] = xbeeUI.getc();
_dataCnt++;
if (__xbeeBuffer[_dataCnt]==0x7e) {
for(int i=0; i<22; i++) {
if(xbeeUI.readable() {
__xbeeBuffer[_dataCnt] = xbeeUI.getc();
_dataCnt++;
}
}
}
char * idx=strchr(__xbeeBuffer,0x7e);
_buttonA = (_xbeeBuffer[idx-_xbeeBuffer+21]>>1) & 1; // on DIO1
buttonB = (_xbeeBuffer[idx-_xbeeBuffer+21]>>2) & 1; // on DIO2
pc.printf("%x\r\n", *(idx+2));
_dataCnt=0;
if (buttonA == 0 && buttonA_prev==1) {//buton was just pressed
time_pressA.reset();
time_pressA.start();
_time_sinceA=0;
}
else if(buttonA==0) {
_time_sinceA=time_pressA; //button is still pressed
}
if (buttonB == 0 && buttonB_prev==1) {//button was just pressed
time_pressB.reset();
time_pressB.start();
_time_sinceB=0;
} else if(buttonB==0) {
_time_sinceB=time_pressB; //button is still pressed
}
}
if((time_pressA-_time_sinceA)>=tRelease) { //button was released
if(time_pressA-tRelease>=tHold) { //if the button was held before released
UI=BUTTON_A_HOLD; //UI command is a held A button
} else {
UI=BUTTON_A_PRESS; //UI command is a pressed A button
}
buttonA=1; //button A is released
time_pressA.stop(); //reset the button A timer
time_pressA.reset();
}
if(time_pressB-_time_sinceB>=tRelease) { //button was released
if(time_pressB-tRelease>=tHold) { //if the button was held before released
UI=BUTTON_B_HOLD; //UI command is a held B button
} else {
UI=BUTTON_B_PRESS; //UI command is a pressed B button
}
buttonB=1; //button B is released
time_pressB.stop(); //reset the button B timer
time_pressB.reset();
}
_dataCnt=0;
memset(__xbeeBuffer,0xF,250);
}*/
void UserInterface::initializeUI()
{
xbeeUI.baud(115200);
mainPower = 0;
}
