Projet_ST_Afficheur_BLE / Mbed 2 deprecated STM32_BLE_MEMS_LED_PANEL

Dependencies:   mbed X_NUCLEO_IKS01A2 X_NUCLEO_IDB0XA1 BLE_API

Files at this revision

API Documentation at this revision

Comitter:
waby38
Date:
Fri Nov 24 16:03:25 2017 +0000
Parent:
2:74b8978081c5
Commit message:
Last updates

Changed in this revision

X_NUCLEO_IKS01A1.lib Show diff for this revision Revisions of this file
X_NUCLEO_IKS01A2.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/X_NUCLEO_IKS01A1.lib	Fri Jun 16 12:23:52 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A1/#d1c67d482bad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IKS01A2.lib	Fri Nov 24 16:03:25 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A2/#138a7a28bd21
--- a/main.cpp	Fri Jun 16 12:23:52 2017 +0000
+++ b/main.cpp	Fri Nov 24 16:03:25 2017 +0000
@@ -15,44 +15,62 @@
  */
 
 #include "mbed.h"
-#include "x_nucleo_iks01a1.h"
+#include "XNucleoIKS01A2.h"
 #include "ble/BLE.h"
 #include "ble/services/UARTService.h"
 #include "Serial.h"
 
-static uint8_t panel_disppage=0;
-
-/* Instantiate the expansion board */
+/* Instantiate the mems expansion board */
+static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
 
-static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
-static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
-static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
-static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
-static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
-static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
+/* Retrieve the composing elements of the expansion board */
+static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
+static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
+static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
+static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
+static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
 
+/* BLE part */
 #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN*10)
-
-const static char DEVICE_NAME[] = "LEDPANEL";
+const static char DEVICE_NAME[] = "$PANEL$";
 UARTService *uartServicePtr;
 static char BLEBuffRX[UART_BUFFER];
 static uint8_t BLEBuffPos=0;
+void onBleError(ble_error_t error);
 
+/* pc uart part */
 static char uartBuff[UART_BUFFER];
 static uint8_t uartBuffPos=0;
+Serial uart1(USBTX,USBRX);
+#define DEBUG uart1.printf
 
-void onBleError(ble_error_t error);
+/* Led panel part */
+#define PANEL_PAGE_NUMBER 26
+#define PANEL_PAGE_SIZE 256
+Serial uart_panel(PA_9,PA_10);
+static uint8_t panel_disppage=0;
+static char panel_msg[PANEL_PAGE_NUMBER][PANEL_PAGE_SIZE]={
+        "<FE><MA><WC><FE>Bienvenue a STMicroeletronics",
+        "<FE><MA><WC><FE>Welcome to STMicroeletronics",
+        "<FE><MA><WC><FE>Today is <KD>",
+        "<FE><MA><WC><FE>It is <KT>",
+        "<FE><MA><WC><FE>Temp is <TEMPERAT>",
+        "<FE><MA><WC><FE>I am a <CE>STM32L476",
+        "<FE><MA><WC><FE>with <CE>MEMs <CB>and <CE>BLE <CB>shields"
+};
+
+typedef enum {
+    SCROLL_DEFAULT,
+    SCROLL_LEFT,
+    SCROLL_RIGHT,
+    SCROLL_UP,
+    SCROLL_DOWN
+} panel_effect_e ;
+panel_effect_e panel_effect = SCROLL_DEFAULT;
 
 DigitalOut led1(LED1);
-Serial uart1(USBTX,USBRX);
-Serial uart_panel(PA_9,PA_10);
 Ticker ticker;
 
-
-
-
-#define DEBUG uart1.printf
-
 /* Helper function for printing floats & doubles */
 static char *printDouble(char* str, double v, int decimalDigits=2)
 {
@@ -87,101 +105,166 @@
   return str;
 }
 
