From c8a81f88a445f7386eac42e9a673fa513cb0fe34 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 12 Jan 2014 15:12:41 +0100 Subject: [PATCH] OP-1122 OP-1158 added facility to update a CRC with uavobject data (flight side) --- flight/pios/common/pios_crc.c | 22 +++++----- flight/uavobjects/inc/uavobjectmanager.h | 1 + flight/uavobjects/uavobjectmanager.c | 53 ++++++++++++++++++++---- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/flight/pios/common/pios_crc.c b/flight/pios/common/pios_crc.c index 9b2128f06..7cf8813f3 100644 --- a/flight/pios/common/pios_crc.c +++ b/flight/pios/common/pios_crc.c @@ -64,6 +64,17 @@ static const uint16_t CRC_Table16[] = { // HDLC polynomial 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; +/** + * Generated by pycrc v0.7.5, http://www.tty1.net/pycrc/ + * using the configuration: + * Width = 8 + * Poly = 0x07 + * XorIn = 0x00 + * ReflectIn = False + * XorOut = 0x00 + * ReflectOut = False + * Algorithm = table-driven + */ static const uint32_t CRC_Table32[] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, @@ -101,17 +112,6 @@ static const uint32_t CRC_Table32[] = { /** * Update the crc value with new data. - * - * Generated by pycrc v0.7.5, http://www.tty1.net/pycrc/ - * using the configuration: - * Width = 8 - * Poly = 0x07 - * XorIn = 0x00 - * ReflectIn = False - * XorOut = 0x00 - * ReflectOut = False - * Algorithm = table-driven - * * \param crc The current crc value. * \param data Pointer to a buffer of \a data_len bytes. * \param length Number of bytes in the \a data buffer. diff --git a/flight/uavobjects/inc/uavobjectmanager.h b/flight/uavobjects/inc/uavobjectmanager.h index 9da465cba..c3813ef74 100644 --- a/flight/uavobjects/inc/uavobjectmanager.h +++ b/flight/uavobjects/inc/uavobjectmanager.h @@ -160,6 +160,7 @@ bool UAVObjIsMetaobject(UAVObjHandle obj); bool UAVObjIsSettings(UAVObjHandle obj); int32_t UAVObjUnpack(UAVObjHandle obj_handle, uint16_t instId, const uint8_t *dataIn); int32_t UAVObjPack(UAVObjHandle obj_handle, uint16_t instId, uint8_t *dataOut); +uint8_t UAVObjUpdateCRC(UAVObjHandle obj_handle, uint16_t instId, uint8_t crc); int32_t UAVObjSave(UAVObjHandle obj_handle, uint16_t instId); int32_t UAVObjLoad(UAVObjHandle obj_handle, uint16_t instId); int32_t UAVObjDelete(UAVObjHandle obj_handle, uint16_t instId); diff --git a/flight/uavobjects/uavobjectmanager.c b/flight/uavobjects/uavobjectmanager.c index 2a02b3ee1..bf5d52a80 100644 --- a/flight/uavobjects/uavobjectmanager.c +++ b/flight/uavobjects/uavobjectmanager.c @@ -171,17 +171,14 @@ struct UAVOMulti { /** all information about instances are dependant on object type **/ #define ObjSingleInstanceDataOffset(obj) ((void *)(&(((struct UAVOSingle *)obj)->instance0))) #define InstanceDataOffset(inst) ((void *)&(((struct UAVOMultiInst *)inst)->instance)) -#define InstanceData(instance) (void *)instance +#define InstanceData(instance) ((void *)instance) // Private functions -static int32_t sendEvent(struct UAVOBase *obj, uint16_t instId, - UAVObjEventType event); +static int32_t sendEvent(struct UAVOBase *obj, uint16_t instId, UAVObjEventType event); static InstanceHandle createInstance(struct UAVOData *obj, uint16_t instId); static InstanceHandle getInstance(struct UAVOData *obj, uint16_t instId); -static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue, - UAVObjEventCallback cb, uint8_t eventMask); -static int32_t disconnectObj(UAVObjHandle obj_handle, xQueueHandle queue, - UAVObjEventCallback cb); +static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue, UAVObjEventCallback cb, uint8_t eventMask); +static int32_t disconnectObj(UAVObjHandle obj_handle, xQueueHandle queue, UAVObjEventCallback cb); static void instanceAutoUpdated(UAVObjHandle obj_handle, uint16_t instId); // Private variables @@ -615,8 +612,7 @@ bool UAVObjIsSettings(UAVObjHandle obj_handle) * \param[in] dataIn The byte array * \return 0 if success or -1 if failure */ -int32_t UAVObjUnpack(UAVObjHandle obj_handle, uint16_t instId, - const uint8_t *dataIn) +int32_t UAVObjUnpack(UAVObjHandle obj_handle, uint16_t instId, const uint8_t *dataIn) { PIOS_Assert(obj_handle); @@ -704,6 +700,45 @@ unlock_exit: return rc; } +/** + * Update a CRC with an object data + * \param[in] obj The object handle + * \param[in] instId The instance ID + * \param[in] crc The crc to update + * \return the updated crc + */ +uint8_t UAVObjUpdateCRC(UAVObjHandle obj_handle, uint16_t instId, uint8_t crc) +{ + PIOS_Assert(obj_handle); + + // Lock + xSemaphoreTakeRecursive(mutex, portMAX_DELAY); + + if (UAVObjIsMetaobject(obj_handle)) { + if (instId != 0) { + goto unlock_exit; + } + // TODO + } else { + struct UAVOData *obj; + InstanceHandle instEntry; + + // Cast handle to object + obj = (struct UAVOData *)obj_handle; + + // Get the instance + instEntry = getInstance(obj, instId); + if (instEntry == NULL) { + goto unlock_exit; + } + // Update crc + crc = PIOS_CRC_updateCRC(crc, (uint8_t *) InstanceData(instEntry), (int32_t) obj->instance_size); + } + +unlock_exit: + xSemaphoreGiveRecursive(mutex); + return crc; +} /** * Actually write the object's data to the logfile