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/CommandParser/cmd.cpp
- Committer:
- jmarkel44
- Date:
- 2017-01-24
- Revision:
- 0:61364762ee0e
File content as of revision 0:61364762ee0e:
/* * =============================================================== * Natural Tiny Shell (NT-Shell) Application example. * Version 0.0.6 * =============================================================== * Copyright (c) 2010-2011 Shinichiro Nakamura * * 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. * =============================================================== */ #include <mbed.h> #include <mbed_stats.h> #include <stdlib.h> #include <vector> #include <rtos.h> #include "cmd.h" #include "ntshell.h" #include "ntopt.h" #include "cJSON.h" #include "v7.h" #include "global.h" #include "OutputTask.h" #include "ModbusMasterApi.h" #include "ConfigurationHandler.h" #include "mfs.h" #include "rtc.h" #include "ConfigFs.h" #include "version.h" #include "ICELog.h" #include "utilities.h" ntshell_t ntshell; extern Serial console; // the readers and writers int func_read(char *buf, int cnt); int func_write(const char *buf, int cnt); int func_cb_ntshell(const char *text); void func_cb_ntopt(int argc, char **argv); // the command table element typedef struct { char *command; // command (from shell) char *description; // descrption void (*func)(int argc, char **argv); // callback function } command_table_t; const command_table_t cmdlist[] = { {"?", "help command", cmd_help }, {"cif", "create an input file", cmd_cif }, {"cof", "create an output file", cmd_cof }, {"create-ca", "create a control algorithm file", cmd_createCAlg }, {"create-fs", "create a failsafe control", cmd_createFailsafe }, {"create-mn", "create a manual control", cmd_createManual }, {"create-se", "create a sensor error control", cmd_createSError }, {"create-seq", "create a sequence control", cmd_createSequence }, {"create-sp", "create a setpoint control", cmd_createSetpoint }, {"create-tm", "create a timer control", cmd_createTimer }, {"create-vreg", "create a virtual register", cmd_createVreg }, {"debug-fs", "debug failsafe controls", cmd_debug_fs }, {"debug-mn", "debug manual controls", cmd_debug_mn }, {"debug-se", "debug sensor error controls", cmd_debug_se }, {"debug-seq", "debug sequence controls", cmd_debug_seq }, {"debug-sp", "debug setpoint controls", cmd_debug_sp }, {"debug-tm", "debug timer controls", cmd_debug_tm }, {"delete-file", "delete a file from EEPROM", cmd_deleteFile }, {"destroy-control", "destroy a control", cmd_destroy }, {"format-fs", "format EEPROM file system", cmd_formatFS }, {"heap-stats", "dump heap data", cmd_heap_stats }, {"help", "help command", cmd_help }, {"json-test", "JSON parser test", cmd_json }, {"log-level", "set debug log-level", cmd_logLevel }, {"ls", "list files in EEPROM", cmd_lsFile }, {"modmap", "dump modbus register map", cmd_modmap }, {"preload", "pre-load phase-1 demo files", cmd_preload }, {"read-file", "read file from EEPROM", cmd_readFile }, {"reset", "software reset", cmd_reset }, {"simall", "simulate multiple inputs", cmd_simall }, {"simerr", "simulate input error", cmd_simerr }, {"simin", "simulate input", cmd_simin }, {"show-ca", "show control algorithms", cmd_ShowAlgorithms }, {"show-controls", "show active controls", cmd_ShowControls }, {"show-tm-controls", "display active timer controls", cmd_ShowTimers }, {"show-mn-controls", "display active manual controls", cmd_ShowManuals }, {"show-co-controls", "display active composite controls", cmd_ShowComposites }, {"show-fs-controls", "display active failsafe controls", cmd_ShowFailsafes }, {"show-se-controls", "display active sensor error controls", cmd_ShowSensorErrors}, {"show-seq-controls", "display active sequential controls", cmd_ShowSequences }, {"show-sp-controls", "display active setpoint controls", cmd_ShowSetpoints }, {"show-outputs", "display the output hierarchy", cmd_outputs }, //{"spi-test", "test SPI FLASH interface", cmd_spiTest }, {"stack-stats", "dump stack stats", cmd_stack }, {"test-log-level", "tests the log functions", cmd_testLog }, {"test-prebleed", "test the pre-bleed scripts", cmd_testPreBleed }, {"v7-test", "V7 test", cmd_v7, }, {"version", "display version info", cmd_version }, {"vregmap", "display the virtual register map", cmd_vregmap }, {"write-file", "write a file to EEPROM", cmd_writeFile }, {"get-time", "get time from RTC", cmd_getTime }, {"set-time", "set time from RTC", cmd_setTime }, {NULL, NULL, NULL} }; void cmd_testLog(int argc, char **argv) { logFatal ("Testing"); logError ("Testing"); logWarning ("Testing"); logInfo ("Testing"); logDebug ("Testing"); logTrace ("Testing"); } // // function: cmd_debug_fs // decription: debug failsafe controls (ON|OFF) // void cmd_debug_fs(int argc, char **argv) { extern bool debugFailsafeControl; if ( argc == 1 ) { printf("\rCurrent level is %d\r\n", debugFailsafeControl); return; } if ( argc != 2 ) { usage: printf("\rusage: debug-fs <1|0>\n"); printf("\rexample: debug-fs 1\n"); return; } if ( (atoi(argv[1])) == 1 ) { debugFailsafeControl = true; } else if ( (atoi(argv[1])) == 0 ) { debugFailsafeControl = false; } else { goto usage; } } // // function: cmd__debug_man // description: debug manual controls (ON|OFF) // void cmd_debug_mn(int argc, char **argv) { extern bool debugManualControl; if ( argc == 1 ) { printf("\rCurrent level is %d\r\n", debugManualControl); return; } if ( argc != 2 ) { usage: printf("\rusage: debug-man <1|0>\n"); printf("\rexample: debug-man 1\n"); return; } if ( (atoi(argv[1])) == 1 ) { debugManualControl = true; } else if ( (atoi(argv[1])) == 0 ) { debugManualControl = false; } else { goto usage; } } // // function: cmd_debug_se // description: debug sensor error controls (ON|OFF) // void cmd_debug_se(int argc, char **argv) { extern bool debugSensorError; if ( argc == 1 ) { printf("\rCurrent level is %d\r\n", debugSensorError); return; } if ( argc != 2 ) { usage: printf("\rusage: debug-se <1|0>\n"); printf("\rexample: debug-se 1\n"); return; } if ( (atoi(argv[1])) == 1 ) { debugSensorError = true; } else if ( (atoi(argv[1])) == 0 ) { debugSensorError = false; } else { goto usage; } } // // function: cmd_debug_seq // description: debug sequence controls (ON|OFF // void cmd_debug_seq(int argc, char **argv) { extern bool debugSequenceControl; if ( argc == 1 ) { printf("\rCurrent level is %d\r\n", debugSequenceControl); return; } if ( argc != 2 ) { usage: printf("\rusage: debug-seq <1|0>\n"); printf("\rexample: debug-seq 1\n"); return; } if ( (atoi(argv[1])) == 1 ) { debugSequenceControl = true; } else if ( (atoi(argv[1])) == 0 ) { debugSequenceControl = false; } else { goto usage; } } // // function: cmd_debug_sp // description: debug setpoint controls // void cmd_debug_sp(int argc, char **argv) { extern bool debugSetpointControl; if ( argc == 1 ) { printf("\rCurrent level is %d\r\n", debugSetpointControl); return; } if ( argc != 2 ) { usage: printf("\rusage: debug-sp <1|0>\n"); printf("\rexample: debug-sp 1\n"); return; } if ( (atoi(argv[1])) == 1 ) { debugSetpointControl = true; } else if ( (atoi(argv[1])) == 0 ) { debugSetpointControl = false; } else { goto usage; } } // // function: cmd_debug_tm // description: debug timer controls (ON|OFF) // void cmd_debug_tm(int argc, char **argv) { extern bool debugTimerControl; if ( argc == 1 ) { printf("\rCurrent level is %d\r\n", debugTimerControl); return; } if ( argc != 2 ) { usage: printf("\rusage: debug-tm <1|0>\n"); printf("\rexample: debug-tm 1\n"); return; } if ( (atoi(argv[1])) == 1 ) { debugTimerControl = true; } else if ( (atoi(argv[1])) == 0 ) { debugTimerControl = false; } else { goto usage; } } void cmd_heap_stats(int argc, char **argv) { #ifndef __ICCARM__ UNUSED(argc), UNUSED(argv); printf("\r%s\r\n", Util_getHeapData().c_str()); #if 0 UNUSED(argc); UNUSED(argv); mbed_stats_heap_t s; mbed_stats_heap_get(&s); printf("\rHeap statistics:\n"); printf("\r bytes allocated......%u\n", s.current_size/1024); printf("\r max bytes allocated..%u\n", s.max_size/1024); printf("\r cumulative sum.......%u\n", s.total_size); printf("\r reserved size........%u\n", s.reserved_size); printf("\r allocations..........%u\n", s.alloc_cnt); printf("\r failed allocations...%u\n", s.alloc_fail_cnt); return; #endif #endif } void cmd_ShowAlgorithms(int argc, char **argv) { UNUSED(argc); UNUSED(argv); ConfigurationHandler_showAlgorithms(); printf("\r\n"); } void cmd_ShowControls(int argc, char **argv) { UNUSED(argc); UNUSED(argv); ConfigurationHandler_showControls(); printf("\r\n"); } void cmd_reset(int argc, char **argv) { NVIC_SystemReset(); } void cmd_ShowTimers(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showTimerControls(); printf("\r\n"); } void cmd_ShowManuals(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showManualControls(); printf("\r\n"); } void cmd_ShowFailsafes(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showFailsafeControls(); printf("\r\n"); } void cmd_ShowSequences(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showSequenceControls(); } void cmd_ShowComposites(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showCompositeControls(); printf("\r\n"); } void cmd_ShowSetpoints(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showSetpointControls(); printf("\r\n"); } void cmd_ShowSensorErrors(int argc, char **argv) { UNUSED(argc), UNUSED(argv); ConfigurationHandler_showSensorErrorControls(); printf("\r\n"); } /***************************************************************************** * Function: cmd_simerr * Description: simulate an input error * * @return none *****************************************************************************/ void cmd_simerr(int argc, char **argv) { if ( argc < 3 ) { printf("\rusage: simerr <input> <errflag_value>\n"); printf("\rexample: simerr i_bdcond01 9\n"); return; } ModbusRegisterMap[argv[1]].simulated = true; SimulateInputMap[argv[1]].errflag = (uint32_t)(atoi(argv[2])); } /***************************************************************************** * Function: cmd_simin * Description: simulat input * * @param argc-> number of args * @param argv-> input * @return none *****************************************************************************/ void cmd_simin(int argc, char **argv) { if ( argc != 3 && argc != 7 ) { printf("\rusage: simin <input> <value> <<low> <hi> <up_step> <down_step>>\r\n"); printf("\rexample: simin i_tra01 100 94 106 1 .25\r\n"); printf("\rexample: simin i_bdcond01 2000 1990 2006 .25 1\r\n"); printf("\rexample: simin i_bdcond01 1800\n"); return; } //float value = atof( argv[2] ); SimulateInputMap[argv[1]].start_value = atof(argv[2]); ModbusRegisterMap[argv[1]].simulated = true; if ( argc == 3 ) { SimulateInputMap[argv[1]].min = 0; SimulateInputMap[argv[1]].max = 0; SimulateInputMap[argv[1]].moving_up = false; return; } SimulateInputMap[argv[1]].min = atof(argv[3]); SimulateInputMap[argv[1]].max = atof(argv[4]); SimulateInputMap[argv[1]].up_step = atof(argv[5]); SimulateInputMap[argv[1]].down_step = atof(argv[6]); SimulateInputMap[argv[1]].moving_up = true; } /***************************************************************************** * Function: cmd_simall * Description: simulat multiple inputs * * @return none *****************************************************************************/ void cmd_simall(int argc, char **argv) { if ( argc > 1 ) { printf("\r setting: simin i_tra01 100\n"); ModbusRegisterMap["i_tra01"].simulated = true; SimulateInputMap["i_tra01"].start_value = 130; SimulateInputMap["i_tra01"].min = 0; SimulateInputMap["i_tra01"].max = 0; SimulateInputMap["i_tra01"].up_step = 0; SimulateInputMap["i_tra01"].down_step = 0; SimulateInputMap["i_tra01"].moving_up = true; printf("\r setting: i_tag01 100\n"); ModbusRegisterMap["i_tag01"].simulated = true; SimulateInputMap["i_tag01"].start_value = 100; SimulateInputMap["i_tag01"].min = 0; SimulateInputMap["i_tag01"].max = 0; SimulateInputMap["i_tag01"].up_step = 0; SimulateInputMap["i_tag01"].down_step = 0; SimulateInputMap["i_tag01"].moving_up = true; printf("\r setting: i_bdcond01 1800\n"); ModbusRegisterMap["i_bdcond01"].simulated = true; SimulateInputMap["i_bdcond01"].start_value = 1800; SimulateInputMap["i_bdcond01"].min = 0; SimulateInputMap["i_bdcond01"].max = 0; SimulateInputMap["i_bdcond01"].up_step = 0; SimulateInputMap["i_bdcond01"].down_step = 0; SimulateInputMap["i_bdcond01"].moving_up = true; printf("\r setting: i_cond_temp01 25\n"); ModbusRegisterMap["i_cond_temp01"].simulated = true; SimulateInputMap["i_cond_temp01"].start_value = 25000.0; SimulateInputMap["i_cond_temp01"].min = 0; SimulateInputMap["i_cond_temp01"].max = 0; SimulateInputMap["i_cond_temp01"].up_step = 0; SimulateInputMap["i_cond_temp01"].down_step = 0; SimulateInputMap["i_cond_temp01"].moving_up = true; printf("\r setting: i_ph01 8\n"); ModbusRegisterMap["i_ph01"].simulated = true; SimulateInputMap["i_ph01"].start_value = 8000; SimulateInputMap["i_ph01"].min = 0; SimulateInputMap["i_ph01"].max = 0; SimulateInputMap["i_ph01"].up_step = 0; SimulateInputMap["i_ph01"].down_step = 0; SimulateInputMap["i_ph01"].moving_up = true; printf("\r setting: i_ph_temp01 25\n"); ModbusRegisterMap["i_ph_temp01"].simulated = true; SimulateInputMap["i_ph_temp01"].start_value = 25000.0; SimulateInputMap["i_ph_temp01"].min = 0; SimulateInputMap["i_ph_temp01"].max = 0; SimulateInputMap["i_ph_temp01"].up_step = 0; SimulateInputMap["i_ph_temp01"].down_step = 0; SimulateInputMap["i_ph_temp01"].moving_up = true; printf("\r setting: i_orp01 350\n"); ModbusRegisterMap["i_orp01"].simulated = true; SimulateInputMap["i_orp01"].start_value = 350; SimulateInputMap["i_orp01"].min = 0; SimulateInputMap["i_orp01"].max = 0; SimulateInputMap["i_orp01"].up_step = 0; SimulateInputMap["i_orp01"].down_step = 0; SimulateInputMap["i_orp01"].moving_up = true; printf("\r setting: i_flowsw01 1\n"); ModbusRegisterMap["i_flowsw01"].simulated = true; SimulateInputMap["i_flowsw01"].start_value = 1; SimulateInputMap["i_flowsw01"].min = 0; SimulateInputMap["i_flowsw01"].max = 0; SimulateInputMap["i_flowsw01"].up_step = 0; SimulateInputMap["i_flowsw01"].down_step = 0; SimulateInputMap["i_flowsw01"].moving_up = true; return; } printf("\rsetting: simin i_tra01 130 120 140 1 .25\r\n"); printf("\rsetting: simin i_tag01 100 90 110 1 .25\r\n"); printf("\rsetting: simin i_bdcond01 1800 1725 1875 1 5\r\n"); printf("\rsetting: simin i_ph01 8.0 7.25 8.75 .0. .1\r\n"); printf("\rsetting: simin i_orp01 350 300 400 5 1\r\n"); ModbusRegisterMap["i_tra01"].simulated = true; SimulateInputMap["i_tra01"].start_value = 130; SimulateInputMap["i_tra01"].min = 120; SimulateInputMap["i_tra01"].max = 140; SimulateInputMap["i_tra01"].up_step = 1; SimulateInputMap["i_tra01"].down_step = .25; ModbusRegisterMap["i_tag01"].simulated = true; SimulateInputMap["i_tag01"].start_value = 100; SimulateInputMap["i_tag01"].min = 90; SimulateInputMap["i_tag01"].max = 110; SimulateInputMap["i_tag01"].up_step = 1; SimulateInputMap["i_tag01"].down_step = .25; ModbusRegisterMap["i_bdcond01"].simulated = true; SimulateInputMap["i_bdcond01"].start_value = 1800; SimulateInputMap["i_bdcond01"].min = 1725; SimulateInputMap["i_bdcond01"].max = 1875; SimulateInputMap["i_bdcond01"].up_step = 1; SimulateInputMap["i_bdcond01"].down_step = 5; ModbusRegisterMap["i_ph01"].simulated = true; SimulateInputMap["i_ph01"].start_value = 8000; SimulateInputMap["i_ph01"].min = 7250; SimulateInputMap["i_ph01"].max = 8750; SimulateInputMap["i_ph01"].up_step = 5; SimulateInputMap["i_ph01"].down_step = 10; ModbusRegisterMap["i_orp01"].simulated = true; SimulateInputMap["i_orp01"].start_value = 350; SimulateInputMap["i_orp01"].min = 300; SimulateInputMap["i_orp01"].max = 400; SimulateInputMap["i_orp01"].up_step = 5; SimulateInputMap["i_orp01"].down_step = 1; } void cmd_stack(int argc, char **argv) { vector<pair<string, Thread*> > taskList; const char *mapper[] = { "Inactive", "Ready", "Running", "WaitingDelay", "WaitingInterval", "WaitingOr", "WaitingAnd", "WaitingSempahore", "WaitingMailbox", "WaitingMutex" }; //simply add your task to the list... taskList.push_back(make_pair((string)"AnalyticsLogger", GLOBAL_analyticsLogger_thread)); taskList.push_back(make_pair((string)"ConfigHandler", GLOBAL_configHandler_thread)); taskList.push_back(make_pair((string)"ControlTask", GLOBAL_controlTask_thread)); taskList.push_back(make_pair((string)"ModbusMaster", GLOBAL_modbusMaster_thread)); taskList.push_back(make_pair((string)"OutputTask", GLOBAL_outputTask_thread)); for ( vector<pair<string, Thread*> >::iterator pos = taskList.begin(); pos != taskList.end(); ++ pos) { printf("\r %-32s size/free/used/max = %5u/%5u/%5u/%5u\tpri=%u state=%-20s\n", pos->first.c_str(), pos->second->stack_size(), pos->second->free_stack(), pos->second->used_stack(), pos->second->max_stack(), pos->second->get_priority(), mapper[pos->second->get_state()]); } printf("\r\n"); } void cmd_version(int argc, char **argv) { printf("\rversion: %u.%u.%u (%s)\n\r\n", MAJOR_VERSION_NUMBER, MINOR_VERSION_NUMBER, PATCH_VERSION_NUMBER, PROJECT_CODE_NAME); } void cmd_help(int argc, char **argv) { UNUSED(argc); UNUSED(argv); const command_table_t *tblPtr = cmdlist; while (tblPtr->command) { printf("\r%-32s:\t%s\n", tblPtr->command, tblPtr->description); tblPtr++; } printf("\r\n"); } void cmd_v7(int argc, char **argv) { struct v7 *v7 = v7_create(); v7_val_t exec_rc; const char *js_code = "print(\"Hello World!\")"; v7_exec(v7, js_code, &exec_rc); printf("\r->exec_rc = %d\r\n", (int)exec_rc); v7_destroy(v7); } void cmd_json(int argc, char **argv) { const char buf[] = { "{" "\"tag1\":\"value1\" ," "\"tag2\":\"value2\" " "}" }; cJSON *root = cJSON_Parse(buf); printf("\rtag1 = %s\n", cJSON_GetObjectItem(root, "tag1")->valuestring); printf("\rtag2 = %s\n", cJSON_GetObjectItem(root, "tag2")->valuestring); cJSON_Delete(root); } /***************************************************************************** * Function: cmd_outputs * Description: display outputs ****************************************************************************/ void cmd_outputs(int argc, char **argv) { UNUSED(argc); UNUSED(argv); DisplayOutputs(); } void cmd_formatFS(int argc, char **argv) { mfs fs0(0xA0); console.printf("\n\r\n\r[mFS] Formatting EEPROM....................."); int bad_blocks = fs0.mkfs(true); console.printf(" found %d bad blocks\r\n", bad_blocks); } void cmd_writeFile(int argc, char **argv) { mfs fs0(0xA0); char filename[FILENAME_LENGTH]; memset( filename, '\0', FILENAME_LENGTH ); strncpy( filename, argv[1], FILENAME_LENGTH-1 ); char *file_buf = (char*) malloc(MAX_FILE_SIZE); memset( file_buf, '\0', MAX_FILE_SIZE); snprintf(file_buf, MAX_FILE_SIZE, "1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890-1234567890"); printf("%s\r\n", file_buf); if( GLOBAL_mdot->saveUserFile( filename, (void *)file_buf, MAX_FILE_SIZE ) != true ) { printf("Failed saveUserFile\r\n"); } free(file_buf); return; } void cmd_readFile(int argc, char **argv) { char filename[FILENAME_LENGTH]; memset( filename, '\0', FILENAME_LENGTH ); strncpy( filename, argv[1], FILENAME_LENGTH-1 ); int file_size = (atoi(argv[2])); char *file_buf = (char*) malloc(MAX_FILE_SIZE*2); memset( file_buf, '\0', MAX_FILE_SIZE*2); if( GLOBAL_mdot->readUserFile( filename, (void *)file_buf, file_size ) != true ) { printf("Failed readUserFile\r\n"); } printf("%s\r\n", file_buf); free(file_buf); return; } void cmd_deleteFile(int argc, char **argv) { char filename[FILENAME_LENGTH]; memset( filename, '\0', FILENAME_LENGTH ); strncpy( filename, argv[1], FILENAME_LENGTH-1 ); if( GLOBAL_mdot->deleteUserFile( filename ) != true ) { printf("Failed readUserFile\r\n"); } return; } void cmd_lsFile( int argc, char ** argv ) { std::vector<std::string>::iterator file; std::vector<std::string> file_list; file_list = GLOBAL_mdot->listUserFiles(); for(file = file_list.begin(); file != file_list.end(); ++file) { printf("%s\r\n", file->c_str() ); } mfs fs0(0xA0); // Get number of free blocks char iFreeBlocks = fs0.free(); // Calculate amount of space used unsigned int iSpaceUsed = VOL_SIZE - (iFreeBlocks*BS); // Summary printf("\n\r%u/%u kB space used, %u blocks free\n\r\n\r", iSpaceUsed/1024, VOL_SIZE/1024, iFreeBlocks); } /** * Serial read function. */ int func_read(char *buf, int cnt) { for (int i = 0; i < cnt; i++) { buf[i] = console.getc(); } return 0; } /** * Serial write function. */ int func_write(const char *buf, int cnt) { for (int i = 0; i < cnt; i++) { console.putc(buf[i]); } return 0; } /** * Callback function for ntshell module. */ int func_cb_ntshell(const char *text) { return ntopt_parse(text, func_cb_ntopt); } /** * Callback function for ntopt module. */ void func_cb_ntopt(int argc, char **argv) { if (argc == 0) { return; } int execnt = 0; const command_table_t *p = &cmdlist[0]; while (p->command != NULL) { if (strcmp(argv[0], p->command) == 0) { p->func(argc, argv); execnt++; } p++; } if (execnt == 0) { printf("Command not found.\r\n"); } wait_ms(250); } #if 0 /***************************************************************************** * Function: cmd_createSequence * Description: create an administrative control * * @param argc-> number of args * @param argv-> control name, control type * @return none *****************************************************************************/ void cmd_createSequence(int argc, char **argv) { char buf[MAX_FILE_SIZE*2]; // let's crreate the sequence control file std::string filename = "control_seq_SLUG-DOSE.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"SLUG-DOSE\", " "\"startTrigger\": \"v_slugSchedule\", " "\"sequence\": " "[" // START PRE-BLEED elements "{ \"startTrigger\":\"v_alwaysTrue\", " "\"actions\": " "[" "{ \"action\": \"create\", \"id\": \"PRE-BLEED-SP\" }, " "{ \"action\": \"create\", \"id\": \"GUARD-TM\" }" "]," // end actions array "\"stopTrigger\": \"v_PreBleedDone\" }," // DELETE PRE-BLEED elements "{ \"startTrigger\":\"v_alwaysTrue\", " "\"actions\": " "[" "{ \"action\": \"delete\", \"id\": \"PRE-BLEED-SP\" }, " "{ \"action\": \"delete\", \"id\": \"GUARD-TM\" }" "]," "\"stopTrigger\": \"v_alwaysTrue\" }," // SLUG-FEED elements "{ \"startTrigger\":\"v_alwaysTrue\", " "\"actions\": " "[" "{ \"action\": \"create\", \"id\": \"SLUG-FEED-SP\" } " "]," "\"stopTrigger\": \"v_SlugFeedDone\" }," // DELETE SLUG-FEED elements "{ \"startTrigger\":\"v_alwaysTrue\", " "\"actions\": " "[" "{ \"action\": \"delete\", \"id\": \"SLUG-FEED-SP\" } " "]," "\"stopTrigger\": \"v_alwaysTrue\" }" "] " // end sequence array "} "); printf("String Length=%d\r\n", strlen(buf) ); bool rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, sizeof(buf)); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // the pre-bleed setpoint control snprintf(buf, sizeof(buf), "{" "\"id\": \"PRE-BLEED-SP\"," "\"priority\": \"750\", " "\"input\": \"i_bdcond\" ," "\"output\": \"o_rly01\" ," "\"setpoint\": \"1750\", " "\"prodfact\": \"\", " "\"actingDir\": \"1\", " "\"tol\": \"5\" " "}"); filename = "seq_SLUG-DOSE_PRE-BLEED-SP.json"; rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void*)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // OUTPUT: Virtual Output - this is the START TRIGGER fro the control filename = "vregister_slugSchedule.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_slugSchedule\", " "\"value\": \"0\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // VIRTUAL REGISTER: always True filename = "vregister_alwaysTrue.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_alwaysTrue\", " "\"value\": \"1\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // VIRTUAL REGISTER: v_GuardTimer filename = "vregister_GuardTimer.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_GuardTimer\", " "\"value\": \"0\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // VIRTUAL REGISTER: v_PreBleedDone filename = "vreg_PreBleedDone.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_PreBleedDone\", " "\"value\": \"0\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // VIRTUAL REGISTER: v_SlugFeedDone filename = "vreg_SlugFeedDone.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_SlugFeedDone\", " "\"value\": \"0\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // CONTROL: GUARD-TIMER filename = "seq_SLUG-DOSE_GUARD-TM.json"; snprintf(buf, sizeof(buf), "{" "\"id\":\"GUARD-TM\"," "\"output\":\"v_GuardTimer\"," "\"priority\":\"750\"," "\"day\":\"\"," "\"startHour\":\"\"," "\"startMin\":\"\"," "\"startSec\":\"\"," "\"week\":\"\"," "\"duration\":\"60\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void*)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("failed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // the pre-bleed setpoint control snprintf(buf, sizeof(buf), "{" "\"id\": \"SLUG-FEED-SP\"," "\"priority\": \"750\", " "\"input\": \"i_orp01\" ," "\"output\": \"o_rly02\" ," "\"setpoint\": \"400\", " "\"prodfact\": \"\", " "\"actingDir\": \"1\", " "\"tol\": \"5\" " "}"); filename = "seq_SLUG-DOSE_SLUG-FEED-SP.json"; rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void*)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } } #endif // PRELOAD command, used to create all the pertinent inputs, outputs, and // controls needed to achieve a basic cooling water application void cmd_preload(int argc, char **argv) { UNUSED(argc); UNUSED(argv); char buf[MAX_FILE_SIZE]; bool rc; // PRELOADER: // JavaScripts: // js_noFlowDelay.js // implement 10 minute on delay for flow switch // js_sum.js // sum two registers and store in register // js_diff.js // diff two registers and store in register // js_mul.js // mul two registers and store in register // js_div.js // div two registers and store in register // js_equ.js // equ set one register equal to another register // // Inputs: // input_i_bdcond.json // conductivity probe // input_i_bdcond_temp.json // conductivity probe : temperature // input_i_flowsw01.json // flow switch // input_i_orp01.json // ORP probe // input_i_ph01.json // pH probe // input_i_ph01_temp.json // pH probe : temperature // input_i_tag01.json // tag (flu) // input_i_tra01.json // Trasar // // Outputs: // output_o_rly01.json // relay-1 // output_o_rly02.json // relay-2 // // Standard Controls: // control_sp_i_bd01.json // blowdown // control_sp_i_tra01.json // Trasar // // Control Algorithms: // control_ca_eq1.json // == 1 // control_ca_eq129.json // == 129 // // Composite Controls: // control_comp_flow.json // flow override // control_comp_lockout.json // lockout blowdown std::string filename = "ble_device_name.json"; snprintf(buf, sizeof(buf), "{\"id\":\"ICE-Ecolab\"}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } filename = "vreg_const_1000.json"; // Constant: 1000.0 snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_Const_1000\", " "\"value\": \"1000.0\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); #ifdef EXECUTE_SCRIPT filename = "vreg_noFlowDelaySig.json"; // Virtual Register: v_noFlowDelaySig // Used to generate on delay timing for flow override. snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_noFlowDelaySig\", " "\"value\": \"1\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "vreg_noFlowTimeStamp.json"; // Virtual Register: v_noFlowTimeStamp // Used to generate on delay timing for flow override. snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_noFlowTimeStamp\", " "\"value\": \"0\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "js_noFlowDelay.js"; // JavaScript: sum(a, b, c) // a = Flow Input Signal - this is the signal we are doing the on delay timing for // b = v_noFlowDelaySig - signal generated after No Flow condition exsits for 10 minutes // c = v_noFlowTimeStamp - mark of when the no flow signal first started // // "\"args\":[{\"arg\":\"i_flowsw01\"},{\"arg\":\"v_noFlowDelaySig\"},{\"arg\":\"v_noFlowTimeStamp\"}]," // snprintf(buf, sizeof(buf), "var noFlowDelay=function(a,b,c){" "f_state=getRegister(a);" "if(f_state==1){" // we have flow on the skid, reset timestamp to 0 // and reset the "delayed" signal to indicate we have flow "setRegister(c,0);" "setRegister(b,f_state);" "}else{" // we don't have flow on the skid "curr_time=getTime();" "st_tstamp=getRegister(c);" "if(st_tstamp==0) {" // this is the 1st read of no-flow // mark the start of the delay timing "setRegister(c,curr_time);" "}else{" // determine how long we have been doing the delay timing. "diff_time=curr_time-st_tstamp;" //"print(' Delay='+diff_time+'\r');" "if(diff_time>=600){" // been doing the delay timing for at least 10 minutes // set the delayed signal to equal the actual flow switch "setRegister(b,f_state);" "}" "}" "}" "return 1;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "js_sum.js"; // JavaScript: sum(a, b, c) snprintf(buf, sizeof(buf), "var sum = function(a, b, c) {" "res = (getRegister(a) + getRegister(b));" "setRegister(c,res);" "return res;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "js_diff.js"; // JavaScript: diff(a, b, c) snprintf(buf, sizeof(buf), "var diff = function(a, b, c) {" "res = (getRegister(a) - getRegister(b));" "setRegister(c,res);" "return res;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "js_div.js"; // JavaScript: div(a, b, c) snprintf(buf, sizeof(buf), "var div = function(a, b, c) {" "res = (getRegister(a) / getRegister(b));" "setRegister(c,res);" "return res;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "js_mul.js"; // JavaScript: mul(a, b, c) snprintf(buf, sizeof(buf), "var mul = function(a, b, c) {" "res = (getRegister(a) * getRegister(b));" "setRegister(c,res);" "return res;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "js_equ.js"; // JavaScript: equ(a, b) snprintf(buf, sizeof(buf), "var equ = function(a, b) {" "res = getRegister(a);" "setRegister(b,res);" "return res;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "exe_js_div_cond_temp01.js"; // Execute JavaScript: DIV_COND_TEMP01 snprintf(buf, sizeof(buf), "{ " "\"id\":\"DIV_COND_TEMP01\"," "\"script\":\"div\"," "\"args\":[{\"arg\":\"i_cond_temp01\"},{\"arg\":\"v_Const_1000\"},{\"arg\":\"i_cond_temp01\"}]" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "exe_js_div_ph01.js"; // Execute JavaScript: DIV_PH01 snprintf(buf, sizeof(buf), "{ " "\"id\":\"DIV_PH01\"," "\"script\":\"div\"," "\"args\":[{\"arg\":\"i_ph01\"},{\"arg\":\"v_Const_1000\"},{\"arg\":\"i_ph01\"}]" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } filename = "exe_js_prebleed.js"; // Execute JavaScript: PREBLEED_DONE.json snprintf(buf, sizeof(buf), "{ " "\"id\":\"PREBLEED_DONE\"," "\"script\":\"prebleed_done\"," // in: o_rly01 // in: v_pbTimer // out" v_preBleedDone "\"args\":[{\"arg\":\"o_rly01\"},{\"arg\":\"v_pbTimer\"},{\"arg\":\"v_preBleedDone\"}]" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); /* filename = "exe_js_div_ph_temp01.js"; // Execute JavaScript: DIV_PH_TEMP01 snprintf(buf, sizeof(buf), "{ " "\"id\":\"DIV_PH_TEMP01\"," "\"script\":\"div\"," "\"args\":[{\"arg\":\"i_ph_temp01\"},{\"arg\":\"v_Const_1000\"},{\"arg\":\"i_ph_temp01\"}]" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "exe_js_no_flow_delay.js"; // Execute JavaScript: NO_FLOW_DELAY snprintf(buf, sizeof(buf), "{ " "\"id\":\"NO_FLOW_DELAY\"," "\"script\":\"noFlowDelay\"," "\"args\":[{\"arg\":\"i_flowsw01\"},{\"arg\":\"v_noFlowDelaySig\"},{\"arg\":\"v_noFlowTimeStamp\"}]" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); */ #endif filename = "input_i_bdcond01.json"; // INPUT: Conductivity snprintf(buf, sizeof(buf), "{ " "\"id\": \"i_bdcond01\"," "\"name\": \"Tower Conductivity\", " "\"units\": \"uS\"," "\"min\": \"0\"," "\"max\": \"6000\"," "\"node\": \"21\"," "\"reg\": \"18\"," "\"rtype\": \"4\"," "\"type\": \"1\"," "\"size\": \"2\"," "\"order\": \"2\"," "\"fmt\": \"%%.2f\"," "\"cmd\": \"\"," "\"args\": []," "\"rfreq\": \"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: Conductivity Temperature filename = "input_i_cond_temp01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"i_cond_temp01\"," "\"name\":\"Temp Conductivity\"," "\"units\":\"C\"," "\"min\":\"0\"," "\"max\":\"80\"," "\"node\":\"21\"," "\"reg\":\"10\"," "\"rtype\":\"4\"," "\"type\":\"1\"," "\"size\":\"2\"," "\"order\":\"2\"," "\"fmt\":\"%%.2f\"," "\"cmd\":\"div\"," "\"args\":[{\"arg\":\"i_cond_temp01\"},{\"arg\":\"v_Const_1000\"},{\"arg\":\"i_cond_temp01\"}]," "\"rfreq\":\"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: Flow Switch filename = "input_i_flowsw01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"i_flowsw01\"," "\"name\": \"Flow\"," "\"units\": \"\"," "\"min\": \"0\"," "\"max\": \"1\"," "\"node\": \"0\"," "\"reg\": \"1\"," "\"rtype\": \"0\"," "\"type\": \"3\"," "\"size\": \"2\"," "\"order\": \"0\"," "\"fmt\": \"%%d\"," "\"cmd\": \"\"," "\"args\": []," "\"rfreq\": \"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: ORP filename = "input_i_orp01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"i_orp01\"," "\"name\": \"ORP\"," "\"units\": \"mV\"," "\"min\": \"0\"," "\"max\": \"10\"," "\"node\": \"23\"," "\"reg\": \"14\"," "\"rtype\": \"4\"," "\"type\": \"1\"," "\"size\": \"2\"," "\"order\": \"2\"," "\"fmt\": \"%%.2f\"," "\"cmd\": \"\"," "\"args\": []," "\"rfreq\": \"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: pH filename = "input_i_ph01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"i_ph01\"," "\"name\":\"pH\"," "\"units\":\"pH\"," "\"min\":\"0\"," "\"max\":\"10\"," "\"node\":\"22\"," "\"reg\":\"18\"," "\"rtype\":\"4\"," "\"type\":\"1\"," "\"size\":\"2\"," "\"order\":\"2\"," "\"fmt\":\"%%.2f\"," "\"cmd\":\"div\"," "\"args\":[{\"arg\":\"i_ph01\"},{\"arg\":\"v_Const_1000\"},{\"arg\":\"i_ph01\"}]," "\"rfreq\":\"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: pH Temperature filename = "input_i_ph01_temp.json"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"i_ph_temp01\"," "\"name\":\"Temp pH\"," "\"units\":\"C\"," "\"min\":\"0\"," "\"max\":\"10\"," "\"node\":\"22\"," "\"reg\":\"10\"," "\"rtype\":\"4\"," "\"type\":\"1\"," "\"size\":\"2\"," "\"order\":\"2\"," "\"fmt\":\"%%.2f\"," "\"cmd\":\"div\"," "\"args\":[{\"arg\":\"i_ph_temp01\"},{\"arg\":\"v_Const_1000\"},{\"arg\":\"i_ph_temp01\"}]," "\"rfreq\":\"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: Tag filename = "input_i_tag01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"i_tag01\"," "\"name\": \"Tag\", " "\"units\": \"PPM\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"1\", " "\"reg\": \"11\", " "\"rtype\": \"4\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"fmt\": \"%%.2f\", " "\"cmd\": \"\", " "\"args\": []," "\"rfreq\": \"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // INPUT: Trasar filename = "input_i_tra01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"i_tra01\"," "\"name\": \"Trasar\", " "\"units\": \"PPM\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"1\", " "\"reg\": \"9\", " "\"rtype\": \"4\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"fmt\": \"%%.2f\", " "\"cmd\": \"\", " "\"args\": []," "\"rfreq\": \"5\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // COMMAND: Divide by 1000 filename = "cmd_div.json"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"%s\", " "\"Operand\":\"%s\", " "\"Operator\":\"%s\", " "\"Constant\":\"%s\" } ", "div", "", "/", "1000.0"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // OUTPUT: Relay 01 filename = "output_o_rly01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"o_rly01\", " "\"name\": \"Blowdown\", " "\"units\": \"\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"0\", " "\"reg\": \"1\", " "\"rtype\": \"1\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"fmt\": \"%%.2f\", " "\"cmd\": \"\", " "\"args\": [], " "\"rfreq\": \"5\", " "\"toperiod\": \"0\", " "\"scalelo\": \"0\", " "\"scalehi\": \"100\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // OUTPUT: Relay 02 filename = "output_o_rly02.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"o_rly02\", " "\"name\": \"3DTS86\", " "\"units\": \"\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"0\", " "\"reg\": \"2\", " "\"rtype\": \"1\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"fmt\": \"%%.2f\", " "\"cmd\": \"\", " "\"args\": [], " "\"rfreq\": \"5\", " "\"toperiod\": \"0\", " "\"scalelo\": \"0\", " "\"scalehi\": \"100\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // SETPOINT: Blowdown filename = "control_sp_BLOWDOWN_01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"BLOWDOWN_01\", " "\"priority\": \"800\", " "\"input\": \"i_bdcond01\", " "\"output\": \"o_rly01\", " "\"setpoint\": \"1800\", " "\"prodfact\": \"\", " "\"actingDir\": \"1\", " "\"tol\": \"30\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // SETPOINT: Trasar filename = "control_sp_INH_TRA_01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"INH_TRA_01\", " "\"priority\": \"800\", " "\"input\": \"i_tra01\", " "\"output\": \"o_rly02\", " "\"setpoint\": \"130\", " "\"prodfact\": \"100\", " "\"actingDir\": \"0\", " "\"tol\": \"4\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // ALGORITHM == 0 filename = "control_ca_EQUAL_TO_0.json"; snprintf(buf, sizeof(buf), "{" "\"id\": \"EQUAL_TO_0\", " "\"opr\": \"0\", " "\"op\": \"==\", " "\"true\": \"responseA\", " "\"false\": \"nothing\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save user file %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // ALGORITHM == 129 filename = "control_ca_RELAY_ON.json"; snprintf(buf, sizeof(buf), "{" "\"id\": \"RELAY_ON\", " "\"opr\": \"1\", " "\"op\": \"&\", " "\"true\": \"responseA\", " "\"false\": \"nothing\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save user file %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // FLOW filename = "control_comp_FLOW.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"FLOW\", " "\"tag\": \"i_flowsw01\", " "\"ca\": \"EQUAL_TO_0\", " "\"priority\": \"300\", " "\"entries\": \"2\", " "\"outputs\": [ " "{" "\"tag\": \"o_rly01\", " "\"responseA\": \"fixed off\" " "}," "{" "\"tag\": \"o_rly02\", " "\"responseA\": \"fixed off\" " "}" "]" "}" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save user file %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // LOCKOUT filename = "control_comp_LOCKOUT_BD.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"LOCKOUT_BD\", " "\"tag\": \"o_rly01\", " "\"ca\": \"RELAY_ON\", " "\"priority\": \"400\", " "\"entries\": \"1\", " "\"outputs\": [ " "{" "\"tag\": \"o_rly02\", " "\"responseA\": \"fixed off\" " "}" "]" "}" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save user file %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } filename = "control_fs_BLOWDOWN_FS.json"; snprintf(buf, sizeof(buf), "{" "\"id\": \"BLOWDOWN_FS\", " "\"input\": \"i_bdcond01\", " "\"output\": \"o_rly01\", " "\"priority\":\"600\", " "\"lfsValue\":\"700\", " "\"lfsDutyCycle\":\"0\", " "\"lfsInterval\":\"1\", " "\"hfsValue\":\"2700\", " "\"hfsDutyCycle\":\"50\", " "\"hfsInterval\":\"1\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to create %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); filename = "control_fs_TRASAR_FS.json"; snprintf(buf, sizeof(buf), " {" "\"id\": \"TRASAR_FS\", " "\"input\": \"i_tra01\", " "\"output\": \"o_rly02\", " "\"priority\":\"600\", " "\"lfsValue\":\"70\", " "\"lfsDutyCycle\":\"50\", " // ON a minute, OFF a minute... "\"lfsInterval\":\"2\", " "\"hfsValue\":\"200\", " "\"hfsDutyCycle\":\"0\", " "\"hfsInterval\":\"2\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to create %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // HOLDING REGISTER: Conductivity Calibration filename = "hold_h_CondCmd_21.json"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"%s\", " "\"node\":\"%s\", " "\"sreg\":\"%s\", " "\"nreg\":\"%s\", " "\"order\":\"%s\" } ", "h_CondCmd_21", "21", "0", "3", "2"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // HOLDING REGISTER: pH Calibration filename = "hold_h_phCmd_22.json"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"%s\", " "\"node\":\"%s\", " "\"sreg\":\"%s\", " "\"nreg\":\"%s\", " "\"order\":\"%s\" } ", "h_phCmd_22", "22", "0", "3", "2"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); printf("\r\nIssue \"reset\" command to invoke changes\r\n\r\n\r\n"); } /***************************************************************************** * Function: cmd_cif * Description: create input file * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ void cmd_cif(int argc, char **argv) { if ( argc != 6 ) { printf("\rusage: cif <fname> <input> <name> <node> <reg>\n"); printf("\rexample: cif input_i_tra01.json i_tra01 Trasar 5 2\n"); return; } char data_buf[MAX_FILE_SIZE]; snprintf(data_buf, sizeof(data_buf), "{ " "\"id\": \"%s\", " "\"name\": \"%s\", " "\"units\": \"PPM\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"%s\", " "\"reg\": \"%s\", " "\"rtype\": \"1\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"rfreq\": \"5\", " "\"cmd\": \"\"," "\"args\": []," "\"fmt\": \"%%.2f\" } ", argv[2], argv[3], argv[4], argv[5]); bool status = GLOBAL_mdot->saveUserFile(argv[1], (void *)data_buf, MAX_FILE_SIZE); if( status != true ) { printf("(%d)save file failed, status=%d", __LINE__, status); } printf("Sending Mail To ModbusMasterMailBox, filename=%s", argv[1]); ModbusMasterReq_t *mail = ModbusMasterMailBox.alloc(); mail->action = ACTION_READ_FILE; strncpy( mail->msg, argv[1], (sizeof(mail->msg)-1)); ModbusMasterMailBox.put(mail); } /***************************************************************************** * Function: cmd_destroy * Description: destroy a control * * @param argc-> number of arguments * @param argv-> control name, control type * @return none *****************************************************************************/ void cmd_destroy(int argc, char **argv) { if ( argc != 3 ) { printf("\r\nusage: destroy-control [controlName] [controlType]\n"); printf("\rcontrolType-> 0=timer, 1=PID, 2=setpoint, 3=composite, 4=manual, 5=sequence, 6=failsafe, 7=sensor error\r\n"); return; } // send a message to the configuration handler to destroy the control ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_DESTROY; msg->control = (Control_t) atoi(argv[2]); strncpy(msg->controlFile, argv[1], sizeof(msg->controlFile)-1); printf("%s: Sending a destroy request for control %s\r\n", __func__, msg->controlFile); ConfigHandlerMailBox.put(msg); printf("\r\n"); return; } /***************************************************************************** * Function: cmd_cof * Description: create output file * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ void cmd_cof(int argc, char **argv) { // OUTPUT: Relay 01 char buf[MAX_FILE_SIZE]; std::string filename = "output_o_rly01.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"o_rly01\", " "\"name\": \"Blowdown\", " "\"units\": \"\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"0\", " "\"reg\": \"1\", " "\"rtype\": \"1\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"fmt\": \"%%.2f\", " "\"cmd\": \"\", " "\"rfreq\": \"5\", " "\"toperiod\": \"0\", " "\"scalelo\": \"0\", " "\"scalehi\": \"100\" }"); bool rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } Thread::wait(1000); // OUTPUT: Relay 02 filename = "output_o_rly02.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"o_rly02\", " "\"name\": \"3DTS86\", " "\"units\": \"\", " "\"min\": \"0\", " "\"max\": \"300\", " "\"node\": \"0\", " "\"reg\": \"2\", " "\"rtype\": \"1\", " "\"type\": \"0\", " "\"size\": \"2\", " "\"order\": \"2\", " "\"fmt\": \"%%.2f\", " "\"cmd\": \"\", " "\"rfreq\": \"5\", " "\"toperiod\": \"0\", " "\"scalelo\": \"0\", " "\"scalehi\": \"100\" }"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } } /***************************************************************************** * Function: cmd_modmap * Description: dump modbus register map *****************************************************************************/ void cmd_modmap(int argc, char **argv) { UNUSED(argc); UNUSED(argv); ModbusValue value; std::map<std::string, ModbusRegister>::iterator iter; for (iter = ModbusRegisterMap.begin(); iter != ModbusRegisterMap.end(); ++iter) { ModbusMasterReadRegister( iter->first, &value ); printf("tag=%-24s node=%-4d reg=%-4d rtype=%-2d size=%-2d order=%-2d value=%-12.2f errflag=%-2d argc=%-2d arg[0]=%-24s\r\n", iter->first.c_str(), iter->second.node, iter->second.reg, iter->second.rtype, iter->second.size, iter->second.order, value.value, value.errflag, iter->second.argc, iter->second.argv[0].c_str() ); } } void cmd_createVreg(int argc, char **argv) { if ( argc != 4 ) { printf("\rusage: create-vreg <filename> <vregId> <value>\n"); printf("\rusage: create-vreg vreg_alwaysTrue.json v_alwaysTrue 1\n"); return; } char buf[MAX_FILE_SIZE]; snprintf(buf, sizeof(buf), "{ " "\"id\": \"%s\", " "\"value\": \"%s\" }", argv[2], argv[3]); bool rc = GLOBAL_mdot->saveUserFile(argv[1], (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", argv[1]); return; } else { printf("\r...generated %s\n", argv[1]); } } // void cmd_createCAlg(int argc, char **argv) { if ( argc != 1 ) { printf("\rusage: create-ca control_ca_equal.json"); return; } char buf[MAX_FILE_SIZE]; std::string filename = "control_ca_eq1.json"; snprintf(buf, sizeof(buf), " {" "\"id\": \"EQUAL_TO_1\", " "\"opr\": \"1\", " "\"op\": \"==\", " "\"true\": \"responseA\", " "\"false\": \"nothing\" " "}"); bool rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save user file %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // send a message to the configuration handler to create the control ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_ALGORITHM; strncpy(msg->controlFile, filename.c_str(), sizeof(msg->controlFile)-1); ConfigHandlerMailBox.put(msg); Thread::wait(2000); // == 129 filename = "control_ca_eq129.json"; snprintf(buf, sizeof(buf), "{" "\"id\": \"EQUAL_TO_1\", " "\"opr\": \"1\", " "\"op\": \"==\", " "\"true\": \"responseA\", " "\"false\": \"nothing\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save user file %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // send a message to the configuration handler to create the control msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_ALGORITHM; strncpy(msg->controlFile, "control_ca_greq1.json", sizeof(msg->controlFile)-1); ConfigHandlerMailBox.put(msg); } /***************************************************************************** * Function: cmd_createManual * Description: create a manual control * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ void cmd_createManual(int argc, char **argv) { std::string relayState; if ( argc != 6 ) { printf("\rusage: create-mn <filename> <id> <output> <state> <duration>\n"); printf("\rexample: create-mn control_mn_rly01.json man-1 o_rly1 on 30\r\n"); printf("\r<duration> specified in seconds, 0 for contiuous\n"); return; } string state(argv[4]); if ( state == "on" ) { relayState = "1"; } else if ( state == "off" ) { relayState = "0"; } else { printf("\r<state> must be on or off\r\n"); return; } unsigned int duration = atoi(argv[5]); unsigned int type; if ( duration == 0 ) { type = MANUAL_CONTROL_TYPE_CONTINUOUS; } else { type = MANUAL_CONTROL_TYPE_TIMED; } char data_buf[MAX_FILE_SIZE]; snprintf(data_buf, sizeof(data_buf), "{ " "\"id\": \"%s\", " "\"output\": \"%s\", " "\"type\": \"%d\", " "\"priority\": \"100\", " "\"duration\": \"%d\", " "\"setpoint\": \"0\", " "\"state\": \"%s\", " "\"percent\": \"100\" }", argv[2], argv[3], type, duration, relayState.c_str() ); bool status = GLOBAL_mdot->saveUserFile(argv[1], (void *)data_buf, MAX_FILE_SIZE); if( status != true ) { printf("(%d)save file failed, status=%d", __LINE__, status); return; } // send a message to the configuration handler to create the control ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_MANUAL; strncpy(msg->controlFile, argv[1], sizeof(msg->controlFile)-1); printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control); ConfigHandlerMailBox.put(msg); printf("\r\n"); return; } /***************************************************************************** * Function: cmd_createSError * Description: create a sensoe error control * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ void cmd_createSError(int argc, char **argv) { if ( argc != 7 ) { printf("\rusage: create-se <filename> <id> <input> <output> <duty> <interval>\n"); printf("\rexample: create-se control_se_bdcond.json se-1 i_bdcond o_rly01 50 10\n"); return; } char data_buf[MAX_FILE_SIZE]; snprintf(data_buf, sizeof(data_buf), "{ " "\"id\": \"%s\", " "\"input\": \"%s\", " "\"output\": \"%s\", " "\"priority\": \"459\", " "\"dutyCycle\": \"%d\", " "\"interval\": \"%d\" }", argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]) ); bool status = GLOBAL_mdot->saveUserFile(argv[1], (void *)data_buf, MAX_FILE_SIZE); if( status != true ) { printf("(%d)save file failed, status=%d", __LINE__, status); return; } // send a message to the configuration handler to create the control ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_SENSOR_ERROR; strncpy(msg->controlFile, argv[1], sizeof(msg->controlFile)-1); printf("%s: Sending a create request for sensor error control %s type = %u\r\n", __func__, msg->controlFile, msg->control); ConfigHandlerMailBox.put(msg); printf("\r\n"); return; } /***************************************************************************** * Function: cmd_createSetpoint * Description: create control file * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ void cmd_createSetpoint(int argc, char **argv) { if ( argc != 8 ) { printf("\rusage: create-sp <filename> <id> <input> <output> <sp> <dir> <tol>\n"); printf("\rexample: create-sp control_sp_1.json bd i_cond o_rly1 2000 1 15\n"); return; } if ( strncmp(argv[1], CONTROL_SP_STR, strlen(CONTROL_SP_STR)) != 0 ) { printf("\rFilename must be prefixed with control_sp_*\n"); return; } char data_buf[MAX_FILE_SIZE]; snprintf(data_buf, sizeof(data_buf), "{ " "\"id\": \"%s\", " "\"priority\": \"800\"," "\"input\": \"%s\", " "\"output\": \"%s\", " "\"setpoint\": \"%s\"," "\"prodfact\": \"100\"," "\"actingDir\": \"%s\", " "\"halert\": \"115\"," "\"lalert\": \"85\", " "\"hfs\": \"130\"," "\"lfs\": \"70\", " "\"tol\": \"%s\" }", argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); bool status = GLOBAL_mdot->saveUserFile(argv[1], (void *)data_buf, MAX_FILE_SIZE); if( status != true ) { printf("(%d)save file failed, status=%d", __LINE__, status); return; } // send a message to the configuration handler to create the control ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_SETPOINT; strncpy(msg->controlFile, argv[1], sizeof(msg->controlFile)-1); printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control); ConfigHandlerMailBox.put(msg); printf("\r\n"); return; } /***************************************************************************** * Function: cmd_createTimer * Description: create control file * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ void cmd_createTimer(int argc, char **argv) { if ( argc != 10 ) { printf("\rusage: create-tm <filename> <id> <output> <day> <hh> <mm> <ss> <duration> <week>\n"); printf("\rexample: create-tm control_tm_rly01.json o_rly01 wed 12 00 00 60\n"); printf("\r <day> is sun, mon, tue, wed, thu, fri, sat\n"); printf("\r <duration> is in seconds\n"); printf("\r <week> is every, first, second, third, fourth, last, everyother\n\r\n"); return; } if ( strncmp(argv[1], CONTROL_TM_STR, strlen(CONTROL_TM_STR)) != 0 ) { printf("\rFilename must be prefixed with control_tm_*\n"); return; } char data_buf[MAX_FILE_SIZE]; snprintf(data_buf, sizeof(data_buf), "{ " "\"id\": \"%s\", " "\"output\": \"%s\", " "\"priority\": \"750\", " "\"day\": \"%s\", " "\"startHour\": \"%s\", " "\"startMin\": \"%s\", " "\"startSec\": \"%s\", " "\"duration\": \"%s\", " "\"week\": \"%s\" } ", argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]); bool status = GLOBAL_mdot->saveUserFile(argv[1], (void *)data_buf, MAX_FILE_SIZE); if( status != true ) { printf("(%d)save file failed, status=%d", __LINE__, status); return; } // send a message to the configuration handler to create the control ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_TIMER; strncpy(msg->controlFile, argv[1], sizeof(msg->controlFile)-1); printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control); ConfigHandlerMailBox.put(msg); printf("\r\n"); return; } void cmd_createFailsafe(int argc, char **argv) { char buf[MAX_FILE_SIZE]; bool status; std::string filename = "control_fs_rly01.json"; snprintf(buf, sizeof(buf), "{" "\"id\": \"BLOWDOWN-FS\", " "\"input\": \"i_bdcond01\", " "\"output\": \"o_rly01\", " "\"priority\":\"700\", " "\"lfsValue\":\"700\", " "\"lfsDutyCycle\":\"0\", " "\"lfsInterval\":\"1\", " "\"hfsValue\":\"2700\", " "\"hfsDutyCycle\":\"50\", " "\"hfsInterval\":\"1\" " "}"); status = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( status != true ) { printf("\rFailed to create %s\n", filename.c_str()); return; } else { printf("\r created %s\n", filename.c_str()); } ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_FAILSAFE; strncpy(msg->controlFile, filename.c_str(), sizeof(msg->controlFile)-1); printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control); ConfigHandlerMailBox.put(msg); Thread::wait(1000); filename = "control_fs_rly02.json"; snprintf(buf, sizeof(buf), " {" "\"id\": \"TRASAR-FS\", " "\"input\": \"i_tra01\", " "\"output\": \"o_rly02\", " "\"priority\":\"700\", " "\"lfsValue\":\"70\", " "\"lfsDutyCycle\":\"20\", " "\"lfsInterval\":\"15\", " "\"hfsValue\":\"200\", " "\"hfsDutyCycle\":\"0\", " "\"hfsInterval\":\"15\" " "}"); status = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( status != true ) { printf("\rFailed to create %s\n", filename.c_str()); return; } else { printf("\r created %s\n", filename.c_str()); } msg = ConfigHandlerMailBox.alloc(); memset(msg, 0, sizeof(ConfigMessage_t)); msg->action = ACTION_CREATE; msg->control = CONTROL_FAILSAFE; strncpy(msg->controlFile, filename.c_str(), sizeof(msg->controlFile)-1); printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control); ConfigHandlerMailBox.put(msg); } /***************************************************************************** * Function: cmd_logLevel * Description: get or set the current log-level * * @param argc (not used) * @param argv (not used) * @return none *****************************************************************************/ void cmd_logLevel(int argc, char **argv) { uint8_t logLevel = 0; const char *mapper[] = { "NONE", "FATAL", "ERROR", "WARNING", "INFO", "DEBUG", "TRACE" }; if ( argc == 1 ) { printf("\r current log-level set to %s\r\n", mapper[ICELog::getLogLevel()]); goto usage; } if ( argc != 2 ) { usage: printf("\rusage: log-level [0-6]\n"); printf("\r 0 = NONE\n"); printf("\r 1 = FATAL\n"); printf("\r 2 = ERROR\n"); printf("\r 3 = WARNING\n"); printf("\r 4 = INFO\n"); printf("\r 5 = DEBUG\n"); printf("\r 6 = TRACE\r\n"); return; } logLevel = atoi(argv[1]); if ( logLevel > 6 ) goto usage; // reassign the log level printf("...setting log-level to %s\r\n", mapper[logLevel]); ICELog::setLogLevel(logLevel); printf("\r\n"); } /***************************************************************************** * Function: cmd_vregmap * Description: show virtual register map * * @param argc-> number of args * @param argv-> filename * @return none *****************************************************************************/ extern std::map<std::string,RegisterValue> RegisterValueMap; void cmd_vregmap(int argc, char **argv) { UNUSED(argc); UNUSED(argv); std::map<std::string, RegisterValue>::iterator iter; for (iter = RegisterValueMap.begin(); iter != RegisterValueMap.end(); ++iter) { printf("id=%s, value=%.4f\r\n", iter->first.c_str(), iter->second.float_value ); } } void cmd_testPreBleed(int argc, char **argv) { char buf[MAX_FILE_SIZE]; // OUTPUT (virtual): variable set to TRUE when pre-bleed is done std::string filename = "vreg_preBleedDone.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_preBleedDone\", " "\"value\": \"0\" " "}"); bool rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // OUTPUT (virtual): variable is set to TRUE while pre-bleed time is running via timer control filename = "vreg_pbTimer.json"; snprintf(buf, sizeof(buf), "{ " "\"id\": \"v_pbTimer\", " "\"value\": \"0\" " "}"); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // JavaScript Executor: // IN: o_rly01 // IN: v_pbTimer // OUT: v_preBleedDone // // Description: execute the js_nor_regs() script with arguments o_rly01 // and v_pbTimer; stores the result in v_preBleedDone // filename = "exe_js_prebleed_done.js"; snprintf(buf, sizeof(buf), "{ " "\"id\":\"PREBLEED_DONE\"," "\"script\":\"nor_regs\"," "\"args\":[{\"arg\":\"o_rly01\"},{\"arg\":\"v_pbTimer\"},{\"arg\":\"v_preBleedDone\"}]" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } // JavaScript: nor_regs(a, b) => c filename = "js_nor_regs.js"; snprintf(buf, sizeof(buf), "var nor_regs = function(a, b, c) {" "res1 = getRegister(a);" "res2 = getRegister(b);" "if ( res1 == 0 || res2 == 0 ) { setRegister(c, 1); }" "return 1;" "};" ); rc = GLOBAL_mdot->saveUserFile(filename.c_str(), (void *)buf, MAX_FILE_SIZE); if ( rc != true ) { printf("\rFailed to save %s\n", filename.c_str()); return; } else { printf("\r...generated %s\n", filename.c_str()); } } /***************************************************************************** * Function: cmd_setTime * Description: set real-time clock * * @param argc-> number of args * @param argv-> input * @return none *****************************************************************************/ void cmd_setTime(int argc, char **argv) { if ( argc != 7 ) { printf("\rusage: set-time <yyyy> <mm> <dd> <hh> <mm> <ss>\n"); printf("\rexample: set-time 2017 1 24 9 0 0\r\n"); return; } int isc = atoi( argv[6] ); // sec int imn = atoi( argv[5] ); // min int ihr = atoi( argv[4] ); // hour int idy = atoi( argv[3] ); // idy int imo = atoi( argv[2] ); // imo int iyr = atoi( argv[1] ); // year // printf( "\r\n%s:%d: sec(0x%x) min(0x%x) hour(0x%x) day(0x%x) mon(0x%x) year(0x%x)\r\n", __func__, __LINE__, isc, imn, ihr, idy, imo, iyr ); rtc_set_time(iyr, imo, idy, ihr, imn, isc); } void getTime() { char time_string[80]; struct tm rtc_time; struct tm * ts; time_t curr_sec; int year = 0; rtc_get_time(&year, &rtc_time.tm_mon, &rtc_time.tm_mday, &rtc_time.tm_hour, &rtc_time.tm_min, &rtc_time.tm_sec); // printf( "\r\n%s:%d:sec(0x%x) min(0x%x) hour(0x%x) day(0x%x) mon(0x%x) year(0x%x)\r\n", __func__, __LINE__, rtc_time.tm_sec, rtc_time.tm_min, rtc_time.tm_hour, rtc_time.tm_mday, rtc_time.tm_mon, year ); rtc_time.tm_mon = rtc_time.tm_mon - 1; rtc_time.tm_year = year - 1900; curr_sec = mktime( &rtc_time ); ts = localtime(&curr_sec); strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ts); printf("%s\r\n", time_string); } void cmd_getTime(int argc, char **argv) { getTime(); }