/** * @file Ems_object.c * @author your name (you@domain.com) * @brief * @version 0.1 * @date 2023-04-05 * * @copyright Copyright (c) 2023 * */ /* includes ----------------------------------------------------------------- */ #include #include "ems_object.h" #include "ems_assert.h" /* private variables -------------------------------------------------------- */ static ems_object_t *ems_list = NULL; /* public functions --------------------------------------------------------- */ /** * @brief * * @param me * @param name * @param ops * @param attr */ void ems_register(ems_object_t *const me, const char *name, const ems_ops_t *ops, ems_obj_attr_t *attr) { ems_assert(me != NULL); ems_assert(name != NULL); ems_assert(ops != NULL); ems_assert(attr != NULL); me->name = name; me->ops = ops; me->next = ems_list; ems_list = me; memcpy(&me->attr, attr, sizeof(ems_obj_attr_t)); } /** * @brief * * @param name * @return ems_object_t* */ ems_object_t *ems_find(const char *name) { ems_assert(name != NULL); ems_object_t *obj = ems_list; while (obj != NULL) { if (strcmp(obj->name, name) == 0) { break; } obj = obj->next; } return obj; } /** * @brief * * @param me * @return ems_err_t */ ems_err_t ems_open(ems_object_t *const me) { ems_assert(me->ops->open != NULL); ems_err_t ret = EMS_OK; if (me->attr.standlone) { if (me->count_open != 0) { ret = EMS_ERROR; goto exit; } } ret = me->ops->open(me); if (ret == EMS_OK) { me->count_open++; } exit: return ret; } /** * @brief * * @param me * @return ems_err_t */ ems_err_t ems_close(ems_object_t *const me) { ems_assert(me->ops->close != NULL); ems_err_t ret = EMS_OK; if (me->count_open > 0) { ret = me->ops->close(me); if (ret == EMS_OK) { me->count_open--; goto exit; } } else { ret = EMS_ERROR; } exit: return ret; } /** * @brief * * @param me * @param buffer * @param size * @return int32_t */ int32_t ems_read(ems_object_t *const me, void *buffer, uint32_t size) { ems_assert(me != NULL); ems_assert(buffer != NULL); ems_assert(size != 0); ems_assert(me->ops->read != NULL); int32_t ret = 0; if (me->count_open != 0) { ret = me->ops->read(me, buffer, size); } else { ret = (int32_t)EMS_ERROR; } return ret; } /** * @brief * * @param me * @param buffer * @param size * @return int32_t */ int32_t ems_write(ems_object_t *const me, const void *buffer, uint32_t size) { ems_assert(me != NULL); ems_assert(buffer != NULL); ems_assert(size != 0); ems_assert(me->ops->write != NULL); int32_t ret = 0; if (me->count_open != 0) { ret = me->ops->write(me, buffer, size); } else { ret = (int32_t)EMS_ERROR; } return ret; }