Los Putacos / Mbed OS WearableDevice_Nucleo_New

Dependencies:   MPU9250_SPI

Fork of WearableDevice_Nucleo by Los Putacos

Committer:
Muglug
Date:
Fri Feb 16 18:30:19 2018 +0000
Revision:
29:ab809198c1ba
Parent:
28:c7e977a19564
Final Version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gusteibolt 1:a6dc717fb060 1 /*
gusteibolt 1:a6dc717fb060 2 * Los Putacos
gusteibolt 1:a6dc717fb060 3 * Copyright (C) 2017, All rights reserved.
Muglug 18:7f9c2b8541e1 4 * ________________________________________
gusteibolt 1:a6dc717fb060 5 *
gusteibolt 1:a6dc717fb060 6 * Created by: Gustavo Campana, Michael Schmidt, Miguel Lopez
Muglug 28:c7e977a19564 7 * Date: 02-Dec-2017
gusteibolt 1:a6dc717fb060 8 * Version: V0.1
gusteibolt 1:a6dc717fb060 9 */
Muglug 23:aad5fd1b3ef9 10 //-----------------------------------------------------------------
gusteibolt 1:a6dc717fb060 11
gusteibolt 1:a6dc717fb060 12 //-----------------------------------------------------------------
Muglug 28:c7e977a19564 13 // "THE BEER-WARE LICENSE" (Revision 42):
Muglug 28:c7e977a19564 14 // The "Los Putacos" team wrote this file. As long as you retain this notice you
Muglug 28:c7e977a19564 15 // can do whatever you want with this stuff. If we meet some day, and you think
Muglug 28:c7e977a19564 16 // this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp
gusteibolt 1:a6dc717fb060 17 //-----------------------------------------------------------------
gusteibolt 1:a6dc717fb060 18
gusteibolt 1:a6dc717fb060 19 //-----------------------------------------------------------------
gusteibolt 1:a6dc717fb060 20 // Includes
Muglug 25:86137c182a17 21 #include "mbed.h"
Muglug 28:c7e977a19564 22 #include "event.h"
Muglug 28:c7e977a19564 23 #include "MPU9250.h"
Muglug 28:c7e977a19564 24 #include "TCPSocket.h"
Muglug 23:aad5fd1b3ef9 25 #include "configuration.h"
Muglug 28:c7e977a19564 26 #include "ESP8266Interface.h"
gusteibolt 3:26aeff25f610 27
gusteibolt 1:a6dc717fb060 28 //-----------------------------------------------------------------
gusteibolt 0:73cd0cb02330 29
gusteibolt 1:a6dc717fb060 30 //-----------------------------------------------------------------
Muglug 29:ab809198c1ba 31 // General Declarations
Muglug 29:ab809198c1ba 32 Timer TimeStamp; // Timer µS time-stamp
Muglug 29:ab809198c1ba 33 Serial PC(USBTX, USBRX); // Create an Serial PC Object - USBTX, USBRX
Muglug 28:c7e977a19564 34
Muglug 29:ab809198c1ba 35 // IMU-SPI Declaration
Muglug 29:ab809198c1ba 36 SPI spi(IMU_MOSI, IMU_MISO,IMU_SCK); // Create an SPI Object for MPU9250 - MOSI, MISO, SCK
Muglug 28:c7e977a19564 37 mpu9250_spi imu(spi, IMU_CS); // Create an MPU9250 Object - SPI Object, CS
Muglug 28:c7e977a19564 38
Muglug 29:ab809198c1ba 39 // WiFi & TCP Socket Declaration
Muglug 28:c7e977a19564 40 ESP8266Interface WiFi(ESP_TX, ESP_RX); // ESP8266 WiFi Interface
Muglug 28:c7e977a19564 41 TCPSocket Socket_TCP; // TCP Socket
Muglug 29:ab809198c1ba 42 nsapi_error_t response; // TCP Socket Response
Muglug 25:86137c182a17 43
Muglug 29:ab809198c1ba 44 // EventQueue Declarations
Muglug 25:86137c182a17 45 EventQueue queue(32 * EVENTS_EVENT_SIZE); // Event Setup
Muglug 25:86137c182a17 46
Muglug 29:ab809198c1ba 47 // Ticker Declarations
Muglug 26:4bc56ce08d15 48 Ticker Ticker_IMU;
Muglug 29:ab809198c1ba 49 Ticker Ticker_ReadBattery;
Muglug 28:c7e977a19564 50 Ticker Ticker_ReceiveCommand;
Muglug 25:86137c182a17 51
Muglug 29:ab809198c1ba 52 // Thread Declarations
Muglug 26:4bc56ce08d15 53 Thread Thread_IMU(osPriorityRealtime);
Muglug 29:ab809198c1ba 54 Thread Thread_ReadBattery(osPriorityRealtime);
Muglug 29:ab809198c1ba 55 Thread Thread_ReceiveCommand(osPriorityRealtime);
gusteibolt 3:26aeff25f610 56
Muglug 26:4bc56ce08d15 57 // Global Variables
Muglug 29:ab809198c1ba 58 uint16_t LineCount = 0;
Muglug 29:ab809198c1ba 59 uint32_t Line_Size = 0;
Muglug 27:c4b2ce6fa5b8 60 uint32_t Data_Size = 0;
Muglug 29:ab809198c1ba 61
Muglug 29:ab809198c1ba 62 // Read & Writepointer Declarations
Muglug 29:ab809198c1ba 63 uint8_t Current_Position = 0;
Muglug 26:4bc56ce08d15 64 volatile uint16_t readPointer = 0;
Muglug 26:4bc56ce08d15 65 volatile uint16_t readPointer_MIC = 0;
Muglug 26:4bc56ce08d15 66 volatile uint16_t writePointer = 0;
Muglug 26:4bc56ce08d15 67 volatile uint16_t writePointer_MIC = 0;
Muglug 24:eed68c95160c 68
Muglug 29:ab809198c1ba 69 // Flag Declarations
Muglug 27:c4b2ce6fa5b8 70 uint8_t ReadIMUDone_Flag = 0;
Muglug 28:c7e977a19564 71 uint8_t CheckCommandDone_Flag = 0;
Muglug 27:c4b2ce6fa5b8 72
Muglug 29:ab809198c1ba 73 // Battery Voltage & Power Consumption Declaration
Muglug 29:ab809198c1ba 74 float Battery_Status = 0;
Muglug 29:ab809198c1ba 75 float Power_Consumption = 0;
Muglug 29:ab809198c1ba 76
Muglug 29:ab809198c1ba 77 // Time Buffer Declaration
Muglug 29:ab809198c1ba 78 char Time_Buffer[2];
Muglug 29:ab809198c1ba 79 uint16_t Time_Data = 0;
Muglug 26:4bc56ce08d15 80 uint8_t Requested_Time = 0;
Muglug 29:ab809198c1ba 81
Muglug 29:ab809198c1ba 82 // Data Storage Declaration
Muglug 29:ab809198c1ba 83 char Data_Buffer[1024];
Muglug 29:ab809198c1ba 84 const char DeviceNr[6] = "DEV01"; // Device specific ID
Muglug 26:4bc56ce08d15 85 int16_t Data_Storage[BufferSize]; // BufferSize defined in "event.h"
Muglug 26:4bc56ce08d15 86 uint16_t Data_Storage_MIC[BufferSize_MIC]; // BufferSize_MIC defined in "event.h"
Muglug 23:aad5fd1b3ef9 87
gusteibolt 1:a6dc717fb060 88 //-----------------------------------------------------------------
gusteibolt 1:a6dc717fb060 89
gusteibolt 1:a6dc717fb060 90 //-----------------------------------------------------------------
Muglug 18:7f9c2b8541e1 91 void Setup()
Muglug 18:7f9c2b8541e1 92 {
Muglug 29:ab809198c1ba 93 LED_Blue1 = 1; // Turn OFF all LEDs
Muglug 29:ab809198c1ba 94 LED_Blue2 = 1;
Muglug 29:ab809198c1ba 95 LED_Red1 = 1;
Muglug 29:ab809198c1ba 96 LED_Red2 = 1;
Muglug 29:ab809198c1ba 97
Muglug 26:4bc56ce08d15 98 PC.baud(230400); // Initialize PC Serial Connection
Muglug 24:eed68c95160c 99 PC.printf("\r\n------------- Booting! -------------\r\n");
Muglug 29:ab809198c1ba 100 PC.printf("CPU SystemCoreClock is %d Hz", SystemCoreClock); // Show SystemCoreClock Speed
Muglug 28:c7e977a19564 101
Muglug 28:c7e977a19564 102 PC.printf("\nConnecting to %s with %s...\n", WiFi_SSID, WiFi_Pass);
Muglug 29:ab809198c1ba 103 int ret = WiFi.connect(WiFi_SSID, WiFi_Pass, NSAPI_SECURITY_WPA_WPA2); // Connect WiFi
Muglug 29:ab809198c1ba 104
Muglug 29:ab809198c1ba 105 while (ret != 0) { // WiFi Connection Not Successful
Muglug 29:ab809198c1ba 106 PC.printf("\nConnecting to %s with %s...\n", WiFi_SSID, WiFi_Pass);
Muglug 29:ab809198c1ba 107 ret = WiFi.connect(WiFi_SSID, WiFi_Pass, NSAPI_SECURITY_WPA_WPA2);
Muglug 29:ab809198c1ba 108 wait(0.5);
Muglug 28:c7e977a19564 109 }
Muglug 28:c7e977a19564 110
Muglug 29:ab809198c1ba 111 printf("Connection Done! - IP: %s\r\n", WiFi.get_ip_address()); // Show IP Address
Muglug 29:ab809198c1ba 112 Socket_TCP.open(&WiFi); // Open TCP_Socket on WiFi
Muglug 29:ab809198c1ba 113 Socket_TCP.set_blocking(false); // Set Non-Blocking Mode
Muglug 18:7f9c2b8541e1 114
Muglug 29:ab809198c1ba 115 // Initialize IMU-SPI Connection
Muglug 26:4bc56ce08d15 116 if(imu.init(1, BITS_DLPF_CFG_188HZ)) // Initialize the MPU9250
Muglug 24:eed68c95160c 117 PC.printf("\nCouldn't initialize MPU9250 via SPI!");
Muglug 26:4bc56ce08d15 118 PC.printf("\nWHOAMI = 0x%2x", imu.whoami()); // Output I2C Address to check SPI (correct: 104 - 0x68)
Muglug 25:86137c182a17 119 PC.printf("\nAcc_Scale = %u\n", imu.set_acc_scale(BITS_FS_16G)); // Set Full Range for Acc.
Muglug 26:4bc56ce08d15 120 imu.calib_acc(); // Calibrate Acceleration Sensor
Muglug 24:eed68c95160c 121
Muglug 29:ab809198c1ba 122 ReadBattery(); // Read Battery Level
Muglug 29:ab809198c1ba 123 TimeStamp.reset(); // Reset Timer TimeStamp
Muglug 28:c7e977a19564 124 Thread_ReceiveCommand.start(callback(&queue, &EventQueue::dispatch_forever)); // Start Command-Receiving Thread
Muglug 29:ab809198c1ba 125 Ticker_ReceiveCommand.attach(queue.event(&ReceiveCommand), 0.500); // Attach 500ms Ticker to "ReceiveCommand"
Muglug 28:c7e977a19564 126
Muglug 29:ab809198c1ba 127 Thread_ReadBattery.start(callback(&queue, &EventQueue::dispatch_forever)); // Start Battery-Reading Thread
Muglug 29:ab809198c1ba 128 Ticker_ReadBattery.attach(queue.event(&ReadBattery), 30); // Attach 30s Ticker to "ReadBattery"
Muglug 29:ab809198c1ba 129
Muglug 29:ab809198c1ba 130 Buzzer = 0; // Disable Buzzer
Muglug 29:ab809198c1ba 131 Buzzer.period(0.001); // 1kHz Buzzer Frequency
Muglug 29:ab809198c1ba 132
Muglug 29:ab809198c1ba 133 LED_Blue1 = 0; // Turn ON LED to display 'Booting Done!'
Muglug 26:4bc56ce08d15 134 PC.printf("\r\n------------- Ready! ---------------\r\n");
Muglug 28:c7e977a19564 135 }
Muglug 24:eed68c95160c 136
Muglug 23:aad5fd1b3ef9 137 //-----------------------------------------------------------------
Muglug 18:7f9c2b8541e1 138
Mister_Lopez 4:56e903769e94 139 //-----------------------------------------------------------------
Muglug 27:c4b2ce6fa5b8 140 void Reset() // Reset All Variables
Muglug 27:c4b2ce6fa5b8 141 {
Muglug 29:ab809198c1ba 142 Line_Size = 0;
Muglug 29:ab809198c1ba 143 Data_Size = 0;
Muglug 29:ab809198c1ba 144 LineCount = 0;
Muglug 29:ab809198c1ba 145 Time_Data = 0;
Muglug 29:ab809198c1ba 146 Requested_Time = 0;
Muglug 29:ab809198c1ba 147 Current_Position = 0;
Muglug 27:c4b2ce6fa5b8 148
Muglug 29:ab809198c1ba 149 readPointer = 0;
Muglug 29:ab809198c1ba 150 readPointer_MIC = 0;
Muglug 29:ab809198c1ba 151 writePointer = 0;
Muglug 29:ab809198c1ba 152 writePointer_MIC = 0;
Muglug 29:ab809198c1ba 153
Muglug 29:ab809198c1ba 154 ReadIMUDone_Flag = 0;
Muglug 29:ab809198c1ba 155 CheckCommandDone_Flag = 0;
Muglug 27:c4b2ce6fa5b8 156
Muglug 27:c4b2ce6fa5b8 157 memset(Data_Storage, 0, sizeof(Data_Storage));
Muglug 27:c4b2ce6fa5b8 158 memset(Data_Storage_MIC, 0, sizeof(Data_Storage_MIC));
Muglug 27:c4b2ce6fa5b8 159 }
Muglug 28:c7e977a19564 160
Muglug 27:c4b2ce6fa5b8 161 //-----------------------------------------------------------------
Muglug 27:c4b2ce6fa5b8 162
Muglug 27:c4b2ce6fa5b8 163 //-----------------------------------------------------------------
gusteibolt 0:73cd0cb02330 164 int main()
gusteibolt 0:73cd0cb02330 165 {
Muglug 18:7f9c2b8541e1 166 Setup(); // Initial Setups
Muglug 18:7f9c2b8541e1 167
Muglug 26:4bc56ce08d15 168 while (true) {
Muglug 29:ab809198c1ba 169 if ((Requested_Time != 0) && (CheckCommandDone_Flag == 1)) { // Check Flag & Requested Time
Muglug 29:ab809198c1ba 170 CheckCommandDone_Flag = 0; // Reset Flag
Muglug 29:ab809198c1ba 171 memset(Data_Buffer, 0, sizeof(Data_Buffer)); // Clear Data_Buffer
Muglug 27:c4b2ce6fa5b8 172
Muglug 29:ab809198c1ba 173 TimeStamp.start(); // Start Timer TimeStamp
Muglug 29:ab809198c1ba 174 Thread_IMU.start(callback(&queue, &EventQueue::dispatch_forever)); // Start "ReadIMU" Thread
Muglug 29:ab809198c1ba 175 Ticker_IMU.attach_us(queue.event(&ReadIMU), 2000); // Attach 2ms Ticker to "ReadIMU"
Muglug 26:4bc56ce08d15 176 }
Muglug 26:4bc56ce08d15 177
Muglug 29:ab809198c1ba 178 while ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC) && (ReadIMUDone_Flag == 1)) { // Check Flag & Pointer Position
Muglug 29:ab809198c1ba 179 while ((Data_Size + Line_Size) < 1024) { // Check Maximum Package Size
Muglug 28:c7e977a19564 180 if ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC)) {
Muglug 28:c7e977a19564 181 Data_Size += sprintf(&Data_Buffer[Data_Size], "%d;%d;%d;%d;%d\n", Data_Storage[readPointer++], Data_Storage_MIC[readPointer_MIC++], Data_Storage[readPointer++], Data_Storage[readPointer++], Data_Storage[readPointer++]);
Muglug 29:ab809198c1ba 182 Line_Size = snprintf(NULL, 0, "%d;%d;%d;%d;%d\n", Data_Storage[readPointer], Data_Storage_MIC[readPointer_MIC], Data_Storage[readPointer], Data_Storage[readPointer], Data_Storage[readPointer]);
Muglug 28:c7e977a19564 183 } else
Muglug 28:c7e977a19564 184 break;
Muglug 28:c7e977a19564 185 }
Muglug 28:c7e977a19564 186
Muglug 29:ab809198c1ba 187 response = Socket_TCP.send(Data_Buffer, Data_Size); // Send Data via TCP_Socket
Muglug 29:ab809198c1ba 188 while (response != Data_Size) // Sending Not Successful
Muglug 29:ab809198c1ba 189 response = Socket_TCP.send(Data_Buffer, Data_Size); // Resend Data via TCP_Socket
Muglug 29:ab809198c1ba 190
Muglug 29:ab809198c1ba 191 Data_Size = 0; // Reset Data_Size
Muglug 29:ab809198c1ba 192 memset(Data_Buffer, 0, sizeof(Data_Buffer)); // Clear Data_Buffer
Muglug 29:ab809198c1ba 193 wait(0.1); // Wait 100ms between Packages for ESP8266 Module
Muglug 25:86137c182a17 194
Muglug 29:ab809198c1ba 195 if ((readPointer == writePointer) && (writePointer_MIC == readPointer_MIC)) { // Check if Readpointer reached Writepointer Position
Muglug 29:ab809198c1ba 196 ReadIMUDone_Flag = 0; // Reset Flag for Sending
Muglug 29:ab809198c1ba 197 PC.printf("Sending Done! - Time Taken: %d ms\n\n", TimeStamp.read_ms()); // Show Time used for Data Sending
Muglug 29:ab809198c1ba 198 TimeStamp.stop(); // Stop Timer TimeStamp
Muglug 29:ab809198c1ba 199 TimeStamp.reset(); // Reset Timer TimeStamp
Muglug 26:4bc56ce08d15 200
Muglug 29:ab809198c1ba 201 Reset(); // Reset All Variables
Muglug 29:ab809198c1ba 202 Thread_ReceiveCommand.start(callback(&queue, &EventQueue::dispatch_forever)); // Start "ReceiveCommand" Thread
Muglug 29:ab809198c1ba 203 Ticker_ReceiveCommand.attach(queue.event(&ReceiveCommand), 0.500); // Attach 500ms Ticker to "ReceiveCommand"
Muglug 28:c7e977a19564 204
Muglug 29:ab809198c1ba 205 Thread_ReadBattery.start(callback(&queue, &EventQueue::dispatch_forever)); // Start "ReadBattery"
Muglug 29:ab809198c1ba 206 Ticker_ReadBattery.attach(queue.event(&ReadBattery), 30); // Attach 30s Ticker to "ReadBattery"
Muglug 28:c7e977a19564 207 }
Muglug 26:4bc56ce08d15 208 }
Muglug 19:0a3ae902722e 209 }
gusteibolt 0:73cd0cb02330 210 }
Muglug 28:c7e977a19564 211
Muglug 28:c7e977a19564 212 //-----------------------------------------------------------------
Muglug 28:c7e977a19564 213
Muglug 18:7f9c2b8541e1 214 //-----------------------------------------------------------------