/**
|
* @file Ems_object.c
|
* @author your name (you@domain.com)
|
* @brief
|
* @version 0.1
|
* @date 2023-04-05
|
*
|
* @copyright Copyright (c) 2023
|
*
|
*/
|
|
/* includes ----------------------------------------------------------------- */
|
#include <string.h>
|
#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;
|
}
|