struct __gsim_struct_device__
{
char* name; //!< name of the device
TGSimDeviceCls cls; //!< default value PeriDev
TGSimDeviceId id; //!< run timer parameter Device Instance id
TGSimError (*control) (TGSimDevice* self, TGSimCtrlCmd cmd,
PVOID param); //!< used by arbitrator to get the device status
void (*create) (TGSimDevice* self); //!< create function of device
void (*destroy) (TGSimDevice* self); //!< destroy function of device
PVOID priv;
};
typedef enum
{
eDevIniting,
eDevRunning, //< Device running
eDevPending, //< Device pending
eDevExit, //< Device pending
}EDevSt;
typedef struct __struct_taskdev_priv TTaskDevData;
typedef struct __struct_arbitrator__ TArbitrator;
struct __struct_arbitrator__
{
sem_t sem; // Semaphore which used by arbitrator to synchronize tasks
EDevSt st; // Current status of the task
};
struct __struct_taskdev_priv
{
TArbitrator arbitrator;
sem_t* thread_ready;
TQueue* msgQueue;
EDevSt (*status) (TGSimDevice* self); //!< used by arbitrator to get the device status
bool (*send) (TGSimDevice* self, void* message); //!< used by Message Send to send message
void (*start) (TGSimDevice* self); //!< create function of device
void (*stop) (TGSimDevice* self); //!< destroy function of device
void (*init)(TGSimDevice* dev);
void (*body)(TGSimDevice* dev);
};
static bool __TaskDev_Init(TGSimDevice* dev, uint32_t size, TGSimCB init,
TGSimCB body)
{
static TTaskDevData taskdev_tmpl=
{
.send =__taskdev_send ,
.start =__taskdev_start ,
.stop =__taskdev_stop ,
};
dev->cls=malloc(sizeof(TTaskDevData)+size);
assert(dev->cls!=NULL);
TTaskDevData * taskdev=(TTaskDevData*)dev->cls;
*taskdev=taskdev_tmpl;
taskdev->init=init;
taskdev->body=body;
taskdev->msgQueue = Queue_Create(DEFAULT_CPU_QUEUE_MESSAGE_CAPACITY);
assert(taskdev->msgQueue!=NULL);
return true;
}