text export

Dependencies:   X_NUCLEO_IKS01A3

Revision:
9:8c7774aca512
Parent:
6:94151942f287
--- a/main.cpp	Thu Oct 29 12:57:19 2020 +0000
+++ b/main.cpp	Wed May 19 15:54:08 2021 +0000
@@ -1,56 +1,36 @@
-/**
- ******************************************************************************
- * @file    main.cpp
- * @author  SRA
- * @version V1.0.0
- * @date    5-March-2019
- * @brief   Simple Example application for using the X_NUCLEO_IKS01A3
- *          MEMS Inertial & Environmental Sensor Nucleo expansion board.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *   1. Redistributions of source code must retain the above copyright notice,
- *      this list of conditions and the following disclaimer.
- *   2. Redistributions in binary form must reproduce the above copyright notice,
- *      this list of conditions and the following disclaimer in the documentation
- *      and/or other materials provided with the distribution.
- *   3. Neither the name of STMicroelectronics nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
-*/
+/* mbed Microcontroller Library
+ * Copyright (c) 2019 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "mbed.h"
+#include "BufferedSerial.h"
+#include "platform/mbed_thread.h"
+
+BufferedSerial      pc(USBTX, USBRX,115200);    //Serial port for debug
+BufferedSerial      COM2(PC_12, PD_2,115200);    //Serial port COM2
+
 
-/* Includes */
-#include "mbed.h"
-#include "rtos.h"
-#include "XNucleoIKS01A3.h"
+DigitalInOut MYPIO_0(PA_9); //D8
+DigitalInOut MYPIO_1(PC_7); //D9
+DigitalInOut MYPIO_2(PB_6); //D10
+DigitalInOut MYPIO_3(PA_7); //D11
+DigitalInOut MYPIO_4(PA_6); //D12
 
-/* Instantiate the expansion board */
-static XNucleoIKS01A3 *mems_expansion_board = XNucleoIKS01A3::instance(D14, D15, D4, D5, A3, D6, A4);
+DigitalOut  LED_FAB(PB_5);
+DigitalOut  GREEN_LED(PA_5);
+DigitalIn   WATER_DETECT(PB_1); //water detect   0=ok  1=Water
 
-/* Retrieve the composing elements of the expansion board */
-static LIS2MDLSensor *magnetometer = mems_expansion_board->magnetometer;
-static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
-static LPS22HHSensor *press_temp = mems_expansion_board->pt_sensor;
-static LSM6DSOSensor *acc_gyro = mems_expansion_board->acc_gyro;
-static LIS2DW12Sensor *accelerometer = mems_expansion_board->accelerometer;
-static STTS751Sensor *temp = mems_expansion_board->t_sensor;
+AnalogIn Analog_0(PA_0);
+AnalogIn Analog_1(PA_1);
+char strAdc[10];
+
+// Blinking rate in milliseconds
+#define BLINKING_RATE_MS                                                    500
+
+char cmdParams[10][10];
+unsigned char cmdParamsCount = 0;
+
 
 /* Helper function for printing floats & doubles */
 static char *print_double(char *str, double v, int decimalDigits = 2)
@@ -59,16 +39,24 @@
     int intPart, fractPart;
     int len;
     char *ptr;
+    uint8_t fracSign = 0; //0 = negativo 1=positivo
+    
+    if(v<0){ fracSign = 0; }
+    else{ fracSign=1; }
+
 
     /* prepare decimal digits multiplicator */
     for (; decimalDigits != 0; i *= 10, decimalDigits--);
 
     /* calculate integer & fractinal parts */
-    intPart = (int)v;
+    intPart = abs((int)v);
     fractPart = (int)((v - (double)(int)v) * i);
+    fractPart = abs(fractPart);
 
     /* fill in integer part */
-    sprintf(str, "%i.", intPart);
+    if(fracSign == 0){ sprintf(str, "-%i.", intPart); }
+    else{     sprintf(str, "%i.", intPart); }
+
 
     /* prepare fill in of fractional part */
     len = strlen(str);
@@ -88,66 +76,100 @@
     return str;
 }
 
