Fork for marginal changes to UI library.

Dependents:   Data-Management-Honka

Fork of UI by Michael Ling

Committer:
nathanhonka
Date:
Wed Apr 08 00:51:35 2015 +0000
Revision:
8:7d9e183929a1
Parent:
7:53de0bee308d
Added comment regarding UI definition matching between Databed & Controlbed.  Note: these definitions cannot currently be placed in a common library (UI) because UI library is not encapsulated (requires local file initDatabed.h).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mzling 0:6b5a3a0138ad 1 #include "mbed.h"
mzling 0:6b5a3a0138ad 2 #include "initDatabed.h"
mzling 0:6b5a3a0138ad 3 #include "UserInterface.h"
mzling 0:6b5a3a0138ad 4
mzling 0:6b5a3a0138ad 5 // UI button variables
mzling 0:6b5a3a0138ad 6 //int buttonA = 1; // state of remote button
mzling 0:6b5a3a0138ad 7 //int buttonA_prev = 1;
mzling 0:6b5a3a0138ad 8
mzling 0:6b5a3a0138ad 9 // push hold vars
mzling 0:6b5a3a0138ad 10 //float tHold = .6; // hold time for sit/stand
mzling 0:6b5a3a0138ad 11 //float tIdle = 2; // time out to confirm sit or stance (s)
mzling 0:6b5a3a0138ad 12 //int SSconfirm = 0; // sit/stand variable for confirmation process
mzling 0:6b5a3a0138ad 13 //float tRelease = .3; // time since last transmission to determine button release
mzling 0:6b5a3a0138ad 14
mzling 0:6b5a3a0138ad 15
mzling 0:6b5a3a0138ad 16 // various timers
mzling 0:6b5a3a0138ad 17 //Timer time_StateChange;
mzling 0:6b5a3a0138ad 18 //Timer time_pressA;
mzling 0:6b5a3a0138ad 19 //Timer time_pressB;
mzling 0:6b5a3a0138ad 20
mzling 0:6b5a3a0138ad 21 //int buttonB = 1; // state of remote button
mzling 0:6b5a3a0138ad 22 //int buttonB_prev = 1;
mzling 0:6b5a3a0138ad 23 //char __xbeeBuffer[250];
mzling 0:6b5a3a0138ad 24 //int _dataCnt=0;
nathanhonka 6:be26def664d1 25 UI_t UI = BUTTON_NONE;
mzling 0:6b5a3a0138ad 26
mzling 0:6b5a3a0138ad 27 //float _time_sinceA, _time_sinceB; //time since the button was first pressed
mzling 0:6b5a3a0138ad 28
mzling 0:6b5a3a0138ad 29 UserInterface::UserInterface(void): _buttonA(1), _buttonA_prev(1), _tHold(.6), _tIdle(2), _SSconfirm(0), _tRelease(.3), _buttonB(1), _buttonB_prev(1), _dataCnt(0) {
mzling 0:6b5a3a0138ad 30 }
mzling 0:6b5a3a0138ad 31
mzling 0:6b5a3a0138ad 32 void UserInterface::readBuffer()
mzling 0:6b5a3a0138ad 33 {
mzling 0:6b5a3a0138ad 34 while (xbeeUI.readable() && _dataCnt<250) {
mzling 0:6b5a3a0138ad 35 _xbeeBuffer[_dataCnt] = xbeeUI.getc();
mzling 0:6b5a3a0138ad 36 _dataCnt++;
mzling 0:6b5a3a0138ad 37 }
mzling 0:6b5a3a0138ad 38 }
mzling 0:6b5a3a0138ad 39
mzling 0:6b5a3a0138ad 40 /**
mzling 0:6b5a3a0138ad 41 * 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
mzling 0:6b5a3a0138ad 42 * of escape characters. count[2] is position of the first data byte.
mzling 0:6b5a3a0138ad 43 * @param idx char array containing received data, beginning with the start byte 0x7e
mzling 0:6b5a3a0138ad 44 * @param count array that will contain the returned values
mzling 0:6b5a3a0138ad 45 * @author Michael Ling
mzling 0:6b5a3a0138ad 46 * @date 2/2/2015
mzling 0:6b5a3a0138ad 47 */
mzling 0:6b5a3a0138ad 48 void UserInterface::find_length(char *idx, int *count)
mzling 0:6b5a3a0138ad 49 {
mzling 0:6b5a3a0138ad 50 int pos = 0;
mzling 0:6b5a3a0138ad 51 short length;
mzling 0:6b5a3a0138ad 52 //This segment reads the length bytes (bytes 2-3 of the message)
mzling 0:6b5a3a0138ad 53 if (*(idx+1) == 0x7d) {
mzling 0:6b5a3a0138ad 54 length = (*(idx+2) ^ 0x20) << 8;
mzling 0:6b5a3a0138ad 55 pos = 3;
mzling 0:6b5a3a0138ad 56 } else {
mzling 0:6b5a3a0138ad 57 length = *(idx+1) << 8;
mzling 0:6b5a3a0138ad 58 pos = 2;
mzling 0:6b5a3a0138ad 59 }
mzling 0:6b5a3a0138ad 60 if (*(idx+pos) == 0x7d) {
mzling 0:6b5a3a0138ad 61 length = length | (*(idx+pos+1)^0x20);
mzling 0:6b5a3a0138ad 62 pos += 2;
mzling 0:6b5a3a0138ad 63 } else {
mzling 0:6b5a3a0138ad 64 length = length | *(idx+pos);
mzling 0:6b5a3a0138ad 65 pos += 1;
mzling 0:6b5a3a0138ad 66 }
mzling 0:6b5a3a0138ad 67 count[0] = (int)length;
mzling 0:6b5a3a0138ad 68 //Length incremented by 1--we treat the checksum as a data byte, since it can also be escaped
mzling 0:6b5a3a0138ad 69 length += 1;
mzling 0:6b5a3a0138ad 70 //Checks for escape characters--for every escape char found, the data section gets 1 byte longer
mzling 0:6b5a3a0138ad 71 for (short i = 0; i < length; i += 1) {
mzling 0:6b5a3a0138ad 72 if (*(idx+i) == 0x7d) {
mzling 0:6b5a3a0138ad 73 length += 1;
mzling 0:6b5a3a0138ad 74 }
mzling 0:6b5a3a0138ad 75 }
mzling 0:6b5a3a0138ad 76 count[1] = (int) length + 3;
mzling 0:6b5a3a0138ad 77 count[2] = pos;
mzling 0:6b5a3a0138ad 78 }
mzling 0:6b5a3a0138ad 79
mzling 0:6b5a3a0138ad 80 /**
mzling 0:6b5a3a0138ad 81 * This function returns true if calculated checksum matches the checksum at the end of the message.
mzling 0:6b5a3a0138ad 82 * @param idx char array containing received data, starting with start byte 0x7e
mzling 0:6b5a3a0138ad 83 * @param length number of data bytes in the message
mzling 0:6b5a3a0138ad 84 * @author Michael Ling
mzling 0:6b5a3a0138ad 85 * @date 2/2/2015
mzling 0:6b5a3a0138ad 86 */
mzling 0:6b5a3a0138ad 87 bool UserInterface::checksum_check(char *idx, int length)
mzling 0:6b5a3a0138ad 88 {
mzling 0:6b5a3a0138ad 89 int pos = 0;
mzling 0:6b5a3a0138ad 90 int sum = 0;
mzling 0:6b5a3a0138ad 91 for(int i = 0; i < length; i++) {
mzling 0:6b5a3a0138ad 92 //In case of an escape character, the true value of the byte is the following byte XOR with 0x20
mzling 0:6b5a3a0138ad 93 if (*(idx+pos) == 0x7d) {
mzling 0:6b5a3a0138ad 94 sum += (*(idx+pos+1) ^ 0x20);
mzling 0:6b5a3a0138ad 95 pos += 2;
mzling 0:6b5a3a0138ad 96 } else {
mzling 0:6b5a3a0138ad 97 sum += *(idx+pos);
mzling 0:6b5a3a0138ad 98 pos += 1;
mzling 0:6b5a3a0138ad 99 }
mzling 0:6b5a3a0138ad 100 }
mzling 0:6b5a3a0138ad 101 //XBEE checksum: sum all data bytes, truncate the sum to the rightmost 8 bytes, and subtract that from 0xff
mzling 0:6b5a3a0138ad 102 sum = sum & 0x0ff;
mzling 0:6b5a3a0138ad 103 char calcsum = (char)(0xff - sum);
mzling 0:6b5a3a0138ad 104 char checksum;
mzling 0:6b5a3a0138ad 105 if (*(idx+pos) == 0x7d) {
mzling 0:6b5a3a0138ad 106 checksum = *(idx+pos)^0x20;
mzling 0:6b5a3a0138ad 107 } else {
mzling 0:6b5a3a0138ad 108 checksum = *(idx+pos);
mzling 0:6b5a3a0138ad 109 }
mzling 0:6b5a3a0138ad 110 if (checksum != calcsum) {
mzling 0:6b5a3a0138ad 111 return false;
mzling 0:6b5a3a0138ad 112 }
mzling 0:6b5a3a0138ad 113 return true;
mzling 0:6b5a3a0138ad 114 }
mzling 0:6b5a3a0138ad 115
mzling 0:6b5a3a0138ad 116 void UserInterface::checkUI_XBee()
mzling 0:6b5a3a0138ad 117 {
mzling 0:6b5a3a0138ad 118 int sum = 0;
mzling 0:6b5a3a0138ad 119 _buttonA_prev = _buttonA;
mzling 0:6b5a3a0138ad 120 _buttonB_prev = _buttonB;
mzling 0:6b5a3a0138ad 121 char * idx = strchr(_xbeeBuffer,0x7e);
mzling 0:6b5a3a0138ad 122 if (idx != NULL) {
mzling 0:6b5a3a0138ad 123 int size[3];
mzling 0:6b5a3a0138ad 124 find_length(idx, size);
mzling 1:7795fb7ee3f3 125 printf("Size: %d, Datacount: %d\r\n", size[1], _dataCnt);
mzling 0:6b5a3a0138ad 126 if(_dataCnt >= size[1]) {
mzling 0:6b5a3a0138ad 127
mzling 0:6b5a3a0138ad 128 _buttonA = (_xbeeBuffer[idx-_xbeeBuffer+21]>>1) & 1; // on DIO1
mzling 0:6b5a3a0138ad 129 _buttonB = (_xbeeBuffer[idx-_xbeeBuffer+21]>>2) & 1; // on DIO2
mzling 0:6b5a3a0138ad 130
mzling 0:6b5a3a0138ad 131 if (checksum_check(idx+size[2], size[0])) {
mzling 1:7795fb7ee3f3 132 printf("Checksums match\r\n");
mzling 0:6b5a3a0138ad 133 } else {
mzling 1:7795fb7ee3f3 134 printf("Checksums don't match\r\n");
mzling 0:6b5a3a0138ad 135 }
mzling 0:6b5a3a0138ad 136 _dataCnt = 0;
mzling 0:6b5a3a0138ad 137 }
mzling 0:6b5a3a0138ad 138 if(sum == 0x79c) {
mzling 0:6b5a3a0138ad 139 if (_buttonA == 0 && _buttonA_prev == 1) {//buton was just pressed
mzling 0:6b5a3a0138ad 140 _time_pressA.reset();
mzling 0:6b5a3a0138ad 141 _time_pressA.start();
mzling 0:6b5a3a0138ad 142 _time_sinceA = 0;
mzling 0:6b5a3a0138ad 143 }
mzling 0:6b5a3a0138ad 144
mzling 0:6b5a3a0138ad 145 else if(_buttonA == 0) {
mzling 0:6b5a3a0138ad 146 _time_sinceA = _time_pressA; //button is still pressed
mzling 0:6b5a3a0138ad 147 }
mzling 0:6b5a3a0138ad 148
mzling 0:6b5a3a0138ad 149 if (_buttonB == 0 && _buttonB_prev == 1) {//button was just pressed
mzling 0:6b5a3a0138ad 150 _time_pressB.reset();
mzling 0:6b5a3a0138ad 151 _time_pressB.start();
mzling 0:6b5a3a0138ad 152 _time_sinceB = 0;
mzling 0:6b5a3a0138ad 153 } else if(_buttonB == 0) {
mzling 0:6b5a3a0138ad 154 _time_sinceB = _time_pressB; //button is still pressed
mzling 0:6b5a3a0138ad 155 }
mzling 0:6b5a3a0138ad 156 }
mzling 0:6b5a3a0138ad 157
mzling 0:6b5a3a0138ad 158 if((_time_pressA-_time_sinceA) >= _tRelease) { //button was released
mzling 0:6b5a3a0138ad 159 if(_time_pressA-_tRelease >= _tHold) { //if the button was held before released
nathanhonka 6:be26def664d1 160 UI = BUTTON_A_HOLD;
mzling 0:6b5a3a0138ad 161 } else {
nathanhonka 6:be26def664d1 162 UI = BUTTON_A_PRESS;
mzling 0:6b5a3a0138ad 163 }
mzling 0:6b5a3a0138ad 164 _buttonA = 1; //button A is released
mzling 0:6b5a3a0138ad 165 _time_pressA.stop(); //reset the button A timer
mzling 0:6b5a3a0138ad 166 _time_pressA.reset();
mzling 0:6b5a3a0138ad 167 }
mzling 0:6b5a3a0138ad 168 if(_time_pressB-_time_sinceB >= _tRelease) { //button was released
mzling 0:6b5a3a0138ad 169 if(_time_pressB-_tRelease >= _tHold) { //if the button was held before released
nathanhonka 6:be26def664d1 170 UI = BUTTON_B_HOLD;
mzling 0:6b5a3a0138ad 171 } else {
nathanhonka 6:be26def664d1 172 UI = BUTTON_B_PRESS;
mzling 0:6b5a3a0138ad 173 }
mzling 0:6b5a3a0138ad 174 _buttonB = 1; //button B is released
mzling 0:6b5a3a0138ad 175 _time_pressB.stop(); //reset the button B timer
mzling 0:6b5a3a0138ad 176 _time_pressB.reset();
mzling 0:6b5a3a0138ad 177 }
mzling 0:6b5a3a0138ad 178 }
mzling 0:6b5a3a0138ad 179 memset(_xbeeBuffer,0xFF,250);
mzling 0:6b5a3a0138ad 180 _dataCnt = 0;
mzling 0:6b5a3a0138ad 181 }
mzling 0:6b5a3a0138ad 182
mzling 0:6b5a3a0138ad 183 /*void checkUI_XBee()
mzling 0:6b5a3a0138ad 184 {
mzling 0:6b5a3a0138ad 185
mzling 0:6b5a3a0138ad 186 _buttonA_prev = _buttonA;
mzling 0:6b5a3a0138ad 187 buttonB_prev = buttonB;
mzling 0:6b5a3a0138ad 188 while (xbeeUI.readable() && _dataCnt<250) {
mzling 0:6b5a3a0138ad 189 __xbeeBuffer[_dataCnt] = xbeeUI.getc();
mzling 0:6b5a3a0138ad 190 _dataCnt++;
mzling 0:6b5a3a0138ad 191 if (__xbeeBuffer[_dataCnt]==0x7e) {
mzling 0:6b5a3a0138ad 192 for(int i=0; i<22; i++) {
mzling 0:6b5a3a0138ad 193 if(xbeeUI.readable() {
mzling 0:6b5a3a0138ad 194 __xbeeBuffer[_dataCnt] = xbeeUI.getc();
mzling 0:6b5a3a0138ad 195 _dataCnt++;
mzling 0:6b5a3a0138ad 196 }
mzling 0:6b5a3a0138ad 197 }
mzling 0:6b5a3a0138ad 198 }
mzling 0:6b5a3a0138ad 199 char * idx=strchr(__xbeeBuffer,0x7e);
mzling 0:6b5a3a0138ad 200 _buttonA = (_xbeeBuffer[idx-_xbeeBuffer+21]>>1) & 1; // on DIO1
mzling 0:6b5a3a0138ad 201 buttonB = (_xbeeBuffer[idx-_xbeeBuffer+21]>>2) & 1; // on DIO2
mzling 0:6b5a3a0138ad 202 pc.printf("%x\r\n", *(idx+2));
mzling 0:6b5a3a0138ad 203 _dataCnt=0;
mzling 0:6b5a3a0138ad 204 if (buttonA == 0 && buttonA_prev==1) {//buton was just pressed
mzling 0:6b5a3a0138ad 205 time_pressA.reset();
mzling 0:6b5a3a0138ad 206 time_pressA.start();
mzling 0:6b5a3a0138ad 207 _time_sinceA=0;
mzling 0:6b5a3a0138ad 208 }
mzling 0:6b5a3a0138ad 209
mzling 0:6b5a3a0138ad 210 else if(buttonA==0) {
mzling 0:6b5a3a0138ad 211 _time_sinceA=time_pressA; //button is still pressed
mzling 0:6b5a3a0138ad 212 }
mzling 0:6b5a3a0138ad 213
mzling 0:6b5a3a0138ad 214 if (buttonB == 0 && buttonB_prev==1) {//button was just pressed
mzling 0:6b5a3a0138ad 215 time_pressB.reset();
mzling 0:6b5a3a0138ad 216 time_pressB.start();
mzling 0:6b5a3a0138ad 217 _time_sinceB=0;
mzling 0:6b5a3a0138ad 218 } else if(buttonB==0) {
mzling 0:6b5a3a0138ad 219 _time_sinceB=time_pressB; //button is still pressed
mzling 0:6b5a3a0138ad 220 }
mzling 0:6b5a3a0138ad 221 }
mzling 0:6b5a3a0138ad 222 if((time_pressA-_time_sinceA)>=tRelease) { //button was released
mzling 0:6b5a3a0138ad 223 if(time_pressA-tRelease>=tHold) { //if the button was held before released
nathanhonka 6:be26def664d1 224 UI = BUTTON_A_HOLD;
mzling 0:6b5a3a0138ad 225 } else {
nathanhonka 6:be26def664d1 226 UI = BUTTON_A_PRESS;
mzling 0:6b5a3a0138ad 227 }
mzling 0:6b5a3a0138ad 228 buttonA=1; //button A is released
mzling 0:6b5a3a0138ad 229 time_pressA.stop(); //reset the button A timer
mzling 0:6b5a3a0138ad 230 time_pressA.reset();
mzling 0:6b5a3a0138ad 231 }
mzling 0:6b5a3a0138ad 232 if(time_pressB-_time_sinceB>=tRelease) { //button was released
mzling 0:6b5a3a0138ad 233 if(time_pressB-tRelease>=tHold) { //if the button was held before released
nathanhonka 6:be26def664d1 234 UI = BUTTON_B_HOLD;
mzling 0:6b5a3a0138ad 235 } else {
nathanhonka 6:be26def664d1 236 UI = BUTTON_B_PRESS;
mzling 0:6b5a3a0138ad 237 }
mzling 0:6b5a3a0138ad 238 buttonB=1; //button B is released
mzling 0:6b5a3a0138ad 239 time_pressB.stop(); //reset the button B timer
mzling 0:6b5a3a0138ad 240 time_pressB.reset();
mzling 0:6b5a3a0138ad 241 }
mzling 0:6b5a3a0138ad 242
mzling 0:6b5a3a0138ad 243 _dataCnt=0;
mzling 0:6b5a3a0138ad 244 memset(__xbeeBuffer,0xF,250);
mzling 0:6b5a3a0138ad 245 }*/
mzling 0:6b5a3a0138ad 246
mzling 0:6b5a3a0138ad 247 void UserInterface::initializeUI()
mzling 0:6b5a3a0138ad 248 {
mzling 0:6b5a3a0138ad 249 xbeeUI.baud(115200);
mzling 0:6b5a3a0138ad 250 mainPower = 0;
mzling 0:6b5a3a0138ad 251
mzling 0:6b5a3a0138ad 252 }