void initialize() { counter_a = 0; counter_b = 0; configure_ports(); configure_timers(); init_step_motor(); init_servodrive(); init_proxi_switch(); init_delays(); sei(); while(INIT_TIME--) { buzzer(440, 100); delay_s(1); } }
app_t configure(const config_t conf, app_t app){ app_t a = app; a->conf = conf; hardware_t hw = get_hardware(HW_TYPE); hw->status = hw->configure(conf); int di = get_sequence_entry(CONFIG_DI, conf)->size / BYTESIZE + 1; int dq = get_sequence_entry(CONFIG_DQ, conf)->size / BYTESIZE + 1; int ai = get_sequence_entry(CONFIG_AI, conf)->size; int aq = get_sequence_entry(CONFIG_AQ, conf)->size; int nt = get_sequence_entry(CONFIG_TIMER, conf)->size; int ns = get_sequence_entry(CONFIG_PULSE, conf)->size; int nm = get_sequence_entry(CONFIG_MREG, conf)->size; int nr = get_sequence_entry(CONFIG_MVAR, conf)->size; int step = get_numeric_entry(CONFIG_STEP, conf); plc_t p = new_plc(di, dq, ai, aq, nt, ns, nm, nr, step, hw); p->status = 0; p->update = TRUE; p = configure_di(conf, p); p = configure_dq(conf, p); p = configure_ai(conf, p); p = configure_aq(conf, p); p = configure_counters(conf, p); p = configure_reals(conf, p); p = configure_timers(conf, p); p = configure_pulses(conf, p); if(a->plc != NULL){ clear_plc(a->plc); } a->plc = p; return a; }
app_t apply_command(const config_t com, app_t a){ char * confstr = "config.yml"; char * cvalue = NULL; char * val = NULL; sequence_t seq = NULL; int s = CONFIG_PROGRAM; int v = -1; plc_t p = NULL; if(a != NULL){ switch(get_numeric_entry(CLI_COM, com)){ case COM_START: a->plc = plc_start(a->plc); break; case COM_STOP: a->plc = plc_stop(a->plc); break; case COM_LOAD: a->plc = plc_stop(a->plc); a->conf = init_config(); cvalue = get_string_entry(CLI_ARG, com); if( cvalue == NULL || cvalue[0] == 0){ cvalue = confstr; } if ((load_config_yml(cvalue, a->conf))->err < PLC_OK) { plc_log("Invalid configuration file %s\n", cvalue); } else { a = configure(a->conf, a); } break; case COM_SAVE: a->plc = plc_stop(a->plc); cvalue = get_string_entry(CLI_ARG, com); if( cvalue == NULL || cvalue[0] == 0){ cvalue = confstr; } if ((save_config_yml(cvalue, a->conf)) < PLC_OK) { plc_log("Invalid configuration file %s\n", cvalue); } break; case COM_FORCE: for(s = CONFIG_PROGRAM; s < N_CONFIG_VARIABLES; s++){ seq = get_sequence_entry(s, com); for(v = 0; seq && v < seq->size; v++){ //filter sequences who have a param "FORCE" val = get_param_val("FORCE", seq->vars[v].params); if(val){ //apply force p = force(a->plc, Lookup[s], v, val); if(p){ a->plc = p; } } } } if(p == NULL){ plc_log("Invalid force command\n"); } break; case COM_UNFORCE: for(s = CONFIG_PROGRAM; s < N_CONFIG_VARIABLES; s++){ seq = get_sequence_entry(s, com); for(v = 0; seq && v < seq->size; v++){ //filter sequences who have a param "FORCE" val = get_param_val("FORCE", seq->vars[v].params); if(val){ //apply force p = unforce(a->plc, Lookup[s], v); if(p){ a->plc = p; } } } } if(p == NULL){ plc_log("Invalid force command\n"); } break; case COM_EDIT: //TODO: filter sequences who have an updated variable a->plc = configure_di(com, a->plc); a->plc = configure_dq(com, a->plc); a->plc = configure_ai(com, a->plc); a->plc = configure_aq(com, a->plc); a->plc = configure_counters(com, a->plc); a->plc = configure_reals(com, a->plc); a->plc = configure_timers(com, a->plc); a->plc = configure_pulses(com, a->plc); a->conf = copy_sequences(com, a->conf); break; default: break; } } return a; }