Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ICE-Application/src/DataHandler/LogHandler.cpp@0:61364762ee0e, 2017-01-24 (annotated)
- 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?
User | Revision | Line number | New 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 | } |