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 /******************************************************************************
jmarkel44 0:61364762ee0e 2 *
jmarkel44 0:61364762ee0e 3 * File: AnalyticsLogger.cpp
jmarkel44 0:61364762ee0e 4 * Desciption: source for the ICE Analytics Logger
jmarkel44 0:61364762ee0e 5 *
jmarkel44 0:61364762ee0e 6 *****************************************************************************/
jmarkel44 0:61364762ee0e 7 #include "global.h"
jmarkel44 0:61364762ee0e 8 #include <stdio.h>
jmarkel44 0:61364762ee0e 9 #include <string>
jmarkel44 0:61364762ee0e 10 #include <sstream>
jmarkel44 0:61364762ee0e 11 #include <iostream>
jmarkel44 0:61364762ee0e 12 #include <vector>
jmarkel44 0:61364762ee0e 13 #include <time.h>
jmarkel44 0:61364762ee0e 14 #include "AnalyticsLogger.h"
jmarkel44 0:61364762ee0e 15 #include "LoggerApi.h"
jmarkel44 0:61364762ee0e 16 //#include "rtc.h"
jmarkel44 0:61364762ee0e 17
jmarkel44 0:61364762ee0e 18 static void checkStackUsage(void);
jmarkel44 0:61364762ee0e 19
jmarkel44 0:61364762ee0e 20 /*****************************************************************************
jmarkel44 0:61364762ee0e 21 * Function: AnalyticsLogger
jmarkel44 0:61364762ee0e 22 * Description: entry point for the Analytics Logger
jmarkel44 0:61364762ee0e 23 *
jmarkel44 0:61364762ee0e 24 * @param (IN) args (user-defined arguments)
jmarkel44 0:61364762ee0e 25 * @return none
jmarkel44 0:61364762ee0e 26 *****************************************************************************/
jmarkel44 0:61364762ee0e 27 void AnalyticsLogger(void const *args)
jmarkel44 0:61364762ee0e 28 {
jmarkel44 0:61364762ee0e 29 struct tm *ts;
jmarkel44 0:61364762ee0e 30 time_t curr_sec;
jmarkel44 0:61364762ee0e 31 int last_min=8;
jmarkel44 0:61364762ee0e 32 bool log_sent=false;
jmarkel44 0:61364762ee0e 33
jmarkel44 0:61364762ee0e 34 printf("\rAnalyticsLogger has started...\n");
jmarkel44 0:61364762ee0e 35
jmarkel44 0:61364762ee0e 36 while ( true ) {
jmarkel44 0:61364762ee0e 37
jmarkel44 0:61364762ee0e 38 std::ostringstream log_event;
jmarkel44 0:61364762ee0e 39
jmarkel44 0:61364762ee0e 40 curr_sec = time(0);
jmarkel44 0:61364762ee0e 41 ts = localtime(&curr_sec);
jmarkel44 0:61364762ee0e 42 // printf("curr_sec=%ld, min=%d (last=%d)\r\n", curr_sec, ts->tm_min, last_min );
jmarkel44 0:61364762ee0e 43 if( ((ts->tm_min%5) == 0) && (ts->tm_min != last_min) ) {
jmarkel44 0:61364762ee0e 44 last_min = ts->tm_min;
jmarkel44 0:61364762ee0e 45
jmarkel44 0:61364762ee0e 46 int map_count = ModbusRegisterMap.size();
jmarkel44 0:61364762ee0e 47 int collected_count = 0;
jmarkel44 0:61364762ee0e 48
jmarkel44 0:61364762ee0e 49 log_event << "\"lr\":[";
jmarkel44 0:61364762ee0e 50 std::map<std::string, ModbusRegister>::iterator iter;
jmarkel44 0:61364762ee0e 51 for (iter = ModbusRegisterMap.begin(); iter != ModbusRegisterMap.end(); ++iter) {
jmarkel44 0:61364762ee0e 52
jmarkel44 0:61364762ee0e 53 collected_count = collected_count + 1;
jmarkel44 0:61364762ee0e 54
jmarkel44 0:61364762ee0e 55 log_event << "{\"t\":"<< "\"" << iter->first.c_str() << "\"," << "\"v\":"<< "\"" << RegisterValueMap[iter->first].float_value<< "\"},";
jmarkel44 0:61364762ee0e 56 log_sent = false;
jmarkel44 0:61364762ee0e 57 if( log_event.str().size() >= 150 ) {
jmarkel44 0:61364762ee0e 58 std::string str = log_event.str();
jmarkel44 0:61364762ee0e 59 str.erase( str.size() - 1 );
jmarkel44 0:61364762ee0e 60 if( collected_count == map_count ) {
jmarkel44 0:61364762ee0e 61 str.append("],\"seq\":\"0\"");
jmarkel44 0:61364762ee0e 62 } else {
jmarkel44 0:61364762ee0e 63 str.append("],\"seq\":\"1\"");
jmarkel44 0:61364762ee0e 64 }
jmarkel44 0:61364762ee0e 65 // printf("%s:%d: Logging %s : len=%d\r\n", __func__, __LINE__, str.c_str(), str.length() );
jmarkel44 0:61364762ee0e 66 LiveDataLoggerApi( str.c_str() );
jmarkel44 0:61364762ee0e 67 log_event.str("");
jmarkel44 0:61364762ee0e 68 log_event.clear();
jmarkel44 0:61364762ee0e 69 log_event << "\"lr\":[";
jmarkel44 0:61364762ee0e 70 log_sent = true;
jmarkel44 0:61364762ee0e 71 }
jmarkel44 0:61364762ee0e 72 }
jmarkel44 0:61364762ee0e 73 if( log_sent == false ) {
jmarkel44 0:61364762ee0e 74 std::string str = log_event.str();
jmarkel44 0:61364762ee0e 75 str.erase( str.size() - 1 );
jmarkel44 0:61364762ee0e 76 str.append("],\"seq\":\"0\"");
jmarkel44 0:61364762ee0e 77 if( str.length() > 20 ) {
jmarkel44 0:61364762ee0e 78 // printf("%s:%d: Logging %s : len=%d\r\n", __func__, __LINE__, str.c_str(), str.length() );
jmarkel44 0:61364762ee0e 79 LiveDataLoggerApi( str.c_str() );
jmarkel44 0:61364762ee0e 80 }
jmarkel44 0:61364762ee0e 81 }
jmarkel44 0:61364762ee0e 82 }
jmarkel44 0:61364762ee0e 83
jmarkel44 0:61364762ee0e 84 Thread::wait(5000);
jmarkel44 0:61364762ee0e 85 checkStackUsage();
jmarkel44 0:61364762ee0e 86 }
jmarkel44 0:61364762ee0e 87 }
jmarkel44 0:61364762ee0e 88
jmarkel44 0:61364762ee0e 89 //
jmarkel44 0:61364762ee0e 90 // For optimizing/debugging purposes only!
jmarkel44 0:61364762ee0e 91 //
jmarkel44 0:61364762ee0e 92 static void checkStackUsage(void)
jmarkel44 0:61364762ee0e 93 {
jmarkel44 0:61364762ee0e 94 const float threshold = .85;
jmarkel44 0:61364762ee0e 95
jmarkel44 0:61364762ee0e 96 std::vector<std::pair<std::string, Thread*> > taskList;
jmarkel44 0:61364762ee0e 97 taskList.push_back(make_pair((std::string)"AnalyticsLogger", GLOBAL_analyticsLogger_thread));
jmarkel44 0:61364762ee0e 98 taskList.push_back(make_pair((std::string)"DataHandler", GLOBAL_dataHandler_thread));
jmarkel44 0:61364762ee0e 99 taskList.push_back(make_pair((std::string)"ConfigHandler", GLOBAL_configHandler_thread));
jmarkel44 0:61364762ee0e 100 taskList.push_back(make_pair((std::string)"ControlTask", GLOBAL_controlTask_thread));
jmarkel44 0:61364762ee0e 101 taskList.push_back(make_pair((std::string)"ModbusMaster", GLOBAL_modbusMaster_thread));
jmarkel44 0:61364762ee0e 102 taskList.push_back(make_pair((std::string)"OutputTask", GLOBAL_outputTask_thread));
jmarkel44 0:61364762ee0e 103 for ( std::vector<std::pair<std::string, Thread*> >::iterator pos = taskList.begin(); pos != taskList.end(); ++ pos) {
jmarkel44 0:61364762ee0e 104 // do something
jmarkel44 0:61364762ee0e 105 if ( (float) pos->second->max_stack() / (float) pos->second->stack_size() >= threshold ) {
jmarkel44 0:61364762ee0e 106 printf("\rWARNING: %s has used %.2f%% of its stack!\n", pos->first.c_str(),
jmarkel44 0:61364762ee0e 107 (double)((float)pos->second->max_stack() / (float)pos->second->stack_size()) * 100.0);
jmarkel44 0:61364762ee0e 108 }
jmarkel44 0:61364762ee0e 109 }
jmarkel44 0:61364762ee0e 110 }