HexiComm: A simple messaging system that can be used anywhere and everywhere.

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351 nRF24L01

Committer:
khuang
Date:
Wed Oct 05 06:04:42 2016 +0000
Revision:
1:7ab69d565acc
Parent:
0:fb026a2f6755
Initial Release of HexiComm Software

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khuang 0:fb026a2f6755 1 #include "mbed.h"
khuang 0:fb026a2f6755 2 #include "Hexi_KW40Z.h"
khuang 0:fb026a2f6755 3 #include "Hexi_OLED_SSD1351.h"
khuang 0:fb026a2f6755 4 #include "OLED_types.h"
khuang 0:fb026a2f6755 5 #include "OpenSans_Font.h"
khuang 0:fb026a2f6755 6 #include "nRF24L01P.h"
khuang 0:fb026a2f6755 7 #include "string.h"
khuang 0:fb026a2f6755 8 #include "images.h"
khuang 0:fb026a2f6755 9
khuang 0:fb026a2f6755 10 #define NAME "RB"
khuang 0:fb026a2f6755 11
khuang 0:fb026a2f6755 12 #define LED_ON 0
khuang 0:fb026a2f6755 13 #define LED_OFF 1
khuang 0:fb026a2f6755 14 #define NUM_OF_SCREENS 6
khuang 0:fb026a2f6755 15 #define TRANSFER_SIZE 4
khuang 0:fb026a2f6755 16
khuang 0:fb026a2f6755 17 void StartHaptic(void);
khuang 0:fb026a2f6755 18 void StopHaptic(void const *n);
khuang 0:fb026a2f6755 19 void txTask(void);
khuang 0:fb026a2f6755 20
khuang 0:fb026a2f6755 21 void displayHome();
khuang 0:fb026a2f6755 22 void screenHandler(uint8_t stageNum,uint8_t header);
khuang 0:fb026a2f6755 23
khuang 0:fb026a2f6755 24 DigitalOut redLed(LED1,1);
khuang 0:fb026a2f6755 25 DigitalOut greenLed(LED2,1);
khuang 0:fb026a2f6755 26 DigitalOut blueLed(LED3,1);
khuang 0:fb026a2f6755 27 DigitalOut haptic(PTB9);
khuang 0:fb026a2f6755 28
khuang 0:fb026a2f6755 29 /* Define timer for haptic feedback */
khuang 0:fb026a2f6755 30 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
khuang 0:fb026a2f6755 31
khuang 0:fb026a2f6755 32 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
khuang 0:fb026a2f6755 33 KW40Z kw40z_device(PTE24, PTE25);
khuang 0:fb026a2f6755 34
khuang 0:fb026a2f6755 35 /* Instantiate the SSD1351 OLED Driver */
khuang 0:fb026a2f6755 36 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
khuang 0:fb026a2f6755 37 oled_text_properties_t textProperties = {0};
khuang 0:fb026a2f6755 38
khuang 0:fb026a2f6755 39 /* Instantiate the nRF24L01P Driver */
khuang 0:fb026a2f6755 40 nRF24L01P my_nrf24l01p(PTC6,PTC7,PTC5,PTC4,PTB2,NC); // mosi, miso, sck, csn, ce, irq
khuang 0:fb026a2f6755 41
khuang 0:fb026a2f6755 42 /* Text Buffer */
khuang 0:fb026a2f6755 43 char text[20];
khuang 0:fb026a2f6755 44
khuang 0:fb026a2f6755 45 uint8_t screenNum=0;
khuang 0:fb026a2f6755 46 bool prefix=0;
khuang 0:fb026a2f6755 47 bool sentMessageDisplayedFlag=0;
khuang 0:fb026a2f6755 48 char rxData[TRANSFER_SIZE];
khuang 0:fb026a2f6755 49 char txData[TRANSFER_SIZE];
khuang 0:fb026a2f6755 50
khuang 0:fb026a2f6755 51 /* Pointer for the image to be displayed */
khuang 0:fb026a2f6755 52 const uint8_t *homeBMP = HEXIWEAR_HOME_bmp;
khuang 0:fb026a2f6755 53 const uint8_t *sendBMP = HEXIWEAR_SEND_bmp;
khuang 0:fb026a2f6755 54 const uint8_t *bannerBMP = hexicomm_bmp;
khuang 0:fb026a2f6755 55
khuang 0:fb026a2f6755 56 /****************************Call Back Functions*******************************/
khuang 0:fb026a2f6755 57 /*Send Button */
khuang 0:fb026a2f6755 58 void ButtonRight(void)
khuang 0:fb026a2f6755 59 {
khuang 0:fb026a2f6755 60 if (!sentMessageDisplayedFlag)
khuang 0:fb026a2f6755 61 {
khuang 0:fb026a2f6755 62 StartHaptic();
khuang 0:fb026a2f6755 63
khuang 0:fb026a2f6755 64 // Send the transmitbuffer via the nRF24L01+
khuang 0:fb026a2f6755 65 my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, 4 );
khuang 0:fb026a2f6755 66 }
khuang 0:fb026a2f6755 67 }
khuang 0:fb026a2f6755 68
khuang 0:fb026a2f6755 69 /*Home Button */
khuang 0:fb026a2f6755 70 void ButtonLeft(void)
khuang 0:fb026a2f6755 71 {
khuang 0:fb026a2f6755 72 StartHaptic();
khuang 0:fb026a2f6755 73 screenNum = 0;
khuang 0:fb026a2f6755 74
khuang 0:fb026a2f6755 75 /*Turn off Green LED */
khuang 0:fb026a2f6755 76 sentMessageDisplayedFlag=0;
khuang 0:fb026a2f6755 77 greenLed = !sentMessageDisplayedFlag;
khuang 0:fb026a2f6755 78
khuang 0:fb026a2f6755 79 /*Redraw Send Button*/
khuang 0:fb026a2f6755 80 oled.DrawImage(sendBMP,53,81);
khuang 0:fb026a2f6755 81 screenHandler(screenNum,prefix);
khuang 0:fb026a2f6755 82 }
khuang 0:fb026a2f6755 83
khuang 0:fb026a2f6755 84 /*Toggles Between I am @ and Meet @ */
khuang 0:fb026a2f6755 85 void ButtonUp(void)
khuang 0:fb026a2f6755 86 {
khuang 0:fb026a2f6755 87 if (screenNum !=0)
khuang 0:fb026a2f6755 88 {
khuang 0:fb026a2f6755 89 StartHaptic();
khuang 0:fb026a2f6755 90
khuang 0:fb026a2f6755 91 /*Turn off Green LED */
khuang 0:fb026a2f6755 92 sentMessageDisplayedFlag=0;
khuang 0:fb026a2f6755 93 greenLed = !sentMessageDisplayedFlag;
khuang 0:fb026a2f6755 94
khuang 0:fb026a2f6755 95 /*Redraw Send Button*/
khuang 0:fb026a2f6755 96 oled.DrawImage(sendBMP,53,81);
khuang 0:fb026a2f6755 97
khuang 0:fb026a2f6755 98 prefix = !prefix;
khuang 0:fb026a2f6755 99 screenHandler(screenNum,prefix);
khuang 0:fb026a2f6755 100 }
khuang 0:fb026a2f6755 101 }
khuang 0:fb026a2f6755 102
khuang 0:fb026a2f6755 103 /*Advances Stage Number */
khuang 0:fb026a2f6755 104 void ButtonDown(void)
khuang 0:fb026a2f6755 105 {
khuang 0:fb026a2f6755 106 StartHaptic();
khuang 0:fb026a2f6755 107
khuang 0:fb026a2f6755 108 /*Turn off Green LED */
khuang 0:fb026a2f6755 109 sentMessageDisplayedFlag=0;
khuang 0:fb026a2f6755 110 greenLed = !sentMessageDisplayedFlag;
khuang 0:fb026a2f6755 111
khuang 0:fb026a2f6755 112 /*Redraw Send Button*/
khuang 0:fb026a2f6755 113 oled.DrawImage(sendBMP,53,81);
khuang 0:fb026a2f6755 114
khuang 0:fb026a2f6755 115 if (screenNum < NUM_OF_SCREENS -1) {
khuang 0:fb026a2f6755 116 screenNum++;
khuang 0:fb026a2f6755 117 }
khuang 0:fb026a2f6755 118 else
khuang 0:fb026a2f6755 119 {
khuang 0:fb026a2f6755 120 screenNum = 0;
khuang 0:fb026a2f6755 121 }
khuang 0:fb026a2f6755 122
khuang 0:fb026a2f6755 123 screenHandler(screenNum,prefix);
khuang 0:fb026a2f6755 124 }
khuang 0:fb026a2f6755 125
khuang 0:fb026a2f6755 126
khuang 0:fb026a2f6755 127 /***********************End of Call Back Functions*****************************/
khuang 0:fb026a2f6755 128
khuang 0:fb026a2f6755 129 /********************************Main******************************************/
khuang 0:fb026a2f6755 130
khuang 0:fb026a2f6755 131 int main()
khuang 0:fb026a2f6755 132 {
khuang 0:fb026a2f6755 133 /* Wait Sequence in the beginning for board to be reset then placed in mini docking station*/
khuang 0:fb026a2f6755 134
khuang 0:fb026a2f6755 135 Thread::wait(6000);
khuang 0:fb026a2f6755 136 blueLed=0;
khuang 0:fb026a2f6755 137 Thread::wait(500);
khuang 0:fb026a2f6755 138 blueLed=1;
khuang 0:fb026a2f6755 139
khuang 0:fb026a2f6755 140
khuang 0:fb026a2f6755 141 /* NRF24l0p Setup */
khuang 0:fb026a2f6755 142 my_nrf24l01p.init();
khuang 0:fb026a2f6755 143 my_nrf24l01p.powerUp();
khuang 0:fb026a2f6755 144 my_nrf24l01p.setAirDataRate(NRF24L01P_DATARATE_250_KBPS);
khuang 0:fb026a2f6755 145 my_nrf24l01p.setRfOutputPower(NRF24L01P_TX_PWR_ZERO_DB);
khuang 0:fb026a2f6755 146 my_nrf24l01p.setRxAddress(0xE7E7E7E7E8);
khuang 0:fb026a2f6755 147 my_nrf24l01p.setTxAddress(0xE7E7E7E7E8);
khuang 0:fb026a2f6755 148 my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
khuang 0:fb026a2f6755 149 my_nrf24l01p.setReceiveMode();
khuang 0:fb026a2f6755 150 my_nrf24l01p.enable();
khuang 0:fb026a2f6755 151
khuang 0:fb026a2f6755 152 /* Get OLED Class Default Text Properties */
khuang 0:fb026a2f6755 153 oled.GetTextProperties(&textProperties);
khuang 0:fb026a2f6755 154
khuang 0:fb026a2f6755 155 /* Fills the screen with solid black */
khuang 0:fb026a2f6755 156 oled.FillScreen(COLOR_BLACK);
khuang 0:fb026a2f6755 157
khuang 0:fb026a2f6755 158 /* Register callbacks to application functions */
khuang 0:fb026a2f6755 159 kw40z_device.attach_buttonLeft(&ButtonLeft);
khuang 0:fb026a2f6755 160 kw40z_device.attach_buttonRight(&ButtonRight);
khuang 0:fb026a2f6755 161 kw40z_device.attach_buttonUp(&ButtonUp);
khuang 0:fb026a2f6755 162 kw40z_device.attach_buttonDown(&ButtonDown);
khuang 0:fb026a2f6755 163
khuang 0:fb026a2f6755 164 /* Change font color to white */
khuang 0:fb026a2f6755 165 textProperties.fontColor = COLOR_WHITE;
khuang 0:fb026a2f6755 166 textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 0:fb026a2f6755 167 oled.SetTextProperties(&textProperties);
khuang 0:fb026a2f6755 168
khuang 0:fb026a2f6755 169 /*Displays the Home Screen*/
khuang 0:fb026a2f6755 170 displayHome();
khuang 0:fb026a2f6755 171
khuang 0:fb026a2f6755 172 /*Draw Home Button and Send Button*/
khuang 0:fb026a2f6755 173 oled.DrawImage(homeBMP,0,81);
khuang 0:fb026a2f6755 174 oled.DrawImage(sendBMP,53,81);
khuang 0:fb026a2f6755 175 oled.DrawImage(hexicomm_bmp,0,0);
khuang 0:fb026a2f6755 176
khuang 0:fb026a2f6755 177 while (true)
khuang 0:fb026a2f6755 178 {
khuang 0:fb026a2f6755 179
khuang 0:fb026a2f6755 180 // If we've received anything in the nRF24L01+...
khuang 0:fb026a2f6755 181 if ( my_nrf24l01p.readable() ) {
khuang 0:fb026a2f6755 182
khuang 0:fb026a2f6755 183 // ...read the data into the receive buffer
khuang 0:fb026a2f6755 184 my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof(rxData));
khuang 0:fb026a2f6755 185
khuang 0:fb026a2f6755 186 //Set a flag that a message has been received
khuang 0:fb026a2f6755 187 sentMessageDisplayedFlag=1;
khuang 0:fb026a2f6755 188
khuang 0:fb026a2f6755 189 //Turn on Green LED to indicate received message
khuang 0:fb026a2f6755 190 greenLed = !sentMessageDisplayedFlag;
khuang 0:fb026a2f6755 191 //Turn area black to get rid of Send Button
khuang 0:fb026a2f6755 192 oled.DrawBox (53,81,43,15,COLOR_BLACK);
khuang 0:fb026a2f6755 193
khuang 0:fb026a2f6755 194
khuang 0:fb026a2f6755 195 char name[7];
khuang 0:fb026a2f6755 196
khuang 0:fb026a2f6755 197 name[0] = rxData[2];
khuang 0:fb026a2f6755 198 name[1] = rxData[3];
khuang 0:fb026a2f6755 199 name[2] = ' ';
khuang 0:fb026a2f6755 200 name[3] = 's';
khuang 0:fb026a2f6755 201 name[4] = 'e';
khuang 0:fb026a2f6755 202 name[5] = 'n';
khuang 0:fb026a2f6755 203 name[6] = 't';
khuang 0:fb026a2f6755 204
khuang 0:fb026a2f6755 205 oled.TextBox((uint8_t *)name,0,20,95,18);
khuang 0:fb026a2f6755 206
khuang 0:fb026a2f6755 207 switch (rxData[0])
khuang 0:fb026a2f6755 208 {
khuang 0:fb026a2f6755 209 case 'M':
khuang 0:fb026a2f6755 210 {
khuang 0:fb026a2f6755 211 oled.TextBox("Meet",0,35,95,18);
khuang 0:fb026a2f6755 212 break;
khuang 0:fb026a2f6755 213 }
khuang 0:fb026a2f6755 214 case 'I':
khuang 0:fb026a2f6755 215 {
khuang 0:fb026a2f6755 216 oled.TextBox(" ",0,35,95,18);
khuang 0:fb026a2f6755 217 break;
khuang 0:fb026a2f6755 218 }
khuang 0:fb026a2f6755 219
khuang 0:fb026a2f6755 220 default: {break;}
khuang 0:fb026a2f6755 221
khuang 0:fb026a2f6755 222 }
khuang 0:fb026a2f6755 223
khuang 0:fb026a2f6755 224 switch (rxData[1])
khuang 0:fb026a2f6755 225 {
khuang 0:fb026a2f6755 226 case '0':
khuang 0:fb026a2f6755 227 {
khuang 0:fb026a2f6755 228 oled.TextBox("Where Yall?",0,50,95,18);
khuang 0:fb026a2f6755 229 break;
khuang 0:fb026a2f6755 230 }
khuang 0:fb026a2f6755 231 case '1':
khuang 0:fb026a2f6755 232 {
khuang 0:fb026a2f6755 233 oled.TextBox("@ Stage 1",0,50,95,18);
khuang 0:fb026a2f6755 234 break;
khuang 0:fb026a2f6755 235 }
khuang 0:fb026a2f6755 236 case '2':
khuang 0:fb026a2f6755 237 {
khuang 0:fb026a2f6755 238 oled.TextBox("@ Stage 2",0,50,95,18);
khuang 0:fb026a2f6755 239 break;
khuang 0:fb026a2f6755 240 }
khuang 0:fb026a2f6755 241 case '3':
khuang 0:fb026a2f6755 242 {
khuang 0:fb026a2f6755 243 oled.TextBox("@ Stage 3",0,50,95,18);
khuang 0:fb026a2f6755 244 break;
khuang 0:fb026a2f6755 245 }
khuang 0:fb026a2f6755 246 case '4':
khuang 0:fb026a2f6755 247 {
khuang 0:fb026a2f6755 248 oled.TextBox("@ Stage 4",0,50,95,18);
khuang 0:fb026a2f6755 249 break;
khuang 0:fb026a2f6755 250 }
khuang 0:fb026a2f6755 251 case '5':
khuang 0:fb026a2f6755 252 {
khuang 0:fb026a2f6755 253 oled.TextBox("@ Stage 5",0,50,95,18);
khuang 0:fb026a2f6755 254 break;
khuang 0:fb026a2f6755 255 }
khuang 0:fb026a2f6755 256
khuang 0:fb026a2f6755 257 default:{break;}
khuang 0:fb026a2f6755 258 }
khuang 0:fb026a2f6755 259 StartHaptic();
khuang 0:fb026a2f6755 260 }
khuang 0:fb026a2f6755 261
khuang 0:fb026a2f6755 262
khuang 0:fb026a2f6755 263 Thread::wait(50);
khuang 0:fb026a2f6755 264 }
khuang 0:fb026a2f6755 265 }
khuang 0:fb026a2f6755 266
khuang 0:fb026a2f6755 267 /******************************End of Main*************************************/
khuang 0:fb026a2f6755 268
khuang 0:fb026a2f6755 269 void StartHaptic(void) {
khuang 0:fb026a2f6755 270 hapticTimer.start(50);
khuang 0:fb026a2f6755 271 haptic = 1;
khuang 0:fb026a2f6755 272 }
khuang 0:fb026a2f6755 273
khuang 0:fb026a2f6755 274 void StopHaptic(void const *n) {
khuang 0:fb026a2f6755 275 haptic = 0;
khuang 0:fb026a2f6755 276 hapticTimer.stop();
khuang 0:fb026a2f6755 277 }
khuang 0:fb026a2f6755 278
khuang 0:fb026a2f6755 279 void displayHome(void)
khuang 0:fb026a2f6755 280 {
khuang 0:fb026a2f6755 281
khuang 0:fb026a2f6755 282 oled.TextBox(" ",0,20,95,18); //Line 1
khuang 0:fb026a2f6755 283 oled.TextBox("Where",0,35,95,18); //Line 2
khuang 0:fb026a2f6755 284 oled.TextBox("Yall At?",0,50,95,18); //Line 3
khuang 0:fb026a2f6755 285 strcpy(txData,"I"); //Packet[0]
khuang 0:fb026a2f6755 286 strcat(txData,"0"); //Packet[1]
khuang 0:fb026a2f6755 287 strcat(txData,NAME); //Packet[2:3]
khuang 0:fb026a2f6755 288 }
khuang 0:fb026a2f6755 289
khuang 0:fb026a2f6755 290
khuang 0:fb026a2f6755 291 void screenHandler(uint8_t stageNum,uint8_t header)
khuang 0:fb026a2f6755 292 {
khuang 0:fb026a2f6755 293
khuang 0:fb026a2f6755 294 //Text for Line 1
khuang 0:fb026a2f6755 295 oled.TextBox(" ",0,20,95,18);
khuang 0:fb026a2f6755 296
khuang 0:fb026a2f6755 297 //Text for Line 2
khuang 0:fb026a2f6755 298 switch(header)
khuang 0:fb026a2f6755 299 {
khuang 0:fb026a2f6755 300 case 0:
khuang 0:fb026a2f6755 301 {
khuang 0:fb026a2f6755 302 //Packet Encoding for I am @
khuang 0:fb026a2f6755 303 strcpy(txData,"I");
khuang 0:fb026a2f6755 304 oled.TextBox("I am",0,35,95,18);
khuang 0:fb026a2f6755 305 break;
khuang 0:fb026a2f6755 306 }
khuang 0:fb026a2f6755 307 case 1:
khuang 0:fb026a2f6755 308 {
khuang 0:fb026a2f6755 309 //Packet Encoding for Meet @
khuang 0:fb026a2f6755 310 strcpy(txData,"M");
khuang 0:fb026a2f6755 311 oled.TextBox("Meet",0,35,95,18);
khuang 0:fb026a2f6755 312 break;
khuang 0:fb026a2f6755 313 }
khuang 0:fb026a2f6755 314 default:
khuang 0:fb026a2f6755 315 {
khuang 0:fb026a2f6755 316 break;
khuang 0:fb026a2f6755 317 }
khuang 0:fb026a2f6755 318 }
khuang 0:fb026a2f6755 319
khuang 0:fb026a2f6755 320 //Text for Line 3
khuang 0:fb026a2f6755 321 switch (stageNum)
khuang 0:fb026a2f6755 322 {
khuang 0:fb026a2f6755 323 case 0:
khuang 0:fb026a2f6755 324 {
khuang 0:fb026a2f6755 325 displayHome();
khuang 0:fb026a2f6755 326 break;
khuang 0:fb026a2f6755 327 }
khuang 0:fb026a2f6755 328
khuang 0:fb026a2f6755 329 case 1:
khuang 0:fb026a2f6755 330 {
khuang 0:fb026a2f6755 331 //Packet Encoding for Stage 1
khuang 0:fb026a2f6755 332 strcat(txData,"1");
khuang 0:fb026a2f6755 333 oled.TextBox("@ Stage 1",0,50,95,18);
khuang 0:fb026a2f6755 334 break;
khuang 0:fb026a2f6755 335 }
khuang 0:fb026a2f6755 336 case 2:
khuang 0:fb026a2f6755 337 {
khuang 0:fb026a2f6755 338 //Packet Encoding for Stage 2
khuang 0:fb026a2f6755 339 strcat(txData,"2");
khuang 0:fb026a2f6755 340 oled.TextBox("@ Stage 2",0,50,95,18);
khuang 0:fb026a2f6755 341 break;
khuang 0:fb026a2f6755 342 }
khuang 0:fb026a2f6755 343 case 3:
khuang 0:fb026a2f6755 344 {
khuang 0:fb026a2f6755 345 //Packet Encoding for Stage 3
khuang 0:fb026a2f6755 346 strcat(txData,"3");
khuang 0:fb026a2f6755 347 oled.TextBox("@ Stage 3",0,50,95,18);
khuang 0:fb026a2f6755 348 break;
khuang 0:fb026a2f6755 349 }
khuang 0:fb026a2f6755 350 case 4:
khuang 0:fb026a2f6755 351 {
khuang 0:fb026a2f6755 352 //Packet Encoding for Stage 4
khuang 0:fb026a2f6755 353 strcat(txData,"4");
khuang 0:fb026a2f6755 354 oled.TextBox("@ Stage 4",0,50,95,18);
khuang 0:fb026a2f6755 355 break;
khuang 0:fb026a2f6755 356 }
khuang 0:fb026a2f6755 357 case 5:
khuang 0:fb026a2f6755 358 {
khuang 0:fb026a2f6755 359 //Packet Encoding for Stage 5
khuang 0:fb026a2f6755 360 strcat(txData,"5");
khuang 0:fb026a2f6755 361 oled.TextBox("@ Stage 5",0,50,95,18);
khuang 0:fb026a2f6755 362 break;
khuang 0:fb026a2f6755 363 }
khuang 0:fb026a2f6755 364 default:
khuang 0:fb026a2f6755 365 {
khuang 0:fb026a2f6755 366 break;
khuang 0:fb026a2f6755 367 }
khuang 0:fb026a2f6755 368 }
khuang 0:fb026a2f6755 369
khuang 0:fb026a2f6755 370 //Append Initials to txData[2:3].
khuang 0:fb026a2f6755 371 strcat(txData,NAME);
khuang 0:fb026a2f6755 372
khuang 0:fb026a2f6755 373 }
khuang 0:fb026a2f6755 374