Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

Committer:
jmarkel44
Date:
Tue Jan 24 19:05:33 2017 +0000
Revision:
0:61364762ee0e
Port from IAR to Nucleo-F412 board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 0:61364762ee0e 1 #include "global.h"
jmarkel44 0:61364762ee0e 2 #include <stdio.h>
jmarkel44 0:61364762ee0e 3 #include <sstream>
jmarkel44 0:61364762ee0e 4 #include <iostream>
jmarkel44 0:61364762ee0e 5 #include <time.h>
jmarkel44 0:61364762ee0e 6 #include "LogHandler.h"
jmarkel44 0:61364762ee0e 7 #include "LogLocalApi.h"
jmarkel44 0:61364762ee0e 8 #include "LoggerApi.h"
jmarkel44 0:61364762ee0e 9 #ifdef MDOT_ICE
jmarkel44 0:61364762ee0e 10 #include "BLEDataHandler.h"
jmarkel44 0:61364762ee0e 11 #include "MTSLog.h"
jmarkel44 0:61364762ee0e 12 #include "CloudFileReceiver.h"
jmarkel44 0:61364762ee0e 13 #include "CloudDataHandler.h"
jmarkel44 0:61364762ee0e 14 #endif
jmarkel44 0:61364762ee0e 15
jmarkel44 0:61364762ee0e 16 #ifndef MDOT_ICE
jmarkel44 0:61364762ee0e 17 #include "DataHandler.h"
jmarkel44 0:61364762ee0e 18 #endif
jmarkel44 0:61364762ee0e 19 #include "utilities.h"
jmarkel44 0:61364762ee0e 20 #include "version.h"
jmarkel44 0:61364762ee0e 21
jmarkel44 0:61364762ee0e 22 Mail<LoggerQueue_t, 16> LoggerQueue;
jmarkel44 0:61364762ee0e 23
jmarkel44 0:61364762ee0e 24 size_t LoggerXmitLength = LOG_BYTES_PER_ENTRY;
jmarkel44 0:61364762ee0e 25
jmarkel44 0:61364762ee0e 26 int last_min=8;
jmarkel44 0:61364762ee0e 27
jmarkel44 0:61364762ee0e 28
jmarkel44 0:61364762ee0e 29 static void constructHeartBeat(std::string &msg);
jmarkel44 0:61364762ee0e 30
jmarkel44 0:61364762ee0e 31 //
jmarkel44 0:61364762ee0e 32 // function: LogHandler
jmarkel44 0:61364762ee0e 33 // description:
jmarkel44 0:61364762ee0e 34 //
jmarkel44 0:61364762ee0e 35 // @param[in] joined
jmarkel44 0:61364762ee0e 36 // @param[out] none
jmarkel44 0:61364762ee0e 37 // @return
jmarkel44 0:61364762ee0e 38 //
jmarkel44 0:61364762ee0e 39 bool LogHandler( bool joined )
jmarkel44 0:61364762ee0e 40 {
jmarkel44 0:61364762ee0e 41 int32_t ret;
jmarkel44 0:61364762ee0e 42 char buffer[LOG_BYTES_PER_ENTRY];
jmarkel44 0:61364762ee0e 43 std::string tmp_buffer;
jmarkel44 0:61364762ee0e 44 bool log_in_eeprom=false;
jmarkel44 0:61364762ee0e 45 bool log_to_send=false;
jmarkel44 0:61364762ee0e 46
jmarkel44 0:61364762ee0e 47 #ifdef MDOT_ICE
jmarkel44 0:61364762ee0e 48 osEvent evt = LoggerQueue.get(50);
jmarkel44 0:61364762ee0e 49 if( (evt.status == osEventMail) ) {
jmarkel44 0:61364762ee0e 50 // pull the log event from the queue, even if we are not joined
jmarkel44 0:61364762ee0e 51 LoggerQueue_t *LoggerEvent = (LoggerQueue_t*)evt.value.p;
jmarkel44 0:61364762ee0e 52 logInfo("Log Msg Received: log entry: %s", LoggerEvent->log_entry);
jmarkel44 0:61364762ee0e 53 strncpy( buffer, LoggerEvent->log_entry, (LoggerXmitLength-1) );
jmarkel44 0:61364762ee0e 54 tmp_buffer.assign(buffer);
jmarkel44 0:61364762ee0e 55 log_to_send = true;
jmarkel44 0:61364762ee0e 56 // printf("%s:%d: Found Log Event on LoggerQueue to send to cloud\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 57 LoggerQueue.free(LoggerEvent);
jmarkel44 0:61364762ee0e 58 }
jmarkel44 0:61364762ee0e 59
jmarkel44 0:61364762ee0e 60 if( (evt.status == osEventMail) && (joined == false) ) {
jmarkel44 0:61364762ee0e 61 // if we pulled a log from the queue put it in the EEPROM
jmarkel44 0:61364762ee0e 62 LogLocalApi( tmp_buffer.c_str() );
jmarkel44 0:61364762ee0e 63 // printf("%s:%d: Not Connected, Putting Logger event In EEPROM\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 64 return false;
jmarkel44 0:61364762ee0e 65 }
jmarkel44 0:61364762ee0e 66
jmarkel44 0:61364762ee0e 67 if( (evt.status != osEventMail) && joined == true) {
jmarkel44 0:61364762ee0e 68 // nothing on the queue, see if there is anything in the EEPROM to send.
jmarkel44 0:61364762ee0e 69 log_in_eeprom = LogLocalApi_PopEntry( buffer );
jmarkel44 0:61364762ee0e 70 if( log_in_eeprom == true ) {
jmarkel44 0:61364762ee0e 71 tmp_buffer.assign(buffer);
jmarkel44 0:61364762ee0e 72 log_to_send = true;
jmarkel44 0:61364762ee0e 73 // printf("%s:%d: Found Log Event in EEPROM to send to cloud\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 74 } else {
jmarkel44 0:61364762ee0e 75 // printf("%s:%d: Nothing in EEPROM\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 76 }
jmarkel44 0:61364762ee0e 77 }
jmarkel44 0:61364762ee0e 78
jmarkel44 0:61364762ee0e 79 if( log_to_send == false ) {
jmarkel44 0:61364762ee0e 80 struct tm *ts;
jmarkel44 0:61364762ee0e 81 time_t curr_sec;
jmarkel44 0:61364762ee0e 82
jmarkel44 0:61364762ee0e 83 curr_sec = time(0);
jmarkel44 0:61364762ee0e 84 ts = localtime(&curr_sec);
jmarkel44 0:61364762ee0e 85 // printf("curr_sec=%ld, min=%d (last=%d) min-mod-5=%d\r\n", curr_sec, ts->tm_min, last_min, (ts->tm_min%5) );
jmarkel44 0:61364762ee0e 86 if( ((ts->tm_min%1) == 0) && (ts->tm_min != last_min) ) {
jmarkel44 0:61364762ee0e 87 last_min = ts->tm_min;
jmarkel44 0:61364762ee0e 88 // no event log to send, send the heart beat message.
jmarkel44 0:61364762ee0e 89 logInfo("\r%s:%d: sending heart beat, hr=%d min=%d\r\n", __func__, __LINE__, ts->tm_hour, ts->tm_min);
jmarkel44 0:61364762ee0e 90 constructHeartBeat(tmp_buffer);
jmarkel44 0:61364762ee0e 91 logInfo("\r%s (%d bytes)\n", tmp_buffer.c_str(), tmp_buffer.size());
jmarkel44 0:61364762ee0e 92 } else {
jmarkel44 0:61364762ee0e 93 // printf("%s:%d: Nothing to send to the cloud\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 94 if( CloudDataHandler_RcvFile != true ) {
jmarkel44 0:61364762ee0e 95 return false;
jmarkel44 0:61364762ee0e 96 }
jmarkel44 0:61364762ee0e 97 printf("%s:%d: currently receiveing a file\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 98 // send so we get another packet from gateway.
jmarkel44 0:61364762ee0e 99 tmp_buffer = "{\"mtype\":\"20\"}";
jmarkel44 0:61364762ee0e 100 }
jmarkel44 0:61364762ee0e 101 }
jmarkel44 0:61364762ee0e 102
jmarkel44 0:61364762ee0e 103 if( joined == true ) {
jmarkel44 0:61364762ee0e 104 std::vector<uint8_t> data(tmp_buffer.begin(), tmp_buffer.end());
jmarkel44 0:61364762ee0e 105 ret = GLOBAL_mdot->send(data);
jmarkel44 0:61364762ee0e 106 if ( ret == mDot::MDOT_OK ) {
jmarkel44 0:61364762ee0e 107 //if ((ret = GLOBAL_mdot->send(data)) == mDot::MDOT_OK) {
jmarkel44 0:61364762ee0e 108 // printf("%s:%d: Successful send to cloud\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 109 return true;
jmarkel44 0:61364762ee0e 110 }
jmarkel44 0:61364762ee0e 111 // printf("failed to send, ret=%d, %s\r\n", ret, mDot::getReturnCodeString(ret).c_str());
jmarkel44 0:61364762ee0e 112 }
jmarkel44 0:61364762ee0e 113
jmarkel44 0:61364762ee0e 114 if( log_to_send == true ) {
jmarkel44 0:61364762ee0e 115 // We had a log event ready to send but didn't send it.
jmarkel44 0:61364762ee0e 116 // Store it in the EEPROM for the next attempt.
jmarkel44 0:61364762ee0e 117 // printf("%s:%d: Could not send Log Event to cloud, store in EEPROM\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 118 LogLocalApi( tmp_buffer.c_str() );
jmarkel44 0:61364762ee0e 119 } else {
jmarkel44 0:61364762ee0e 120 // printf("%s:%d: Could not send to cloud, nothing to store in EEPROM\r\n", __func__, __LINE__);
jmarkel44 0:61364762ee0e 121 }
jmarkel44 0:61364762ee0e 122 #endif
jmarkel44 0:61364762ee0e 123 return false;
jmarkel44 0:61364762ee0e 124 }
jmarkel44 0:61364762ee0e 125
jmarkel44 0:61364762ee0e 126 //
jmarkel44 0:61364762ee0e 127 // function: CDH_ReplyToHandler
jmarkel44 0:61364762ee0e 128 // description:
jmarkel44 0:61364762ee0e 129 //
jmarkel44 0:61364762ee0e 130 // @param[in]
jmarkel44 0:61364762ee0e 131 // @param[out]
jmarkel44 0:61364762ee0e 132 // @return
jmarkel44 0:61364762ee0e 133 //
jmarkel44 0:61364762ee0e 134 void CDH_ReplyToHandler( std::string &id, int status, float value )
jmarkel44 0:61364762ee0e 135 {
jmarkel44 0:61364762ee0e 136 std::ostringstream reply_oss;
jmarkel44 0:61364762ee0e 137
jmarkel44 0:61364762ee0e 138 LoggerQueue_t *LoggerEvent = LoggerQueue.alloc();
jmarkel44 0:61364762ee0e 139 memset( LoggerEvent->log_entry, 0, sizeof(LoggerEvent->log_entry) );
jmarkel44 0:61364762ee0e 140
jmarkel44 0:61364762ee0e 141 reply_oss << "{ \"mtype\":" << BT_MODBUS_COMMAND_REPLY_MTYPE << ", \"mbreply\":{ \"id\":\"" << id.c_str() << "\"," "\"status\":\"" << status << "\"," "\"value\":\"" << value << "\"} }";
jmarkel44 0:61364762ee0e 142 std::string string_reply = reply_oss.str();
jmarkel44 0:61364762ee0e 143 strncpy( LoggerEvent->log_entry, string_reply.c_str(), (sizeof(LoggerEvent->log_entry)-1));
jmarkel44 0:61364762ee0e 144 printf("%s:%d: Reply is: %s\r\n",__func__,__LINE__, LoggerEvent->log_entry);
jmarkel44 0:61364762ee0e 145 LoggerEvent->position = 0;
jmarkel44 0:61364762ee0e 146 LoggerQueue.put(LoggerEvent);
jmarkel44 0:61364762ee0e 147 }
jmarkel44 0:61364762ee0e 148
jmarkel44 0:61364762ee0e 149 //
jmarkel44 0:61364762ee0e 150 // function: ReplyToHandler
jmarkel44 0:61364762ee0e 151 // description:
jmarkel44 0:61364762ee0e 152 //
jmarkel44 0:61364762ee0e 153 // @param[in]
jmarkel44 0:61364762ee0e 154 // @param[out]
jmarkel44 0:61364762ee0e 155 // @return
jmarkel44 0:61364762ee0e 156 //
jmarkel44 0:61364762ee0e 157 void ReplyToHandler( ThreadName_t replyTo, std::string &id, int ret, float value )
jmarkel44 0:61364762ee0e 158 {
jmarkel44 0:61364762ee0e 159 #ifdef MDOT_ICE
jmarkel44 0:61364762ee0e 160 if( replyTo == BLE_HANDLER ) {
jmarkel44 0:61364762ee0e 161 BLE_ReplyToHandler( id, ret, value );
jmarkel44 0:61364762ee0e 162 } else if( replyTo == CLOUD_DATA_HANDLER ) {
jmarkel44 0:61364762ee0e 163 CDH_ReplyToHandler( id, ret, value );
jmarkel44 0:61364762ee0e 164 } else {
jmarkel44 0:61364762ee0e 165 logError("Unknown Thread for Command Reply");
jmarkel44 0:61364762ee0e 166 }
jmarkel44 0:61364762ee0e 167 #else
jmarkel44 0:61364762ee0e 168 #undef TODO_ICE
jmarkel44 0:61364762ee0e 169 // do something
jmarkel44 0:61364762ee0e 170 #endif
jmarkel44 0:61364762ee0e 171 }
jmarkel44 0:61364762ee0e 172
jmarkel44 0:61364762ee0e 173 //
jmarkel44 0:61364762ee0e 174 // function: constructHeartBeat()
jmarkel44 0:61364762ee0e 175 // description: construct the periodic heartbeat message
jmarkel44 0:61364762ee0e 176 //
jmarkel44 0:61364762ee0e 177 // @param[out] constructed message
jmarkel44 0:61364762ee0e 178 // @return none
jmarkel44 0:61364762ee0e 179 //
jmarkel44 0:61364762ee0e 180 static void constructHeartBeat(std::string &msg)
jmarkel44 0:61364762ee0e 181 {
jmarkel44 0:61364762ee0e 182 //std::ostringstream heartbeat_msg(200);
jmarkel44 0:61364762ee0e 183 std::ostringstream heartbeat_msg;
jmarkel44 0:61364762ee0e 184 heartbeat_msg.precision(2);
jmarkel44 0:61364762ee0e 185
jmarkel44 0:61364762ee0e 186 std::string heap_data = Util_getHeapData();
jmarkel44 0:61364762ee0e 187 // let's strip off everything after 'bytes'
jmarkel44 0:61364762ee0e 188 std::string::size_type i = heap_data.find("bytes");
jmarkel44 0:61364762ee0e 189 if (i != std::string::npos)
jmarkel44 0:61364762ee0e 190 heap_data.erase(i+strlen("bytes"), heap_data.length());
jmarkel44 0:61364762ee0e 191
jmarkel44 0:61364762ee0e 192
jmarkel44 0:61364762ee0e 193 heartbeat_msg << "{ \"mtype\":" << HEARTBEAT_MSG_MTYPE <<
jmarkel44 0:61364762ee0e 194 ", \"hb\": {"
jmarkel44 0:61364762ee0e 195 "\"fwver\": \"" << MAJOR_VERSION_NUMBER << "." << MINOR_VERSION_NUMBER << "." << PATCH_VERSION_NUMBER << "\","
jmarkel44 0:61364762ee0e 196 "\"heap\":\"" << heap_data << "\","
jmarkel44 0:61364762ee0e 197 "\"AL\":\"" << (((double)GLOBAL_analyticsLogger_thread->max_stack()/(double)GLOBAL_analyticsLogger_thread->stack_size())*100.) << "%\","
jmarkel44 0:61364762ee0e 198 "\"DH\":\"" << (((double)GLOBAL_dataHandler_thread->max_stack()/(double)GLOBAL_dataHandler_thread->stack_size())*100.) << "%\","
jmarkel44 0:61364762ee0e 199 "\"CFG\":\"" << (((double)GLOBAL_configHandler_thread->max_stack()/(double)GLOBAL_configHandler_thread->stack_size())*100.) << "%\","
jmarkel44 0:61364762ee0e 200 "\"CT\":\"" << (((double)GLOBAL_controlTask_thread->max_stack()/(double)GLOBAL_controlTask_thread->stack_size())*100.) << "%\","
jmarkel44 0:61364762ee0e 201 "\"MM\":\"" << (((double)GLOBAL_modbusMaster_thread->max_stack()/(double)GLOBAL_modbusMaster_thread->stack_size())*100.) << "%\","
jmarkel44 0:61364762ee0e 202 "\"OUT\":\"" << (((double)GLOBAL_outputTask_thread->max_stack()/(double)GLOBAL_outputTask_thread->stack_size())*100.) << "%\","
jmarkel44 0:61364762ee0e 203 "\"boot\":\"" << Util_getLastBootTime() << "\" "
jmarkel44 0:61364762ee0e 204 "} }";
jmarkel44 0:61364762ee0e 205 msg = heartbeat_msg.str();
jmarkel44 0:61364762ee0e 206 }