-/* Simple main function */
+
+unsigned char splitString(char *textToSplit,const char *delimiter)
+{
+    cmdParamsCount = 0;
+    char * token = strtok(textToSplit,delimiter);
+    
+    
+    while(token != NULL)
+    {
+        sprintf(cmdParams[cmdParamsCount],"%s",token);    
+        token = strtok(NULL, delimiter);
+        cmdParamsCount++;
+    }
+    
+    return cmdParamsCount;
+}
+
+bool startsWith(const char *pre, const char *str)
+{
+    size_t lenpre = strlen(pre),
+           lenstr = strlen(str);
+    return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0;
+}
+
+
+char outBuffer[255];
+char inBuffer[255] = "";
+char inChar[1];
+char gpio_map[6] = "00000";
+void execute_com1_cmd()
+{
+    inBuffer[strlen(inBuffer)-1] = 0;
+         if(startsWith("SET GPIO1_IN",inBuffer)){ MYPIO_0.input(); gpio_map[0] = '1'; }
+    else if(startsWith("SET GPIO2_IN",inBuffer)){ MYPIO_1.input(); gpio_map[1] = '1';}
+    else if(startsWith("SET GPIO3_IN",inBuffer)){ MYPIO_2.input(); gpio_map[2] = '1';}
+    else if(startsWith("SET GPIO4_IN",inBuffer)){ MYPIO_3.input(); gpio_map[3] = '1';}
+    else if(startsWith("SET GPIO5_IN",inBuffer)){ MYPIO_4.input(); gpio_map[4] = '1';}
+    else if(startsWith("SET GPIO1_OUT",inBuffer)){ MYPIO_0.output(); gpio_map[0] = '0';}
+    else if(startsWith("SET GPIO2_OUT",inBuffer)){ MYPIO_1.output(); gpio_map[1] = '0';}
+    else if(startsWith("SET GPIO3_OUT",inBuffer)){ MYPIO_2.output(); gpio_map[2] = '0';}
+    else if(startsWith("SET GPIO4_OUT",inBuffer)){ MYPIO_3.output(); gpio_map[3] = '0';}
+    else if(startsWith("SET GPIO5_OUT",inBuffer)){ MYPIO_4.output(); gpio_map[4] = '0';}
+    else if(startsWith("SET GPIO1 1",inBuffer)){ MYPIO_0.write(1); }
+    else if(startsWith("SET GPIO1 0",inBuffer)){ MYPIO_0.write(0); }
+    else if(startsWith("SET GPIO2 1",inBuffer)){ MYPIO_1.write(1); }
+    else if(startsWith("SET GPIO2 0",inBuffer)){ MYPIO_1.write(0); }
+    else if(startsWith("SET GPIO3 1",inBuffer)){ MYPIO_2.write(1); }
+    else if(startsWith("SET GPIO3 0",inBuffer)){ MYPIO_2.write(0); }
+    else if(startsWith("SET GPIO4 1",inBuffer)){ MYPIO_3.write(1); }
+    else if(startsWith("SET GPIO4 0",inBuffer)){ MYPIO_3.write(0); }    
+    else if(startsWith("SET GPIO5 1",inBuffer)){ MYPIO_4.write(1); }
+    else if(startsWith("SET GPIO5 0",inBuffer)){ MYPIO_4.write(0); }    
+    else if(startsWith("GET GPIO1",inBuffer)){ sprintf(outBuffer,"%d\r\n",MYPIO_0.read()); pc.write(outBuffer,strlen(outBuffer)); }
+    else if(startsWith("GET GPIO2",inBuffer)){ sprintf(outBuffer,"%d\r\n",MYPIO_1.read()); pc.write(outBuffer,strlen(outBuffer)); }
+    else if(startsWith("GET GPIO3",inBuffer)){ sprintf(outBuffer,"%d\r\n",MYPIO_2.read()); pc.write(outBuffer,strlen(outBuffer)); }
+    else if(startsWith("GET GPIO4",inBuffer)){ sprintf(outBuffer,"%d\r\n",MYPIO_3.read()); pc.write(outBuffer,strlen(outBuffer)); }
+    else if(startsWith("GET GPIO5",inBuffer)){ sprintf(outBuffer,"%d\r\n",MYPIO_4.read()); pc.write(outBuffer,strlen(outBuffer)); }
+    else if(startsWith("GET GPIO_MAP",inBuffer)){ sprintf(outBuffer,"%s\r\n",gpio_map); pc.write(outBuffer,strlen(outBuffer)); } 
+    else if(startsWith("GET ADC0",inBuffer)){ sprintf(outBuffer,"%s\r\n",print_double(strAdc,Analog_0*3.3,4)); pc.write(outBuffer,strlen(outBuffer)); }
+    else if(startsWith("GET ADC1",inBuffer)){ sprintf(outBuffer,"%s\r\n",print_double(strAdc,Analog_1*3.3,4)); pc.write(outBuffer,strlen(outBuffer));}
+    else if(startsWith("SET LED 1",inBuffer)){ LED_FAB.write(1); }    
+    else if(startsWith("SET LED 0",inBuffer)){ LED_FAB.write(0); } 
+}
+
+
+
 int main()
 {
-    uint8_t id;
-    float value1, value2;
-    char buffer1[32], buffer2[32];
-    int32_t axes[3];
-
-    /* Enable all sensors */
-    hum_temp->enable();
-    press_temp->enable();
-    temp->enable();
-    magnetometer->enable();
-    accelerometer->enable_x();
-    acc_gyro->enable_x();
-    acc_gyro->enable_g();
-
-    printf("\r\n--- Starting new run ---\r\n");
-
-    hum_temp->read_id(&id);
-    printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
-    press_temp->read_id(&id);
-    printf("LPS22HH  pressure & temperature   = 0x%X\r\n", id);
-    temp->read_id(&id);
-    printf("STTS751 temperature               = 0x%X\r\n", id);
-    magnetometer->read_id(&id);
-    printf("LIS2MDL magnetometer              = 0x%X\r\n", id);
-    accelerometer->read_id(&id);
-    printf("LIS2DW12 accelerometer            = 0x%X\r\n", id);
-    acc_gyro->read_id(&id);
-    printf("LSM6DSO accelerometer & gyroscope = 0x%X\r\n", id);
-
-    while (1) {
-        printf("\r\n");
-
-        hum_temp->get_temperature(&value1);
-        hum_temp->get_humidity(&value2);
-        printf("HTS221: [temp] %7s C,   [hum] %s%%\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
-
-        press_temp->get_temperature(&value1);
-        press_temp->get_pressure(&value2);
-        printf("LPS22HH: [temp] %7s C, [press] %s mbar\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
-
-        temp->get_temperature(&value1);
-        printf("STTS751: [temp] %7s C\r\n", print_double(buffer1, value1));
-
-        printf("---\r\n");
-
-        magnetometer->get_m_axes(axes);
-        printf("LIS2MDL [mag/mgauss]:  %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        accelerometer->get_x_axes(axes);
-        printf("LIS2DW12 [acc/mg]:  %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        acc_gyro->get_x_axes(axes);
-        printf("LSM6DSO [acc/mg]:      %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        acc_gyro->get_g_axes(axes);
-        printf("LSM6DSO [gyro/mdps]:   %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        ThisThread::sleep_for(1500);
+    // Initialise the digital pin LED1 as an output
+    MYPIO_0.output();   MYPIO_0 = 0;
+    MYPIO_1.output();   MYPIO_1 = 0;
+    MYPIO_2.output();   MYPIO_2 = 0;
+    MYPIO_3.output();   MYPIO_3 = 0;
+    MYPIO_4.output();   MYPIO_4 = 0;
+    LED_FAB = 1;
+    while (true) {
+        //led = !led;
+        /*
+        while(pc.readable())
+        {
+            pc.read(inChar,1);
+            if(inChar[0] == '\n')
+            {
+                execute_com1_cmd();
+                sprintf(inBuffer,"");
+            }
+            else{
+                sprintf(inBuffer,"%s%c",inBuffer,inChar[0]);
+            }
+            //pc.write(inBuffer,strlen(inBuffer));
+        }
+        */
+        thread_sleep_for(1000);
+        LED_FAB = !LED_FAB;
+        GREEN_LED =!GREEN_LED;
     }
 }