#include <stdlib.h>
#include "atca_device.h"
#include "atca_config.h"
#ifndef ATCA_NO_HEAP
ATCADevice newATCADevice(ATCAIfaceCfg *cfg)
{
ATCADevice ca_dev = NULL;
ATCA_STATUS status;
if (cfg == NULL)
{
return NULL;
}
ca_dev = (ATCADevice)malloc(sizeof(*ca_dev));
if (ca_dev == NULL)
{
return NULL;
}
ca_dev->mCommands = (ATCACommand)malloc(sizeof(*(ca_dev->mCommands)));
if (ca_dev->mCommands == NULL)
{
free(ca_dev);
ca_dev = NULL;
return NULL;
}
ca_dev->mIface = (ATCAIface)malloc(sizeof(*(ca_dev->mIface)));
if (ca_dev->mIface == NULL)
{
free(ca_dev->mCommands);
free(ca_dev);
ca_dev = NULL;
return NULL;
}
status = initATCADevice(cfg, ca_dev);
if (status != ATCA_SUCCESS)
{
free(ca_dev->mIface);
free(ca_dev->mCommands);
free(ca_dev);
ca_dev = NULL;
return NULL;
}
return ca_dev;
}
void deleteATCADevice(ATCADevice *ca_dev)
{
if (ca_dev == NULL)
{
return;
}
releaseATCADevice(*ca_dev);
deleteATCACommand(&(*ca_dev)->mCommands);
if ((*ca_dev)->mIface)
{
free((*ca_dev)->mIface);
(*ca_dev)->mIface = NULL;
}
free(*ca_dev);
*ca_dev = NULL;
}
#endif
ATCA_STATUS initATCADevice(ATCAIfaceCfg *cfg, ATCADevice ca_dev)
{
ATCA_STATUS status;
if (cfg == NULL || ca_dev == NULL || ca_dev->mCommands == NULL || ca_dev->mIface == NULL)
{
return ATCA_BAD_PARAM;
}
status = initATCACommand(cfg->devtype, ca_dev->mCommands);
if (status != ATCA_SUCCESS)
{
return status;
}
status = initATCAIface(cfg, ca_dev->mIface);
if (status != ATCA_SUCCESS)
{
return status;
}
return ATCA_SUCCESS;
}
ATCACommand atGetCommands(ATCADevice dev)
{
return dev->mCommands;
}
ATCAIface atGetIFace(ATCADevice dev)
{
return dev->mIface;
}
ATCA_STATUS releaseATCADevice(ATCADevice ca_dev)
{
if (ca_dev == NULL)
{
return ATCA_BAD_PARAM;
}
return releaseATCAIface(ca_dev->mIface);
}