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.
Diff: ICE-Application/main.cpp
- Revision:
- 0:61364762ee0e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ICE-Application/main.cpp Tue Jan 24 19:05:33 2017 +0000
@@ -0,0 +1,213 @@
+/******************************************************************************
+ *
+ * File: main.cpp
+ * Desciption: Ground Zero
+ *
+ *****************************************************************************/
+#include <time.h>
+#include <iostream>
+
+#include "global.h"
+#include "mbed.h"
+#include "rtos.h"
+#include "ntshell.h"
+#include "version.h"
+#include "AnalyticsLogger.h"
+#include "ConfigurationHandler.h"
+#include "ControlTask.h"
+#include "DataHandler.h"
+#include "ModbusMaster.h"
+#include "OutputTask.h"
+#include "ConfigFs.h"
+#include "rtc.h"
+#include "mfs.h"
+
+// threading data
+osThreadId mainThreadId = NULL;
+
+Thread *GLOBAL_analyticsLogger_thread = NULL;
+Thread *GLOBAL_modbusMaster_thread = NULL;
+Thread *GLOBAL_BLE_thread = NULL;
+Thread *GLOBAL_CDH_thread = NULL;
+Thread *GLOBAL_configHandler_thread = NULL;
+Thread *GLOBAL_controlTask_thread = NULL;
+Thread *GLOBAL_outputTask_thread = NULL;
+Thread *GLOBAL_dataHandler_thread = NULL;
+
+// mailboxes
+Mail<ConfigMessage_t, 16> ConfigHandlerMailBox;
+Mail<ModbusMasterReq_t, 2> ModbusMasterMailBox;
+Mail<OutputControlMsg_t, 16> OutputMasterMailBox;
+Mail<AnalyticsLoggerReq_t, 16> AnalyticsLoggerMailBox;
+Mail<BLEHandlerReq_t, 1> BLEHandlerMailBox;
+
+// bootup sequence signals
+int sig_output_continue = 0x1; // allow the output handler to start
+int sig_config_continue = 0x2; // allow the config handler to start
+int sig_control_continue = 0x3; // allow the control task to start
+
+// some digitals...for fun, whilst developing
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+
+DigitalIn rClk(D7);
+
+// console communication settings
+Serial console(USBTX, USBRX, 115200);
+
+I2C* i2c;
+
+ConfigFs EEP_FileSystem;
+ConfigFs *GLOBAL_mdot = &EEP_FileSystem;
+
+//MTSLog *GLOBAL_logger;
+
+#undef TODO_ICE // move this, doesn't belong here...
+// store modbus register information
+std::map<std::string,ModbusRegister> ModbusRegisterMap;
+std::map<std::string,RegisterValue> RegisterValueMap;
+std::map<std::string,SimulateInput> SimulateInputMap;
+
+// local prototypes
+static void banner(void);
+
+/*****************************************************************************
+ * Function: timestamp_boot_record()
+ * Description: timestamp the boot record with current time
+ *
+ * @param none
+ * @return none
+ *****************************************************************************/
+static void timestamp_boot_record(void)
+{
+ char time_string[80];
+ time_t curr_sec;
+ struct tm *ts;
+
+ curr_sec = time(0);
+ ts = localtime(&curr_sec);
+ strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ts);
+
+ GLOBAL_mdot->saveUserFile("boot.time", time_string, sizeof(time_string));
+ return;
+}
+
+
+/**
+ * @brief the main software entry point
+ *
+ * @param none
+ * @return 0
+ */
+
+
+
+int main(void)
+{
+ // light 'em up! -- remove this once we go to a real board!
+ led1 = led2 = led3 = 1;
+
+ struct tm rtc_time;
+ time_t curr_sec;
+ int year = 0;
+
+ mainThreadId = osThreadGetId();
+
+ i2c = &i2c_instance;
+
+ // intialize the real-time clock
+ rtc_init();
+
+ rtc_get_time(&year, &rtc_time.tm_mon, &rtc_time.tm_mday, &rtc_time.tm_hour, &rtc_time.tm_min, &rtc_time.tm_sec);
+ rtc_time.tm_mon = rtc_time.tm_mon - 1;
+ rtc_time.tm_year = year - 1900;
+ curr_sec = mktime( &rtc_time );
+
+ set_time(curr_sec);
+
+ timestamp_boot_record();
+
+ mainThreadId = osThreadGetId();
+
+ // display the startup banner
+ banner();
+
+ // the Modbus master task
+ Thread modbusMaster_thread(ModbusMaster, NULL, osPriorityHigh, MODBUS_MASTER_STACK_SIZE, NULL);
+ osSignalWait(sig_output_continue, osWaitForever);
+
+ // the Output task
+ Thread outputTask_thread(OutputTask, NULL, osPriorityNormal, OUTPUT_TASK_STACK_SIZE, NULL);
+ osSignalWait(sig_config_continue, osWaitForever);
+
+ // the Configuration Handler task
+ Thread configHandler_thread(ConfigurationHandler, NULL, osPriorityNormal, CONFIG_HANDLER_STACK_SIZE, NULL);
+ osSignalWait(sig_control_continue, osWaitForever);
+
+ // the Control task
+ Thread controlTask_thread(ControlTask, NULL, osPriorityNormal, CONTROL_TASK_STACK_SIZE, NULL);
+
+ // the Data Handler
+ Thread dataHandler_thread(DataHandler, NULL, osPriorityNormal, DATA_HANDLER_STACK_SIZE, NULL);
+
+ // the Analytics Logger task
+ Thread analyticsLoggerThread(AnalyticsLogger, NULL, osPriorityHigh, ANALYTICS_LOGGER_STACK_SIZE, NULL);
+
+ GLOBAL_analyticsLogger_thread = &analyticsLoggerThread;
+ GLOBAL_modbusMaster_thread = &modbusMaster_thread;
+ GLOBAL_configHandler_thread = &configHandler_thread;
+ GLOBAL_controlTask_thread = &controlTask_thread;
+ GLOBAL_outputTask_thread = &outputTask_thread;
+ GLOBAL_dataHandler_thread = &dataHandler_thread;
+
+ Thread::wait(2500);
+
+ // start the command shell -- this will loop forever
+ console.printf("\r\nInvoking the command shell\n\r\n");
+ ntshell_execute(&ntshell, func_read, func_write, func_cb_ntshell);
+}
+
+/**
+ * @brief the bootup banner
+ *
+ * @param none
+ * @return none
+ */
+static void banner(void)
+{
+ struct tm *ts;
+ time_t curr_sec;
+ char time_string[80];
+
+ curr_sec = time(0);
+ ts = localtime(&curr_sec);
+
+ strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ts);
+
+ printf("\n\n\r\nProject: ICE v%d.%d.%d (%s)\n",
+ MAJOR_VERSION_NUMBER,
+ MINOR_VERSION_NUMBER,
+ PATCH_VERSION_NUMBER,
+ PROJECT_CODE_NAME);
+
+ printf("\rThe Intelligent Connected Experience\n");
+ printf("\rCopyright 2017 Nalco Water, an Ecolab Company\n");
+
+#ifdef __ICCARM__
+ printf("\rToolchain: IAR\n");
+#else
+ printf("\rToolchain: MBED\n");
+#endif
+
+ printf("\r _________ _______ _______ \n");
+ printf("\r \\__ __/( ____ \\( ____ \\ \n");
+ printf("\r ) ( | ( \\/| ( \\/ \n");
+ printf("\r | | | | | (__ \n");
+ printf("\r | | | | | __) \n");
+ printf("\r | | | | | ( \n");
+ printf("\r ___) (___| (____/\\| (____/\\ \n");
+ printf("\r \\_______/(_______/(_______/ \n");
+
+ printf("\r\nCurrent time is: %s\r\n", time_string);
+}