work1

Dependencies:   mbed MAX44009 mbed-os Si7021

Committer:
danaeb
Date:
Thu May 28 07:31:51 2020 +0000
Revision:
2:25f27478fdf9
Parent:
1:3656b45f17a8
work

Who changed what in which revision?

UserRevisionLine numberNew contents of line
danaeb 0:d3e390d62607 1 #include "AppCommand.h"
danaeb 0:d3e390d62607 2 #include "mbed_trace.h"
danaeb 0:d3e390d62607 3
danaeb 0:d3e390d62607 4 #include "AppMain.h"
danaeb 0:d3e390d62607 5 #include "CommandParser.h"
danaeb 0:d3e390d62607 6 #include "SensorManager.h"
danaeb 0:d3e390d62607 7 #include "Calendar.h"
danaeb 0:d3e390d62607 8 #include "Sensor.h"
danaeb 0:d3e390d62607 9 #include "rtc.h"
danaeb 0:d3e390d62607 10 #include "tools.h"
danaeb 0:d3e390d62607 11
danaeb 0:d3e390d62607 12 #define TRACE_GROUP "acmd"
danaeb 0:d3e390d62607 13
danaeb 0:d3e390d62607 14 using namespace liboo;
danaeb 0:d3e390d62607 15
danaeb 0:d3e390d62607 16 CommandParser *AppCommand::_parser = NULL;
danaeb 0:d3e390d62607 17 SensorManager *AppCommand::_sensor_manager = NULL;
danaeb 0:d3e390d62607 18 Calendar *AppCommand::_calendar = NULL;
danaeb 0:d3e390d62607 19 bool AppCommand::_is_intialized = false;
danaeb 0:d3e390d62607 20 bool AppCommand::_is_pump_on = false;
danaeb 0:d3e390d62607 21
danaeb 0:d3e390d62607 22 void AppCommand::configure(SensorManager* sensor_manager,
danaeb 0:d3e390d62607 23 Calendar *calendar){
danaeb 0:d3e390d62607 24 _parser = new CommandParser;
danaeb 0:d3e390d62607 25 _sensor_manager = sensor_manager;
danaeb 0:d3e390d62607 26 _is_pump_on = false;
danaeb 0:d3e390d62607 27 //_calendar = calendar;
danaeb 0:d3e390d62607 28
danaeb 0:d3e390d62607 29 if(!_is_intialized){
danaeb 0:d3e390d62607 30 CommandCallback *cc;
danaeb 0:d3e390d62607 31 _is_intialized = true;
danaeb 0:d3e390d62607 32
danaeb 0:d3e390d62607 33 // set rtc time
danaeb 0:d3e390d62607 34 cc = new CommandCallback("set time", 0b10000000, 0b00000000, _rtc_set_time);
danaeb 0:d3e390d62607 35 _parser->register_command_callback(cc);
danaeb 0:d3e390d62607 36
danaeb 0:d3e390d62607 37 cc = new CommandCallback("set pump", 0b00000001, 0b00000000, _set_pump);
danaeb 0:d3e390d62607 38 _parser->register_command_callback(cc);
danaeb 0:d3e390d62607 39
danaeb 0:d3e390d62607 40 #if 0
danaeb 0:d3e390d62607 41 // reset calendar
danaeb 0:d3e390d62607 42 cc = new CommandCallback("reset calendar", 0b00110000, 0b00000000,
danaeb 0:d3e390d62607 43 _calendar_reset);
danaeb 0:d3e390d62607 44 _parser->register_command_callback(cc);
danaeb 0:d3e390d62607 45
danaeb 0:d3e390d62607 46 // add time slot
danaeb 0:d3e390d62607 47 cc = new CommandCallback("add time slot", 0b00100000, 0b01000000,
danaeb 0:d3e390d62607 48 _calendar_add_time_slot);
danaeb 0:d3e390d62607 49 _parser->register_command_callback(cc);
danaeb 0:d3e390d62607 50
danaeb 0:d3e390d62607 51 // configure active sensors
danaeb 0:d3e390d62607 52 cc = new CommandCallback("sensor", 0b00001000, 0b01110111,
danaeb 0:d3e390d62607 53 _sensor_configure_active);
danaeb 0:d3e390d62607 54 _parser->register_command_callback(cc);
danaeb 0:d3e390d62607 55
danaeb 0:d3e390d62607 56 // disable enable calendar
danaeb 0:d3e390d62607 57 cc = new CommandCallback("calendar", 0b01000000, 0b00111110, _calendar_state);
danaeb 0:d3e390d62607 58 _parser->register_command_callback(cc);
danaeb 0:d3e390d62607 59 #endif
danaeb 0:d3e390d62607 60 }
danaeb 0:d3e390d62607 61 }
danaeb 0:d3e390d62607 62
danaeb 0:d3e390d62607 63 void AppCommand::process_command(u8 command_id, u8 *command_data, u16 command_size){
danaeb 0:d3e390d62607 64 _parser->execute(command_id, command_data, command_size);
danaeb 0:d3e390d62607 65 }
danaeb 0:d3e390d62607 66
danaeb 0:d3e390d62607 67 bool AppCommand::get_pump_state(){
danaeb 0:d3e390d62607 68 return _is_pump_on;
danaeb 0:d3e390d62607 69 }
danaeb 0:d3e390d62607 70
danaeb 0:d3e390d62607 71 u16 AppCommand::_rtc_set_time(u8 command_id, u8* command_data, u16 command_data_size){
danaeb 0:d3e390d62607 72 u16 ret = 0;
danaeb 0:d3e390d62607 73 tr_info("command set time");
danaeb 0:d3e390d62607 74 if(command_data_size < 4){
danaeb 0:d3e390d62607 75 return ret;
danaeb 0:d3e390d62607 76 }
danaeb 0:d3e390d62607 77
danaeb 0:d3e390d62607 78 s32 offset;
danaeb 0:d3e390d62607 79 u32 current_time;
danaeb 0:d3e390d62607 80 offset = *((u32*)command_data);
danaeb 0:d3e390d62607 81
danaeb 0:d3e390d62607 82 Rtc *rtc = Rtc::get_instance();
danaeb 0:d3e390d62607 83 tr_info("\t offset : %ld", offset);
danaeb 0:d3e390d62607 84 rtc->apply_offset(offset);
danaeb 0:d3e390d62607 85
danaeb 0:d3e390d62607 86 // check calendar in case we need to change latch state.
danaeb 0:d3e390d62607 87 current_time = rtc->get_time();
danaeb 0:d3e390d62607 88 tr_info("\t time: %lu", current_time);
danaeb 0:d3e390d62607 89 //_calendar->check(current_time);
danaeb 0:d3e390d62607 90
danaeb 0:d3e390d62607 91 ret = 4;
danaeb 0:d3e390d62607 92 return ret;
danaeb 0:d3e390d62607 93 }
danaeb 0:d3e390d62607 94
danaeb 0:d3e390d62607 95 u16 AppCommand::_set_pump(u8 command_id, u8* command_data, u16 command_data_size){
danaeb 0:d3e390d62607 96 u16 ret = 0;
danaeb 0:d3e390d62607 97 tr_info("command set pump");
danaeb 0:d3e390d62607 98 if(command_data_size < 1){
danaeb 0:d3e390d62607 99 return ret;
danaeb 0:d3e390d62607 100 }
danaeb 0:d3e390d62607 101
danaeb 0:d3e390d62607 102 uint8_t state = *command_data;
danaeb 0:d3e390d62607 103
danaeb 0:d3e390d62607 104 PowerManager *pm = PowerManager::get_instance();
danaeb 0:d3e390d62607 105 if(state == 1){
danaeb 0:d3e390d62607 106 tr_debug("turn on !!!");
danaeb 0:d3e390d62607 107 pm->lock_and_turn_on_motor();
danaeb 0:d3e390d62607 108 _is_pump_on = true;
danaeb 0:d3e390d62607 109 }
danaeb 0:d3e390d62607 110 else {
danaeb 0:d3e390d62607 111 tr_debug("turn off !!!");
danaeb 0:d3e390d62607 112 pm->unlock_and_turn_off_motor();
danaeb 0:d3e390d62607 113 _is_pump_on = false;
danaeb 0:d3e390d62607 114 }
danaeb 0:d3e390d62607 115
danaeb 0:d3e390d62607 116 ret = 1;
danaeb 0:d3e390d62607 117 return ret;
danaeb 0:d3e390d62607 118 }
danaeb 0:d3e390d62607 119
danaeb 0:d3e390d62607 120 u16 AppCommand::_calendar_reset(u8 command_id, u8* command_data,
danaeb 0:d3e390d62607 121 u16 command_data_size){
danaeb 0:d3e390d62607 122 tr_info("command reset calendar");
danaeb 0:d3e390d62607 123 //_calendar->reset(false);
danaeb 0:d3e390d62607 124 return 0;
danaeb 0:d3e390d62607 125 }
danaeb 0:d3e390d62607 126
danaeb 0:d3e390d62607 127 u16 AppCommand::_calendar_state(u8 command_id, u8* command_data,
danaeb 0:d3e390d62607 128 u16 command_data_size){
danaeb 0:d3e390d62607 129 PRINT(" disable calendar\r\n");
danaeb 0:d3e390d62607 130 if(command_id & 0x01){
danaeb 0:d3e390d62607 131 //_calendar->enable();
danaeb 0:d3e390d62607 132 }
danaeb 0:d3e390d62607 133 else{
danaeb 0:d3e390d62607 134 //_calendar->disable();
danaeb 0:d3e390d62607 135 }
danaeb 0:d3e390d62607 136 return 0;
danaeb 0:d3e390d62607 137 }
danaeb 0:d3e390d62607 138
danaeb 0:d3e390d62607 139 u16 AppCommand::_calendar_add_time_slot(u8 command_id, u8* command_data, u16 command_data_size){
danaeb 0:d3e390d62607 140 u16 processed_size = 0;
danaeb 0:d3e390d62607 141
danaeb 0:d3e390d62607 142
danaeb 0:d3e390d62607 143 tr_info("command add time slot");
danaeb 0:d3e390d62607 144 // compute start time offset
danaeb 0:d3e390d62607 145 // the start offset can be changed even if no time slot are present
danaeb 0:d3e390d62607 146 s8 start_time_offset;
danaeb 0:d3e390d62607 147 start_time_offset = (command_id & 0x0F);
danaeb 0:d3e390d62607 148 start_time_offset -= 8;
danaeb 0:d3e390d62607 149 //_calendar->set_start_time_offset(start_time_offset);
danaeb 0:d3e390d62607 150
danaeb 0:d3e390d62607 151
danaeb 0:d3e390d62607 152 // several time slot can be embedded in one command
danaeb 0:d3e390d62607 153 // each time slot is coded on 4 bytes so the command size must have
danaeb 0:d3e390d62607 154 // a multiplicity of 4
danaeb 0:d3e390d62607 155 if(command_data_size < 4 || (command_data_size % 4 != 0)){
danaeb 0:d3e390d62607 156 return processed_size;
danaeb 0:d3e390d62607 157 }
danaeb 0:d3e390d62607 158 u8 i = 0;
danaeb 0:d3e390d62607 159 while(command_data_size - processed_size != 0){
danaeb 0:d3e390d62607 160 bool use_stop_day = false;
danaeb 0:d3e390d62607 161 u16 duration;
danaeb 0:d3e390d62607 162 u16 start_time;
danaeb 0:d3e390d62607 163 u8 start_day;
danaeb 0:d3e390d62607 164 u8 stop_day;
danaeb 0:d3e390d62607 165 u8 day_cycle;
danaeb 0:d3e390d62607 166
danaeb 0:d3e390d62607 167 u32 data;
danaeb 0:d3e390d62607 168
danaeb 0:d3e390d62607 169 // /4 because we are incrementing u32 pointer
danaeb 0:d3e390d62607 170 // so 1 increment means +4 address
danaeb 0:d3e390d62607 171 data = *((u32*)command_data + processed_size/4);
danaeb 0:d3e390d62607 172
danaeb 0:d3e390d62607 173
danaeb 0:d3e390d62607 174 start_time = (data & 0x000000FF);
danaeb 0:d3e390d62607 175 duration = ((data & 0x0001FF00) >> 8);
danaeb 0:d3e390d62607 176 day_cycle = ((data & 0x001E0000) >> (8+9));
danaeb 0:d3e390d62607 177 start_day = ((data & 0x03E00000) >> (8+9+4));
danaeb 0:d3e390d62607 178 use_stop_day = ((data & 0x80000000) > 0);
danaeb 0:d3e390d62607 179
danaeb 0:d3e390d62607 180 if(use_stop_day){
danaeb 0:d3e390d62607 181 stop_day = ((data & 0x7C000000) >> (8+9+4+5));
danaeb 0:d3e390d62607 182 }
danaeb 0:d3e390d62607 183 else{
danaeb 0:d3e390d62607 184 // trick to make it work when start day is 0:
danaeb 0:d3e390d62607 185 // 0+32-1 = 31
danaeb 0:d3e390d62607 186 // if start day is 31:
danaeb 0:d3e390d62607 187 // 31+32-1 % 32 = 62 % 32 = 30
danaeb 0:d3e390d62607 188 //
danaeb 0:d3e390d62607 189 stop_day = (start_day + 32 - 1) % 32;
danaeb 0:d3e390d62607 190 }
danaeb 0:d3e390d62607 191
danaeb 0:d3e390d62607 192 // received start time is by 10 minutes time slots
danaeb 0:d3e390d62607 193 // and calendar uses 5 minutes time slots
danaeb 0:d3e390d62607 194 start_time *= 2;
danaeb 0:d3e390d62607 195
danaeb 0:d3e390d62607 196 tr_info("\t command number: %d\r\n"
danaeb 0:d3e390d62607 197 "\t\t start day: %d\r\n"
danaeb 0:d3e390d62607 198 "\t\t stop day: %d\r\n"
danaeb 0:d3e390d62607 199 "\t\t day cycle: %d\r\n"
danaeb 0:d3e390d62607 200 "\t\t start time: %d:%d\r\n"
danaeb 0:d3e390d62607 201 "\t\t duration %d",
danaeb 0:d3e390d62607 202 i, start_day, stop_day, day_cycle,
danaeb 0:d3e390d62607 203 (start_time*5)/60, ((start_time*5) % 60), duration);
danaeb 0:d3e390d62607 204 //
danaeb 0:d3e390d62607 205 // true -> add time slot
danaeb 0:d3e390d62607 206 //_calendar->set_time_slot(true, start_day, stop_day, day_cycle, start_time, duration);
danaeb 0:d3e390d62607 207 processed_size += 4;
danaeb 0:d3e390d62607 208 ++i;
danaeb 0:d3e390d62607 209 }
danaeb 0:d3e390d62607 210 Rtc *rtc = Rtc::get_instance();
danaeb 0:d3e390d62607 211
danaeb 0:d3e390d62607 212 // check calendar in case we need to change latch state.
danaeb 0:d3e390d62607 213 u32 current_time = rtc->get_time();
danaeb 0:d3e390d62607 214 //_calendar->check(current_time);
danaeb 0:d3e390d62607 215
danaeb 0:d3e390d62607 216 return processed_size;
danaeb 0:d3e390d62607 217
danaeb 0:d3e390d62607 218 }
danaeb 0:d3e390d62607 219 u16 AppCommand::_sensor_configure_active(u8 command_id, u8* command_data, u16 command_data_size){
danaeb 0:d3e390d62607 220 u16 ret = 0;
danaeb 0:d3e390d62607 221 tr_info("command config sensor");
danaeb 0:d3e390d62607 222 if(command_data_size < 2){
danaeb 0:d3e390d62607 223 return ret;
danaeb 0:d3e390d62607 224 }
danaeb 0:d3e390d62607 225 #if 0
danaeb 0:d3e390d62607 226 u16 data = ((u16*)command_data)[0];
danaeb 0:d3e390d62607 227
danaeb 0:d3e390d62607 228 bool is_sensor_enable;
danaeb 0:d3e390d62607 229
danaeb 0:d3e390d62607 230 is_sensor_enable = ((data & 0x0001) > 0);
danaeb 0:d3e390d62607 231 _sensor_configure(SENSOR_ID_TENSIOMETER_1, is_sensor_enable);
danaeb 0:d3e390d62607 232
danaeb 0:d3e390d62607 233 is_sensor_enable = ((data & 0x0002) > 0);
danaeb 0:d3e390d62607 234 _sensor_configure(SENSOR_ID_TENSIOMETER_2, is_sensor_enable);
danaeb 0:d3e390d62607 235
danaeb 0:d3e390d62607 236 is_sensor_enable = ((data & 0x0004) > 0);
danaeb 0:d3e390d62607 237 _sensor_configure(SENSOR_ID_TENSIOMETER_3, is_sensor_enable);
danaeb 0:d3e390d62607 238
danaeb 0:d3e390d62607 239 is_sensor_enable = ((data & 0x0008) > 0);
danaeb 0:d3e390d62607 240 _sensor_configure(SENSOR_ID_PRESSURE_1, is_sensor_enable);
danaeb 0:d3e390d62607 241
danaeb 0:d3e390d62607 242 is_sensor_enable = ((data & 0x0010) > 0);
danaeb 0:d3e390d62607 243 _sensor_configure(SENSOR_ID_PRESSURE_2, is_sensor_enable);
danaeb 0:d3e390d62607 244
danaeb 0:d3e390d62607 245 is_sensor_enable = ((data & 0x0020) > 0);
danaeb 0:d3e390d62607 246 _sensor_configure(SENSOR_ID_PRESSURE_3, is_sensor_enable);
danaeb 0:d3e390d62607 247
danaeb 0:d3e390d62607 248 is_sensor_enable = ((data & 0x0040) > 0);
danaeb 0:d3e390d62607 249 _sensor_configure(SENSOR_ID_PRESSURE_PIPE, is_sensor_enable);
danaeb 0:d3e390d62607 250
danaeb 0:d3e390d62607 251 is_sensor_enable = ((data & 0x0080) > 0);
danaeb 0:d3e390d62607 252 _sensor_configure(SENSOR_ID_IMPULSE, is_sensor_enable);
danaeb 0:d3e390d62607 253
danaeb 0:d3e390d62607 254 is_sensor_enable = ((data & 0x0100) > 0);
danaeb 0:d3e390d62607 255 _sensor_configure(SENSOR_ID_SOIL_TEMPERATURE, is_sensor_enable);
danaeb 0:d3e390d62607 256
danaeb 0:d3e390d62607 257 is_sensor_enable = ((data & 0x0200) > 0);
danaeb 0:d3e390d62607 258 _sensor_configure(SENSOR_ID_BOARD_HUMIDITY, is_sensor_enable);
danaeb 0:d3e390d62607 259
danaeb 0:d3e390d62607 260 is_sensor_enable = ((data & 0x0400) > 0);
danaeb 0:d3e390d62607 261 _sensor_configure(SENSOR_ID_BOARD_TEMPERATURE, is_sensor_enable);
danaeb 0:d3e390d62607 262
danaeb 0:d3e390d62607 263 is_sensor_enable = ((data & 0x0800) > 0);
danaeb 0:d3e390d62607 264 _sensor_configure(SENSOR_ID_BAT, is_sensor_enable);
danaeb 0:d3e390d62607 265
danaeb 0:d3e390d62607 266 u8 redundancy = ((data & 0xF000) >> 12)+1;
danaeb 0:d3e390d62607 267 AppMain::set_history_size(redundancy);
danaeb 0:d3e390d62607 268
danaeb 0:d3e390d62607 269 #endif
danaeb 0:d3e390d62607 270
danaeb 0:d3e390d62607 271 ret = 2;
danaeb 0:d3e390d62607 272 return ret;
danaeb 0:d3e390d62607 273 }
danaeb 0:d3e390d62607 274
danaeb 0:d3e390d62607 275 void AppCommand::_sensor_configure(u8 sensor_id, bool on_off){
danaeb 0:d3e390d62607 276 if(on_off){
danaeb 0:d3e390d62607 277 tr_debug(" \tenable sensor %d", sensor_id);
danaeb 0:d3e390d62607 278 _sensor_manager->enable_sensor(sensor_id);
danaeb 0:d3e390d62607 279 }
danaeb 0:d3e390d62607 280 else{
danaeb 0:d3e390d62607 281 tr_debug(" \tdisable sensor %d", sensor_id);
danaeb 0:d3e390d62607 282 _sensor_manager->disable_sensor(sensor_id);
danaeb 0:d3e390d62607 283 }
danaeb 0:d3e390d62607 284 }
danaeb 0:d3e390d62607 285