int32_t FirmwareIAPInitialize() { data.BoardType= BOARD_TYPE; read_description(data.Description); data.BoardRevision= BOARD_REVISION; data.ArmReset=0; data.crc = 0; FirmwareIAPObjSet( &data ); FirmwareIAPObjConnectCallback( &FirmwareIAPCallback ); return 0; }
static void presets_list_select_preset (GtkTreeSelection *selection, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gchar *preset_name; gchar *preset_filename; gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_OBJECT_NAME, &preset_name, -1); gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME, &preset_filename, -1); /* TODO : Maybe make the factory defaults behavior in regards * to the preset's object name and filename more robust? * */ if (strcmp (preset_filename, factory_defaults)) { gtk_entry_set_text (GTK_ENTRY (presetnameentry), preset_name); g_free (selected_preset_orig_name); g_free (selected_preset_filename); selected_preset_orig_name = g_strdup (preset_name); selected_preset_filename = g_strdup (selected_preset_filename); } read_description (preset_filename); g_free (preset_name); g_free (preset_filename); } }
static void FirmwareIAPCallback(UAVObjEvent* ev) { static uint32_t last_time = 0; uint32_t this_time; uint32_t delta; if(iap_state == IAP_STATE_RESETTING) return; if ( ev->obj == FirmwareIAPObjHandle() ) { // Get the input object data FirmwareIAPObjGet(&data); this_time = get_time(); delta = this_time - last_time; last_time = this_time; if((data.BoardType==BOARD_TYPE)&&(data.crc != iap_calc_crc())) { read_description(data.Description); data.BoardRevision=BOARD_REVISION; data.crc = iap_calc_crc(); FirmwareIAPObjSet( &data ); } if((data.ArmReset==1)&&(iap_state!=IAP_STATE_RESETTING)) { data.ArmReset=0; FirmwareIAPObjSet( &data ); } switch(iap_state) { case IAP_STATE_READY: if( data.Command == IAP_CMD_STEP_1 ) { iap_state = IAP_STATE_STEP_1; } break; case IAP_STATE_STEP_1: if( data.Command == IAP_CMD_STEP_2 ) { if( delta > iap_time_2_low_end && delta < iap_time_2_high_end ) { iap_state = IAP_STATE_STEP_2; } else { iap_state = IAP_STATE_READY; } } else { iap_state = IAP_STATE_READY; } break; case IAP_STATE_STEP_2: if( data.Command == IAP_CMD_STEP_3 ) { if( delta > iap_time_3_low_end && delta < iap_time_3_high_end ) { // we've met the three sequence of command numbers // we've met the time requirements. PIOS_IAP_SetRequest1(); PIOS_IAP_SetRequest2(); /* Note: Cant just wait timeout value, because first time is randomized */ reset_count = 0; lastResetSysTime = xTaskGetTickCount(); UAVObjEvent * ev = pvPortMalloc(sizeof(UAVObjEvent)); memset(ev,0,sizeof(UAVObjEvent)); EventPeriodicCallbackCreate(ev, resetTask, 100); iap_state = IAP_STATE_RESETTING; } else { iap_state = IAP_STATE_READY; } } else { iap_state = IAP_STATE_READY; } break; case IAP_STATE_RESETTING: // stay here permanentally, should reboot break; default: iap_state = IAP_STATE_READY; break; } } }