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

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351 nRF24L01

Revision:
0:fb026a2f6755
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 05 06:03:08 2016 +0000
@@ -0,0 +1,374 @@
+#include "mbed.h"
+#include "Hexi_KW40Z.h"
+#include "Hexi_OLED_SSD1351.h"
+#include "OLED_types.h"
+#include "OpenSans_Font.h"
+#include "nRF24L01P.h"
+#include "string.h"
+#include "images.h"
+
+#define NAME    "RB"
+
+#define LED_ON      0
+#define LED_OFF     1
+#define NUM_OF_SCREENS 6
+#define TRANSFER_SIZE   4
+   
+void StartHaptic(void);
+void StopHaptic(void const *n);
+void txTask(void);
+
+void displayHome();   
+void screenHandler(uint8_t stageNum,uint8_t header);
+
+DigitalOut redLed(LED1,1);
+DigitalOut greenLed(LED2,1);
+DigitalOut blueLed(LED3,1);
+DigitalOut haptic(PTB9);
+
+/* Define timer for haptic feedback */
+RtosTimer hapticTimer(StopHaptic, osTimerOnce);
+
+/* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */ 
+KW40Z kw40z_device(PTE24, PTE25);
+
+/* Instantiate the SSD1351 OLED Driver */ 
+SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
+oled_text_properties_t textProperties = {0};
+
+/* Instantiate the nRF24L01P Driver */ 
+nRF24L01P my_nrf24l01p(PTC6,PTC7,PTC5,PTC4,PTB2,NC);    // mosi, miso, sck, csn, ce, irq
+
+ /* Text Buffer */ 
+char text[20]; 
+
+uint8_t screenNum=0;
+bool prefix=0; 
+bool sentMessageDisplayedFlag=0;
+char rxData[TRANSFER_SIZE];
+char txData[TRANSFER_SIZE];
+
+/* Pointer for the image to be displayed  */  
+const uint8_t *homeBMP = HEXIWEAR_HOME_bmp;
+const uint8_t *sendBMP  = HEXIWEAR_SEND_bmp;
+const uint8_t *bannerBMP = hexicomm_bmp; 
+   
+/****************************Call Back Functions*******************************/
+/*Send Button */
+void ButtonRight(void)
+{
+    if (!sentMessageDisplayedFlag)
+    {
+        StartHaptic();
+    
+        // Send the transmitbuffer via the nRF24L01+
+        my_nrf24l01p.write( NRF24L01P_PIPE_P0,  txData, 4 );
+    }
+}
+
+/*Home Button */
+void ButtonLeft(void)
+{
+    StartHaptic();
+    screenNum = 0; 
+    
+    /*Turn off Green LED */
+    sentMessageDisplayedFlag=0;
+    greenLed = !sentMessageDisplayedFlag;
+    
+    /*Redraw Send Button*/
+    oled.DrawImage(sendBMP,53,81);
+    screenHandler(screenNum,prefix);
+}
+
+/*Toggles Between I am @ and Meet @ */
+void ButtonUp(void)
+{
+    if (screenNum !=0)
+    {
+        StartHaptic();
+        
+        /*Turn off Green LED */
+        sentMessageDisplayedFlag=0;
+        greenLed = !sentMessageDisplayedFlag;
+        
+        /*Redraw Send Button*/
+        oled.DrawImage(sendBMP,53,81);
+
+        prefix = !prefix; 
+        screenHandler(screenNum,prefix);
+    }
+}
+
+/*Advances Stage Number */
+void ButtonDown(void)
+{
+    StartHaptic();
+    
+    /*Turn off Green LED */
+    sentMessageDisplayedFlag=0;
+    greenLed = !sentMessageDisplayedFlag;
+    
+    /*Redraw Send Button*/
+    oled.DrawImage(sendBMP,53,81);
+    
+    if (screenNum < NUM_OF_SCREENS -1) {
+        screenNum++;
+    }
+    else
+    {   
+         screenNum = 0; 
+    }
+    
+    screenHandler(screenNum,prefix);
+}
+
+
+/***********************End of Call Back Functions*****************************/
+
+/********************************Main******************************************/
+
+int main()
+{    
+    /* Wait Sequence in the beginning for board to be reset then placed in mini docking station*/ 
+   
+    Thread::wait(6000);
+    blueLed=0;
+    Thread::wait(500);
+    blueLed=1;
+    
+
+    /* NRF24l0p Setup */
+    my_nrf24l01p.init();
+    my_nrf24l01p.powerUp();
+    my_nrf24l01p.setAirDataRate(NRF24L01P_DATARATE_250_KBPS);
+    my_nrf24l01p.setRfOutputPower(NRF24L01P_TX_PWR_ZERO_DB);
+    my_nrf24l01p.setRxAddress(0xE7E7E7E7E8);
+    my_nrf24l01p.setTxAddress(0xE7E7E7E7E8);
+    my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
+    my_nrf24l01p.setReceiveMode();
+    my_nrf24l01p.enable();
+    
+    /* Get OLED Class Default Text Properties */
+    oled.GetTextProperties(&textProperties);    
+
+    /* Fills the screen with solid black */         
+    oled.FillScreen(COLOR_BLACK);
+        
+    /* Register callbacks to application functions */
+    kw40z_device.attach_buttonLeft(&ButtonLeft);
+    kw40z_device.attach_buttonRight(&ButtonRight);
+    kw40z_device.attach_buttonUp(&ButtonUp);
+    kw40z_device.attach_buttonDown(&ButtonDown);
+ 
+    /* Change font color to white */ 
+    textProperties.fontColor   = COLOR_WHITE;
+    textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
+    oled.SetTextProperties(&textProperties);
+    
+    /*Displays the Home Screen*/ 
+    displayHome();   
+     
+    /*Draw Home Button and Send Button*/  
+    oled.DrawImage(homeBMP,0,81);
+    oled.DrawImage(sendBMP,53,81);
+    oled.DrawImage(hexicomm_bmp,0,0);
+
+    while (true) 
+    {
+        
+        // If we've received anything in the nRF24L01+...
+        if ( my_nrf24l01p.readable() ) {
+
+            // ...read the data into the receive buffer
+            my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof(rxData));
+            
+            //Set a flag that a message has been received 
+            sentMessageDisplayedFlag=1;
+            
+            //Turn on Green LED to indicate received message 
+            greenLed = !sentMessageDisplayedFlag;
+            //Turn area black to get rid of Send Button 
+            oled.DrawBox (53,81,43,15,COLOR_BLACK);
+
+     
+            char name[7];
+            
+            name[0] = rxData[2];
+            name[1] = rxData[3];
+            name[2] = ' ';
+            name[3] = 's';
+            name[4] = 'e';
+            name[5] = 'n';
+            name[6] = 't';
+            
+            oled.TextBox((uint8_t *)name,0,20,95,18);
+
+            switch (rxData[0])
+            {
+                case 'M':
+                {
+                    oled.TextBox("Meet",0,35,95,18);
+                    break;
+                }
+                case 'I':
+                {
+                    oled.TextBox(" ",0,35,95,18);
+                    break;
+                }
+
+                default: {break;}
+
+            }
+
+            switch (rxData[1])
+            {
+                case '0':
+                {
+                    oled.TextBox("Where Yall?",0,50,95,18);
+                    break;
+                }
+                case '1':
+                {
+                    oled.TextBox("@ Stage 1",0,50,95,18);
+                    break;
+                }
+                case '2':
+                {
+                    oled.TextBox("@ Stage 2",0,50,95,18);
+                    break;
+                }
+                case '3':
+                {
+                    oled.TextBox("@ Stage 3",0,50,95,18);
+                    break;
+                }
+                 case '4':
+                {
+                    oled.TextBox("@ Stage 4",0,50,95,18);
+                    break;
+                }
+                 case '5':
+                {
+                    oled.TextBox("@ Stage 5",0,50,95,18);
+                    break;
+                }
+
+                default:{break;}
+            }
+            StartHaptic();
+        }
+        
+        
+        Thread::wait(50);
+    }
+}
+
+/******************************End of Main*************************************/
+
+void StartHaptic(void)  {
+    hapticTimer.start(50);
+    haptic = 1;
+}
+
+void StopHaptic(void const *n) {
+    haptic = 0;
+    hapticTimer.stop();
+}
+
+void displayHome(void)  
+{
+
+    oled.TextBox(" ",0,20,95,18);           //Line 1
+    oled.TextBox("Where",0,35,95,18);       //Line 2
+    oled.TextBox("Yall At?",0,50,95,18);    //Line 3    
+    strcpy(txData,"I");                     //Packet[0]
+    strcat(txData,"0");                     //Packet[1]
+    strcat(txData,NAME);                    //Packet[2:3]
+}  
+
+
+void screenHandler(uint8_t stageNum,uint8_t header)
+{
+
+    //Text for Line 1
+    oled.TextBox(" ",0,20,95,18);
+
+    //Text for Line 2
+    switch(header)                  
+    {
+        case 0:
+        {
+            //Packet Encoding for I am @
+            strcpy(txData,"I");                 
+            oled.TextBox("I am",0,35,95,18);
+            break;
+        }    
+        case 1:
+        {
+            //Packet Encoding for Meet @
+            strcpy(txData,"M");                 
+            oled.TextBox("Meet",0,35,95,18);
+            break;
+        }    
+        default:
+        {
+            break;
+        }
+    }
+
+    //Text for Line 3
+    switch (stageNum)
+    {
+        case 0:
+        {
+            displayHome();
+            break;
+        }
+
+        case 1:
+        {
+            //Packet Encoding for Stage 1
+            strcat(txData,"1");
+            oled.TextBox("@ Stage 1",0,50,95,18);
+            break;
+        }
+        case 2:
+        {
+            //Packet Encoding for Stage 2
+            strcat(txData,"2");
+            oled.TextBox("@ Stage 2",0,50,95,18);
+            break;
+        }
+        case 3:
+        {
+            //Packet Encoding for Stage 3
+            strcat(txData,"3");
+            oled.TextBox("@ Stage 3",0,50,95,18);
+            break;
+        }
+        case 4:
+        {
+            //Packet Encoding for Stage 4
+            strcat(txData,"4");
+            oled.TextBox("@ Stage 4",0,50,95,18);
+            break;
+        }
+        case 5:
+        {
+            //Packet Encoding for Stage 5
+            strcat(txData,"5");
+            oled.TextBox("@ Stage 5",0,50,95,18);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+    
+    //Append Initials to txData[2:3]. 
+    strcat(txData,NAME);
+   
+}
+