/** * Load all metaobjects from the SD card. * @return 0 if success or -1 if failure */ int32_t UAVObjLoadMetaobjects() { ObjectList *objEntry; // Get lock xSemaphoreTakeRecursive(mutex, portMAX_DELAY); // Load all settings objects LL_FOREACH(objList, objEntry) { // Check if this is a settings object if (objEntry->isMetaobject) { // Load object if (UAVObjLoad((UAVObjHandle) objEntry, 0) == -1) { xSemaphoreGiveRecursive(mutex); return -1; } } } // Done xSemaphoreGiveRecursive(mutex); return 0; }
/** * Function called in response to object updates */ static void objectUpdatedCb(UAVObjEvent * ev) { ObjectPersistenceData objper; UAVObjHandle obj; // If the object updated was the ObjectPersistence execute requested action if (ev->obj == ObjectPersistenceHandle()) { // Get object data ObjectPersistenceGet(&objper); int retval = -1; // Execute action if (objper.Operation == OBJECTPERSISTENCE_OPERATION_LOAD) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Load selected instance retval = UAVObjLoad(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_SAVE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Save selected instance retval = UAVObjSave(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_DELETE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Delete selected instance retval = UAVObjDelete(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteMetaobjects(); } } if(retval == 0) { objper.Operation = OBJECTPERSISTENCE_OPERATION_COMPLETED; ObjectPersistenceSet(&objper); } } }
/** * Function called in response to object updates */ static void objectUpdatedCb(UAVObjEvent * ev) { ObjectPersistenceData objper; UAVObjHandle obj; // // DEBUG // if (ev->obj == SystemAlarmsHandle()) { // SystemAlarmsData alarm; // SystemAlarmsGet(&alarm); // PIOS_COM_SendFormattedString(PIOS_COM_DEBUG, "ALARM: %d\r\n", alarm.Alarm); // } // If the object updated was the ObjectPersistence execute requested action if (ev->obj == ObjectPersistenceHandle()) { // Get object data ObjectPersistenceGet(&objper); int retval = -1; // Execute action if (objper.Operation == OBJECTPERSISTENCE_OPERATION_LOAD) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Load selected instance retval = UAVObjLoad(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_SAVE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Save selected instance retval = UAVObjSave(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_DELETE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Delete selected instance retval = UAVObjDelete(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_FULLERASE) { retval = -1; #if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS) retval = PIOS_FLASHFS_Format(); #endif } if(retval == 0) { objper.Operation = OBJECTPERSISTENCE_OPERATION_COMPLETED; ObjectPersistenceSet(&objper); } } }
/** * Register and new object in the object manager. * \param[in] id Unique object ID * \param[in] name Object name * \param[in] nameName Metaobject name * \param[in] isMetaobject Is this a metaobject (1:true, 0:false) * \param[in] isSingleInstance Is this a single instance or multi-instance object * \param[in] isSettings Is this a settings object * \param[in] numBytes Number of bytes of object data (for one instance) * \param[in] initCb Default field and metadata initialization function * \return Object handle, or NULL if failure. * \return */ UAVObjHandle UAVObjRegister(uint32_t id, const char *name, const char *metaName, int32_t isMetaobject, int32_t isSingleInstance, int32_t isSettings, uint32_t numBytes, UAVObjInitializeCallback initCb) { ObjectList *objEntry; ObjectInstList *instEntry; ObjectList *metaObj; // Get lock xSemaphoreTakeRecursive(mutex, portMAX_DELAY); // Check that the object is not already registered LL_FOREACH(objList, objEntry) { if (objEntry->id == id) { // Already registered, ignore xSemaphoreGiveRecursive(mutex); return NULL; } } // Create and append entry objEntry = (ObjectList *) pvPortMalloc(sizeof(ObjectList)); if (objEntry == NULL) { xSemaphoreGiveRecursive(mutex); return NULL; } objEntry->id = id; objEntry->name = name; objEntry->isMetaobject = (int8_t) isMetaobject; objEntry->isSingleInstance = (int8_t) isSingleInstance; objEntry->isSettings = (int8_t) isSettings; objEntry->numBytes = numBytes; objEntry->events = NULL; objEntry->numInstances = 0; objEntry->instances.data = NULL; objEntry->instances.instId = 0xFFFF; objEntry->instances.next = NULL; objEntry->linkedObj = NULL; // will be set later LL_APPEND(objList, objEntry); // Create instance zero instEntry = createInstance(objEntry, 0); if (instEntry == NULL) { xSemaphoreGiveRecursive(mutex); return NULL; } // Create metaobject and update linkedObj if (isMetaobject) { objEntry->linkedObj = NULL; // will be set later } else { // Create metaobject metaObj = (ObjectList *) UAVObjRegister(id + 1, metaName, NULL, 1, 1, 0, sizeof (UAVObjMetadata), NULL); // Link two objects objEntry->linkedObj = metaObj; metaObj->linkedObj = objEntry; } // Initialize object fields and metadata to default values if (initCb != NULL) { initCb((UAVObjHandle) objEntry, 0); } // Attempt to load object's metadata from the SD card (not done directly on the metaobject, but through the object) if (!objEntry->isMetaobject) { UAVObjLoad((UAVObjHandle) objEntry->linkedObj, 0); } // If this is a settings object, attempt to load from SD card if (objEntry->isSettings) { UAVObjLoad((UAVObjHandle) objEntry, 0); } // Release lock xSemaphoreGiveRecursive(mutex); return (UAVObjHandle) objEntry; }
/** * Function called in response to object updates */ static void objectUpdatedCb(UAVObjEvent * ev) { ObjectPersistenceData objper; UAVObjHandle obj; // If the object updated was the ObjectPersistence execute requested action if (ev->obj == ObjectPersistenceHandle()) { // Get object data ObjectPersistenceGet(&objper); int retval = 1; // When this is called because of this method don't do anything if (objper.Operation == OBJECTPERSISTENCE_OPERATION_ERROR || objper.Operation == OBJECTPERSISTENCE_OPERATION_COMPLETED) { return; } if (objper.Operation == OBJECTPERSISTENCE_OPERATION_LOAD) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Load selected instance retval = UAVObjLoad(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_SAVE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Save selected instance retval = UAVObjSave(obj, objper.InstanceID); // Not sure why this is needed PIOS_Thread_Sleep(10); // Verify saving worked if (retval == 0) retval = UAVObjLoad(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_DELETE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Delete selected instance retval = UAVObjDeleteById(objper.ObjectID, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_FULLERASE) { retval = -1; #if defined(PIOS_INCLUDE_LOGFS_SETTINGS) extern uintptr_t pios_uavo_settings_fs_id; retval = PIOS_FLASHFS_Format(pios_uavo_settings_fs_id); #endif } switch(retval) { case 0: objper.Operation = OBJECTPERSISTENCE_OPERATION_COMPLETED; ObjectPersistenceSet(&objper); break; case -1: objper.Operation = OBJECTPERSISTENCE_OPERATION_ERROR; ObjectPersistenceSet(&objper); break; default: break; } } }
/** * Function called in response to object updates */ static void objectUpdatedCb(UAVObjEvent * ev) { ObjectPersistenceData objper; UAVObjHandle obj; // If the object updated was the ObjectPersistence execute requested action if (ev->obj == ObjectPersistenceHandle()) { // Get object data ObjectPersistenceGet(&objper); int retval = 1; // Execute action if (objper.Operation == OBJECTPERSISTENCE_OPERATION_LOAD) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Load selected instance retval = UAVObjLoad(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_SAVE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Save selected instance retval = UAVObjSave(obj, objper.InstanceID); // Not sure why this is needed vTaskDelay(10); // Verify saving worked if (retval == 0) retval = UAVObjLoad(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_DELETE) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { // Get selected object obj = UAVObjGetByID(objper.ObjectID); if (obj == 0) { return; } // Delete selected instance retval = UAVObjDelete(obj, objper.InstanceID); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteMetaobjects(); } } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_FULLERASE) { retval = -1; #if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS) retval = PIOS_FLASHFS_Format(); #elif defined(PIOS_INCLUDE_FLASH_COMPACT_SETTINGS) retval = PIOS_FLASHFS_Compact_Format(); #endif } switch(retval) { case 0: objper.Operation = OBJECTPERSISTENCE_OPERATION_COMPLETED; ObjectPersistenceSet(&objper); break; case -1: objper.Operation = OBJECTPERSISTENCE_OPERATION_ERROR; ObjectPersistenceSet(&objper); break; default: break; } } }
int32_t readParametersFromStorage() { UAVObjHandle handle = ActuatorSettingsHandle(); return UAVObjLoad(handle, 0); }