From 30db3ba5f75c9d693b49347906062bcb91b4c977 Mon Sep 17 00:00:00 2001 From: Mayank Sirotiya Date: Thu, 23 Jun 2016 14:49:59 +0530 Subject: [PATCH] add library for managing flow and custom ipso objects for presence sensor Signed-off-by: Mayank Sirotiya --- Makefile.libobjects | 3 +- lwm2m-client-ipso-presence-sensor.c | 268 ++++++++++++++++++++++++++++ lwm2m-client-ipso-presence-sensor.h | 62 +++++++ 3 files changed, 332 insertions(+), 1 deletion(-) create mode 100644 lwm2m-client-ipso-presence-sensor.c create mode 100644 lwm2m-client-ipso-presence-sensor.h diff --git a/Makefile.libobjects b/Makefile.libobjects index 5e88e27..b7f7eec 100644 --- a/Makefile.libobjects +++ b/Makefile.libobjects @@ -1,2 +1,3 @@ libobjects_src = lwm2m-client-flow-object.c lwm2m-client-flow-access-object.c lwm2m-client-device-object.c \ - lwm2m-client-ipso-digital-input.c lwm2m-client-ipso-light-control.c + lwm2m-client-ipso-digital-input.c lwm2m-client-ipso-light-control.c \ + lwm2m-client-ipso-presence-sensor.c diff --git a/lwm2m-client-ipso-presence-sensor.c b/lwm2m-client-ipso-presence-sensor.c new file mode 100644 index 0000000..d35b752 --- /dev/null +++ b/lwm2m-client-ipso-presence-sensor.c @@ -0,0 +1,268 @@ +/** + * @file + * LightWeightM2M LWM2M Presence Sensor object. + * + * @author Imagination Technologies + * + * @copyright Copyright (c) 2016, Imagination Technologies Limited and/or its affiliated group + * companies and/or licensors. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions + * and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/*************************************************************************************************** + * Includes + **************************************************************************************************/ + +#include +#include +#include +#include +#include +#include "lwm2m-client-ipso-presence-sensor.h" + +/*************************************************************************************************** + * Typedefs + **************************************************************************************************/ + +typedef struct +{ + AwaBoolean State; + AwaInteger Counter; + char SensorType[128]; + AwaInteger BusyToClearDelay; + AwaInteger ClearToBusyDelay; +} IPSOPresenceSensor; + +/*************************************************************************************************** + * Globals + **************************************************************************************************/ + +static IPSOPresenceSensor presenceSensors[PRESENCE_SENSORS]; + +/*************************************************************************************************** + * Implementation + **************************************************************************************************/ + +static AwaResult PresenceSensorHandler(AwaStaticClient *client, AwaOperation operation, AwaObjectID objectID, AwaObjectInstanceID objectInstanceID, + AwaResourceID resourceID, AwaResourceInstanceID resourceInstanceID, void **dataPointer, size_t *dataSize, bool *changed) +{ + AwaResult result = AwaResult_InternalError; + if (!((objectID == IPSO_PRESENCE_OBJECT) && (objectInstanceID >= 0) && (objectInstanceID < PRESENCE_SENSORS))) + { + printf("Incorrect object data\n"); + return result; + } + + switch (operation) + { + case AwaOperation_DeleteObjectInstance: + result = AwaResult_SuccessDeleted; + memset(&presenceSensors[objectInstanceID], 0, sizeof(presenceSensors[objectInstanceID])); + break; + + case AwaOperation_CreateObjectInstance: + result = AwaResult_SuccessCreated; + memset(&presenceSensors[objectInstanceID], 0, sizeof(presenceSensors[objectInstanceID])); + break; + + case AwaOperation_CreateResource: + result = AwaResult_SuccessCreated; + break; + + case AwaOperation_Execute: + if (resourceID == IPSO_DIGITAL_INPUT_COUNTER_RESET) + { + presenceSensors[objectInstanceID].Counter = 0; + AwaStaticClient_ResourceChanged(client, IPSO_PRESENCE_OBJECT, objectInstanceID, IPSO_DIGITAL_INPUT_COUNTER); + result = AwaResult_Success; + } + else + { + printf("\n Invalid resource ID for PresenceSensor execute operation"); + result = AwaResult_InternalError; + } + break; + + case AwaOperation_Read: + result = AwaResult_SuccessContent; + switch (resourceID) + { + case IPSO_DIGITAL_INPUT_STATE: + *dataPointer = &presenceSensors[objectInstanceID].State; + *dataSize = sizeof(presenceSensors[objectInstanceID].State); + break; + + case IPSO_DIGITAL_INPUT_COUNTER: + *dataPointer = &presenceSensors[objectInstanceID].Counter; + *dataSize = sizeof(presenceSensors[objectInstanceID].Counter); + break; + + case IPSO_SENSOR_TYPE: + *dataPointer = presenceSensors[objectInstanceID].SensorType; + *dataSize = strlen(presenceSensors[objectInstanceID].SensorType); + break; + + case IPSO_BUSY_TO_CLEAR_DELAY: + *dataPointer = &presenceSensors[objectInstanceID].BusyToClearDelay; + *dataSize = sizeof(presenceSensors[objectInstanceID].BusyToClearDelay); + break; + + case IPSO_CLEAR_TO_BUSY_DELAY: + *dataPointer = &presenceSensors[objectInstanceID].ClearToBusyDelay; + *dataSize = sizeof(presenceSensors[objectInstanceID].ClearToBusyDelay); + break; + + default: + printf("\n Invalid resource ID for PresenceSensor read operation"); + result = AwaResult_InternalError; + break; + } + break; + + case AwaOperation_Write: + *changed = true; + result = AwaResult_SuccessChanged; + switch (resourceID) + { + case IPSO_DIGITAL_INPUT_STATE: + presenceSensors[objectInstanceID].State = *((AwaBoolean *)*dataPointer); + break; + + case IPSO_DIGITAL_INPUT_COUNTER: + presenceSensors[objectInstanceID].Counter = *((AwaInteger *)*dataPointer); + break; + + case IPSO_SENSOR_TYPE: + if(*dataSize < sizeof(presenceSensors[objectInstanceID].SensorType)) + { + memcpy(presenceSensors[objectInstanceID].SensorType, *dataPointer, *dataSize); + presenceSensors[objectInstanceID].SensorType[*dataSize] = '\0'; + } + else + { + result = AwaResult_BadRequest; + } + break; + + case IPSO_BUSY_TO_CLEAR_DELAY: + presenceSensors[objectInstanceID].BusyToClearDelay = *((AwaInteger *)*dataPointer); + break; + + case IPSO_CLEAR_TO_BUSY_DELAY: + presenceSensors[objectInstanceID].ClearToBusyDelay = *((AwaInteger *)*dataPointer); + break; + + default: + printf("\n Invalid resource ID for DigitalInput write operation"); + result = AwaResult_InternalError; + break; + } + break; + default: + printf("DigitalInput - unknown operation\n"); + break; + } + return result; +} + +int DefinePresenceSensorObject(AwaStaticClient *awaClient) +{ + AwaError error; + int i; + + error = AwaStaticClient_DefineObjectWithHandler(awaClient, "PresenceSensor", IPSO_PRESENCE_OBJECT, 0, PRESENCE_SENSORS, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to register flow access object\n"); + return 1; + } + + error = AwaStaticClient_DefineResourceWithHandler(awaClient, "State", IPSO_PRESENCE_OBJECT, IPSO_DIGITAL_INPUT_STATE, AwaResourceType_Boolean, 1, 1, AwaResourceOperations_ReadOnly, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to define State resource\n"); + return 1; + } + + error = AwaStaticClient_DefineResourceWithHandler(awaClient, "Counter", IPSO_PRESENCE_OBJECT, IPSO_DIGITAL_INPUT_COUNTER, AwaResourceType_Integer, 0, 1, AwaResourceOperations_ReadOnly, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to define Counter resource\n"); + return 1; + } + + error = AwaStaticClient_DefineResourceWithHandler(awaClient, "SensorType", IPSO_PRESENCE_OBJECT , IPSO_SENSOR_TYPE, AwaResourceType_String, 0, 1, AwaResourceOperations_ReadOnly, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to define SensorType resource\n"); + return 1; + } + + error = AwaStaticClient_DefineResourceWithHandler(awaClient, "BusyToClearDelay", IPSO_PRESENCE_OBJECT, IPSO_BUSY_TO_CLEAR_DELAY, AwaResourceType_Integer, 0, 1, AwaResourceOperations_ReadOnly, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to define BusyToClearDelay resource\n"); + return 1; + } + + error = AwaStaticClient_DefineResourceWithHandler(awaClient, "ClearToBusyDelay", IPSO_PRESENCE_OBJECT, IPSO_CLEAR_TO_BUSY_DELAY, AwaResourceType_Integer, 0, 1, AwaResourceOperations_ReadOnly, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to define ClearToBusyDelay resource\n"); + return 1; + } + + error = AwaStaticClient_DefineResourceWithHandler(awaClient, "CounterReset", IPSO_PRESENCE_OBJECT , IPSO_DIGITAL_INPUT_COUNTER_RESET, AwaResourceType_Opaque, 0, 1, AwaResourceOperations_Execute, PresenceSensorHandler); + if (error != AwaError_Success) + { + printf("Failed to define CounterReset resource\n"); + return 1; + } + + for (i = 0; i < PRESENCE_SENSORS; i++) + { + AwaStaticClient_CreateObjectInstance(awaClient, IPSO_PRESENCE_OBJECT, i); + AwaStaticClient_CreateResource(awaClient, IPSO_PRESENCE_OBJECT, i, IPSO_DIGITAL_INPUT_COUNTER); + } + return 0; +} + + +int PresenceSensor_IncrementCounter(AwaStaticClient *awaClient, AwaObjectInstanceID objectInstanceID) +{ + if ((awaClient != NULL) && (objectInstanceID >= 0) && (objectInstanceID < PRESENCE_SENSORS)) + { + presenceSensors[objectInstanceID].Counter += 1; + AwaStaticClient_ResourceChanged(awaClient, IPSO_PRESENCE_OBJECT, objectInstanceID, IPSO_DIGITAL_INPUT_COUNTER); + return 0; + } + else + { + printf("Invalid arguments passed to %s", __func__); + return 1; + } +} diff --git a/lwm2m-client-ipso-presence-sensor.h b/lwm2m-client-ipso-presence-sensor.h new file mode 100644 index 0000000..d32f0cc --- /dev/null +++ b/lwm2m-client-ipso-presence-sensor.h @@ -0,0 +1,62 @@ +/** + * @file + * LightWeightM2M LWM2M Presence Sensor object. + * + * @author Imagination Technologies + * + * @copyright Copyright (c) 2016, Imagination Technologies Limited and/or its affiliated group + * companies and/or licensors. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions + * and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LWM2M_CLIENT_IPSO_PRESENCE_SENSOR_H_ +#define LWM2M_CLIENT_IPSO_PRESENCE_SENSOR_H_ + +#include "awa/static.h" + +/*************************************************************************************************** + * Macros + **************************************************************************************************/ + +#define IPSO_PRESENCE_OBJECT 3302 +#define IPSO_DIGITAL_INPUT_STATE 5500 +#define IPSO_DIGITAL_INPUT_COUNTER 5501 +#define IPSO_DIGITAL_INPUT_COUNTER_RESET 5505 +#define IPSO_SENSOR_TYPE 5751 +#define IPSO_BUSY_TO_CLEAR_DELAY 5903 +#define IPSO_CLEAR_TO_BUSY_DELAY 5904 + +#define PRESENCE_SENSORS 1 + +/*************************************************************************************************** + * Functions + **************************************************************************************************/ + +int DefinePresenceSensorObject(AwaStaticClient *awaClient); +int PresenceSensor_IncrementCounter(AwaStaticClient *awaClient, AwaObjectInstanceID objectInstanceID); + +#endif /* LWM2M_CLIENT_IPSO_PRESENCE_SENSOR_H_ */