- A fork of Damien's program.
Dependencies: WebSocketClient WiflyInterface mbed messages
Fork of BatteryModelTester by
source/globals.cpp
- Committer:
- fmferrari
- Date:
- 2016-11-29
- Revision:
- 11:ce00133ab2f4
- Parent:
- 10:e8b66718a103
File content as of revision 11:ce00133ab2f4:
/** * @author Damien Frost * * @section LICENSE * * Copyright (c) 2016 Damien Frost * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * @file "globals.cpp" * * @section DESCRIPTION * Global definitions for the IoT example program. * */ #include "mbed.h" #include "globals.h" #include "pwm.h" #define DEBUG #define INFOMESSAGES #define WARNMESSAGES #define ERRMESSAGES #define FUNCNAME "GBL" #include "messages.h" // Hardware declarations: Serial pc(USBTX, USBRX); InterruptIn UIBut1(USER_BUTTON); Timer DisplayTimer; DigitalOut Led(D5); // Global variable declarations: int ReconnectAttempts = 0; int SendCounter = 0; extern int IoT_ID = 0; float TempSensor = 0.0f; float VoltageMeasurement = 0.0f; float CurrentMeasurement = 0.0f; float SocOutput = 0.0f; float PwmPeriod_us = 20.0f; float Duty_us = 10.0f; char* wifissid = "SC"; char* wifipassword = "smartcellshield"; DigitalOut db(PC_10); AnalogIn VoltageSensor(VOLTAGE_SENSOR_PIN); AnalogIn CurrentSensor(CURRENT_SENSOR_PIN); // Wifily interface declaration: WiflyInterface eth(D8, D2, D6, LED1, wifissid, wifipassword, WPA2); // WebSocket declaration: Websocket ws; int SetupNetwork(int Tries){ // Initialize the interface. // If no param is passed to init() then DHCP will be used on connect() int s = eth.init(); int attempts = 1; wait(1); if (s != NULL) { ERR("Could not initialise. Halting!"); exit(0); } INFO("Connecting to: %s", wifissid); DBG("Getting IP address..."); while (1) { // Connect to network: s = eth.connect(); // If connection fails, retry for 5 attempts: if (s == false || s < 0) { INFO("Could not connect to network. Retrying!"); attempts++; wait(1); } else { break; } if(attempts > Tries){ ERR("Network connection failed after %d attempts", Tries); return 0; } } INFO("Connected to: %s", wifissid); INFO("Got IP address: %s", eth.getIPAddress()); IotStatus.SetFlag(SF_WIRELESSCONNECTED); return 1; } void SendNetworkData(void){ char msg_buffer[CHARMSGBUFF]; int intresult; if(IotStatus.CheckFlag(SF_SERVERCONNECTED)){ sprintf(msg_buffer, "%d,%d,%.5f,%.5f,%.5f,%.5f,%.5f", IoT_ID, SendCounter,TempSensor, VoltageMeasurement, CurrentMeasurement, PwmPeriod_us, SocOutput); INFO("Sending: %s", msg_buffer); // When this line is commented out, the mbed never tries to reconnect to the server after one try. SUPER. Keeping this here also uses precious CPU time intresult = ws.send(msg_buffer); }else{ intresult = -1; } DBG("intresult: %d", intresult); if(intresult < 0){ // Clear a status flag: IotStatus.ClearFlag(SF_SERVERCONNECTED); // Check to see if the wireless is still connected: DBG("Checking network status..."); if(eth.checkNetworkStatus() != 3){ IotStatus.ClearFlag(SF_WIRELESSCONNECTED); // Connect to the wireless network: if(IotStatus.CheckFlag(SF_AUTOCONNECT)){ INFO("Reconnecting to Network..."); if(SetupNetwork(1)>0){ IotStatus.SetFlag(SF_WIRELESSCONNECTED); INFO("Connected to Network."); }else{ WARN("Could not re-connect to the wireless network."); } } }else{ DBG("Network connected."); } if(IotStatus.CheckFlag(SF_AUTOCONNECT) && IotStatus.CheckFlag(SF_WIRELESSCONNECTED)){ // Server connection was closed, try to reconnect: INFO("Reconnecting to Websocket Server on ws://%s:%d/ws...", SERVER_IP, WS_PORT); if(!ws.connect()){ WARN("Could not connect to the server again..."); IotStatus.ClearFlag(SF_SERVERCONNECTED); ReconnectAttempts++; if(ReconnectAttempts > 4){ INFO("Failed after %d reconnect attempts. Resetting the Wifi Shield...", ReconnectAttempts); SetupNetwork(1); ReconnectAttempts = 0; } }else{ INFO("Connected to ws://%s:%d/ws", SERVER_IP, WS_PORT); // Set a status flag: IotStatus.SetFlag(SF_SERVERCONNECTED); } } } return; } void ReceiveNetworkData(unsigned int * wifi_cmd, float * value){ char msg_buffer[CHARMSGBUFF]; char msg_buffer2[CHARMSGBUFF]; int resp; if(IotStatus.CheckFlag(SF_SERVERCONNECTED)){ // Check for data on the websocket: resp = ws.readmsg(msg_buffer); if(resp == 1){ INFO("Received: %s", msg_buffer); sscanf(msg_buffer, "%d,%s", wifi_cmd, msg_buffer2); if(*wifi_cmd == CV_LED_WIFI_CMD){ // Get one more value: sscanf(msg_buffer2, "%f", value); } if(*wifi_cmd == CV_PWM_PERIOD_US_CMD){ // Get one more value: sscanf(msg_buffer2, "%f", value); } }else if(resp == -1){ // Connection to the server is lost: IotStatus.ClearFlag(SF_SERVERCONNECTED); }else{ //DBG("Did not receive anything :(\n\r"); *wifi_cmd = NO_WIFI_CMD; *value = 0.0f; } } return; } void ModifyVariable(unsigned int wifi_var, float wifi_data){ // modifies something in the SCS Controller: switch(wifi_var){ case CV_LED_WIFI_CMD: if(wifi_data > 0){ Led = 1; }else{ Led = 0; } break; case CV_PWM_PERIOD_US_CMD: DBG("wifi_data: %.3f", wifi_data); PwmPeriod_us = wifi_data; SetPWMPeriodAndDuty_us(PwmPeriod_us); break; default: break; } return; }