-/*void temp(void){
-      float value1, value2;
-      char buffer1[32], buffer2[32];
-      temp_sensor1->get_temperature(&value1);
-    humidity_sensor->get_humidity(&value2);
-    }*/
-/* Ticker */
 void panel_sendmsg(char line, char page, char* text){
-    char buff[256];
-    char* pos_t;       
+    char buff[PANEL_PAGE_SIZE];
+    char* pos_t;   
+    char* pos_p;
+    char* pos_h; 
+    char* pos_e; 
+    char* panel_reset; 
     uint8_t i, checksum=0;
+    pos_t=strstr(text,"<SC>");
+    if(pos_t!=0) {
+        sprintf(buff,"<ID00>%s",text);
+        for(i=6; i<strlen(buff); i++){
+            checksum ^= buff[i];
+        }
+        sprintf(buff,"%s%02X<E>", buff, checksum);
+        uart1.printf("panel msg = %s\r\n", buff);
+        uart_panel.printf(buff);
+        return;
+    }  
     sprintf(buff, "<ID00><L%c><P%c>%s", line, page, text);
-    pos_t=strstr(buff,"<TEMP>");
-    if(pos_t!=0){
+    pos_t=strstr(buff,"<TEMPERAT>");
+    if(pos_t!=0) {
         float sensor_temp;
         char temp[3];
-        temp_sensor1->get_temperature(&sensor_temp);
+       hum_temp->get_temperature(&sensor_temp);
         sprintf(temp, "%02d", (int)sensor_temp);
         buff[pos_t-buff]=' ';       /* replace < */
-        buff[pos_t-buff+1]=temp[0]; /* replace T */ 
-        buff[pos_t-buff+2]=temp[1]; /* replace E */   
-        buff[pos_t-buff+3]='°';     /* replace M */   
-        buff[pos_t-buff+4]='C';     /* replace P */   
-        buff[pos_t-buff+5]=' ';     /* replace > */   
+        buff[pos_t-buff+1]=temp[0]; /* replace T */
+        buff[pos_t-buff+2]=temp[1]; /* replace E */
+        buff[pos_t-buff+3]='<';     /* replace M */
+        buff[pos_t-buff+4]='U';     /* replace P */
+        buff[pos_t-buff+5]='3';     /* replace E */
+        buff[pos_t-buff+6]='A';     /* replace R */
+        buff[pos_t-buff+7]='>';     /* replace A */
+        buff[pos_t-buff+8]='C';     /* replace T */
+        buff[pos_t-buff+9]=' ';     /* replace > */
+    }
+    pos_p=strstr(buff,"<PRESSI>");
+    if(pos_p!=0) {
+        float sensor_pres;
+        char pres[3];
+        press_temp->get_pressure(&sensor_pres);
+        sprintf(pres, "%02d", (int)sensor_pres);
+        buff[pos_p-buff]=' ';       /* replace < */
+        buff[pos_p-buff+1]=pres[0]; /* replace P */
+        buff[pos_p-buff+2]=pres[1]; /* replace R */
+        buff[pos_p-buff+3]='m';     /* replace E */
+        buff[pos_p-buff+4]='B';     /* replace S */
+        buff[pos_p-buff+5]='a';     /* replace S */
+        buff[pos_p-buff+6]='r';     /* replace I */
+        buff[pos_p-buff+7]=' ';     /* replace > */
+
     }
+    pos_h=strstr(buff,"<HUM>");
+    if(pos_h!=0) {
+        float sensor_hum;
+        char hum[3];
+        hum_temp->get_humidity(&sensor_hum);
+        sprintf(hum, "%02d", (int)sensor_hum);
+        buff[pos_h-buff]=' ';       /* replace < */
+        buff[pos_h-buff+1]=hum[0];  /* replace H */
+        buff[pos_h-buff+2]=hum[1];  /* replace U */
+        buff[pos_h-buff+3]='\'';    /* replace M */
+        buff[pos_h-buff+4]=' ';     /* replace > */
+    }
+    switch(panel_effect) {
+        case SCROLL_RIGHT:
+            pos_e=strstr(buff,"<F");
+            buff[pos_e-buff+2]='F';
+            buff[pos_e-buff+14]='F';
+            break;
+        case SCROLL_LEFT:
+            pos_e=strstr(buff,"<F");
+            buff[pos_e-buff+2]='E';
+            buff[pos_e-buff+14]='E';
+            break;
+        case SCROLL_UP:
+            pos_e=strstr(buff,"<F");
+            buff[pos_e-buff+2]='I';
+            buff[pos_e-buff+14]='I';
+            break;
+        case SCROLL_DOWN:
+            pos_e=strstr(buff,"<F");
+            buff[pos_e-buff+2]='J';
+            buff[pos_e-buff+14]='J';             
+            break;
+        case SCROLL_DEFAULT: 
+            /* No change */
+            break;
+    }
+    panel_reset=strstr(buff,"<RES>");
+    if(panel_reset!=0){
+        sprintf(buff,"<ID00><D*>");
+    }
+    
     for(i=6; i<strlen(buff); i++){
         checksum ^= buff[i];
     }
     sprintf(buff,"%s%02X<E>", buff, checksum);
-    uart1.printf("pannel msg = %s temp@ %s pos_t@ %d\r\n", buff, pos_t, pos-buff);
+     
+    uart1.printf("panel msg = %s pos_d@ %d\r\n", buff, pos_h-buff);
     uart_panel.printf(buff);
 
-    wait(1);
+    wait(0.1);
     checksum=0;
-    if(panel_disppage < (page-'A'+1)){
-        panel_disppage = page-'A';
-        sprintf(buff, "<ID00><TA>00010100009912302359%c",page);
+    if(panel_disppage < page-'A'+1){
+        panel_disppage = page-'A'+1;
+        sprintf(buff, "<ID00><TA>00010100009912302359");
         
         for(i=0; i<panel_disppage; i++){
-
             sprintf(buff,"%s%c",buff,i+'A');
-            
-        //sprintf(buff,"%s%c",buff,i+'A');
         }
         for(i=6; i<strlen(buff); i++){
             checksum ^= buff[i];
         }
         sprintf(buff,"%s%02X<E>", buff, checksum);
         
-        uart1.printf("pannel msg = %s\r\n", buff);
+        uart1.printf("panel msg = %s\r\n", buff);
+       
         uart_panel.printf(buff);
     }
 }
 
-void periodicCallback(void)
-{  
-    float sensor_temp, sensor_humidity;
-//    int32_t axes[3];
-//    char buffer1[32], buffer2[32];
+void periodicCallback(void){  
+    int32_t axes[3];
+    panel_effect_e new_panel_effect;
+    acc_gyro->get_x_axes(axes);
+    new_panel_effect = SCROLL_DEFAULT;
+
+  accelerometer->enable();
+  acc_gyro->enable_x();
 
-    led1 = !led1;
-    temp_sensor1->get_temperature(&sensor_temp);
-    humidity_sensor->get_humidity(&sensor_humidity);
-//    printf("HTS221: [temp] %7s°C,   [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
-//magnetometer->get_m_axes(axes);
-//    printf("LIS3MDL [mag/mgauss]:  %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
- 
-//    accelerometer->get_x_axes(axes);
-//    printf("LSM6DS0 [acc/mg]:      %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
-#if 0 
-    gyroscope->get_g_axes(axes);
-    if(axes[0]>6000){
-        char* gyro_arriere="1A<FE><MA><WC><FE>Axe Z vers l'arriere";
-        panel_sendmsg(gyro_arriere[1],gyro_arriere[2],(char *)&gyro_arriere[3]);
+//    DEBUG("accelerometer : %d %d %d\r\n", axes[0], axes[1], axes[2]);
+    if(axes[1]<-800){ /* move up */
+        new_panel_effect = SCROLL_UP;
+    }
+    if(axes[1]>800){ /* move down */
+        new_panel_effect = SCROLL_DOWN;
+    }
+    if(axes[0]<-800){ /* move to left */
+        new_panel_effect = SCROLL_LEFT;
     }
-    else if(axes[0]<-6000){
-        char* gyro_avant="1A<FE><MA><WC><FE>Axe Z vers l'avant";
-        panel_sendmsg(gyro_avant[1],gyro_avant[2],(char *)&gyro_avant[3]);
+    if(axes[0]>800){ /* move to right */
+        new_panel_effect = SCROLL_RIGHT;
     }
-    if(axes[1]> 6000){
-        char* gyro_droit= "1A<FE><MA><WC><FE>Axe Y vers la gauche";
-        panel_sendmsg(gyro_droit[0],gyro_droit[1], (char *)&gyro_droit[2]);}
-        else    if(axes[2]< -6000){
-        char* gyro_gauche= "1A<FE><MA><WC><FE>Axe Y vers la droite";
-        panel_sendmsg(gyro_gauche[0],gyro_gauche[1], (char *)&gyro_gauche[2]);}
-        
-        if(axes[2]> 6000){
-        char* gyro_anti_horaire= "1A<FE><MA><WC><FE>Axe X vers la gauche";
-        panel_sendmsg(gyro_anti_horaire[0],gyro_anti_horaire[1], (char *)&gyro_anti_horaire[2]);}
-        else    if(axes[2]< -6000){
-        char* gyro_horaire= "1A<FE><MA><WC><FE>Axe X vers la droite";
-        panel_sendmsg(gyro_horaire[0],gyro_horaire[1], (char *)&gyro_horaire[2]);}
-    }
-//    printf("LSM6DS0 [gyro/mdps]:   %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
-#endif
+    if(new_panel_effect != panel_effect){
+        uint8_t i=0;
+       panel_effect=new_panel_effect;
+    /*    while(strlen(panel_msg[i])){
+            panel_sendmsg('1','A'+i,panel_msg[i]);
+            i++;
+        }  */
+           while(i<26){
+            if(strlen(panel_msg[i])){
+            panel_sendmsg('1','A'+i,panel_msg[i]);
+           }
+           i++;
+        }  
+    }     
+
 }
 
 /* UART */
@@ -194,6 +277,9 @@
             /* We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN otherwise we need to wait */
             uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
             DEBUG("TX : %s\r\n", uartBuff);
+            if(uartBuff[0]!='0'){
+                strcpy(panel_msg[uartBuff[1]-'A'],&uartBuff[2]);
+            }          
             panel_sendmsg(uartBuff[0],uartBuff[1], &uartBuff[2]);
             memset(uartBuff, 0, UART_BUFFER);
             uartBuffPos = 0;       
@@ -207,17 +293,15 @@
 void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) {
     DEBUG("BLE Client Connected!\n\r");
     DEBUG("Please type a string and press return\r\n");
-
-    ticker.attach(periodicCallback, 1);
+    led1 = 1;
 }
 
 void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
 {
     (void)params;
     DEBUG("BLE Client Disconnected!\r\n");
-    ticker.detach();
     BLE::Instance().gap().startAdvertising(); // restart advertising
-    led1=0;
+    led1= 0;
 }
 
 void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) {
@@ -230,11 +314,26 @@
         }
         BLEBuffRX[BLEBuffPos-1]='\0';
         DEBUG("TX=>Panel: L%c P%c =>%s<=\r\n", BLEBuffRX[0],BLEBuffRX[1], &BLEBuffRX[2]);
+        DEBUG("pos dans le pannel %x PANEL_PAGE_NUMBER%d\n\r",BLEBuffRX[1]-'A',PANEL_PAGE_NUMBER);
+     if(BLEBuffRX[0]!='0'){
+          
+         int dippage=BLEBuffRX[1]-'A';       
+            DEBUG("disppage: %x BLEBUFFRX=%d\n\r",dippage,BLEBuffRX[1]);
+            strcpy(panel_msg[BLEBuffRX[1]-'A'],&BLEBuffRX[2]);
+           
+           DEBUG("panel_MGS: %s \n\r",panel_msg[26]); 
+         }
         panel_sendmsg(BLEBuffRX[0],BLEBuffRX[1], &BLEBuffRX[2]);
+        uart1.printf("%c\n",panel_msg);
         BLEBuffPos=0;
+        
+      
+          
     }
+   
 }
 
+
 void onBleError(ble_error_t error) { 
     DEBUG("BLE Error: %d\r\n");
     /* Handle error now */
@@ -282,14 +381,22 @@
 
 int main(void)
 {
+    uint8_t i=0;
     led1=0;
-    
+    hum_temp->enable();
+    press_temp->enable();
     uart_panel.baud(9600);
     uart1.baud(115200);
     uart1.attach(uartRx,Serial::RxIrq);
 
+    /* Init panel */
+    while(strlen(panel_msg[i])){
+        panel_sendmsg('1','A'+i,panel_msg[i]);
+        i++;
+    }
+    
+    ticker.attach(periodicCallback, 2);
     BLE &ble = BLE::Instance();
     ble.init(bleInitComplete);
-    
 }