типо так[+]
typedef struct
{
Einit_state curr_state;
u8 delay;
u8 retries;
func_ptr exec_func_ptr;
E_retval_from_modem flags;
Einit_state state_if_true;
Einit_state state_if_false;
}s_sim300_init;
////////////////////////////////////////////////////////////////////////////////
PGM s_sim300_init sim300_init_arr[] = {
// ID состояния должен идти в том порядке что и в Einit_state
//
// +---------- таймаут проверки, *100мс +--- какие флаги смотреть
// | +------ количество повторов | +--- если за указанное количество повторов и таймаутов так и не был
// ID состояния | | +- фунция для выполнения команды | | +-- выставлен требуемый флаг то перейти...
// | | | | | | |
//
// эта ветка по первому включению МК
{ init_set_bdr_boot, 5, 3, set_fixed_local_rate_sms, mdm_tx_ok, init_echo_off, init_turn_on_syg_rising, },
{ init_turn_off, 100, 0, cmd_power_off, mdm_tx_ok, init_next_cmd, init_turn_on_syg_rising, }, // 9 сек надо для дисконнекта от GSM-сети
{ init_turn_on_syg_rising, 25, 0, pwr_on, mdm_tx_ok, init_next_cmd, init_turn_on_syg_falling, }, // 3 сек нужно для сигнала включения
{ init_turn_on_syg_falling, 50, 0, pwr_off, mdm_tx_ok, init_next_cmd, init_set_bdr, },
{ init_set_bdr, 5,10, set_fixed_local_rate_sms, mdm_tx_ok, init_next_cmd, init_turn_off, },
// если МК только включится, а GSM уже был включен ( к примеру при отладке на столе ) то попадаем в эту ветку
{ init_echo_off, 3, 3, set_cmd_echo_mode_exec_off, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_sms_format, 3, 3, select_sms_format_write_text, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_charset, 3, 3, select_charset_write_ucs2, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_text_mode, 3, 3, set_text_mode_params_write_ucs2, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_connect_presentation, 3, 3, connected_line_id_presentation_write_on, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_dtmf_duration, 3, 3, tone_duration_write_0dot5sec, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_calling_presentation, 3, 3, calling_line_id_presentation_write_on, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_del_sms1, 3, 3, delete_sms1_str, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_del_sms2, 3, 3, delete_sms2_str, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_del_sms3, 3, 3, delete_sms3_str, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_del_sms4, 3, 3, delete_sms4_str, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_del_sms5, 3, 3, delete_sms5_str, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
{ init_finish, 3, 3, init_finish_f, mdm_tx_ok, init_next_cmd, init_prev_cmd, },
};
#define INIT_ARR_PARS (sizeof(sim300_init_arr) / sizeof(s_sim300_init))
s_sim300_init PGM *curr_init_p = &sim300_init_arr[ init_set_bdr_boot ];