📄 driver.c
字号:
handle->owner = pg_event_running;
handle->iam = enum_iam_right; //我是左手接口句柄
if(pg_event_running->held_device == NULL) //事件还没有打开过设备
{
handle->next = handle; //句柄指针自成双向循环链表
handle->previous = handle;
pg_event_running->held_device = handle; //事件指针指向设备链表
}else //事件已经有打开的设备
{
//以下把新设备插入到事件打开的设备队列头部
handle->next = pg_event_running->held_device;
handle->previous = pg_event_running->held_device->previous;
pg_event_running->held_device->previous->next = handle;
pg_event_running->held_device->previous = handle;
}
result = handle;
}else
{
semp_post(pan->right_semp);
result = NULL;
}
end_of_dev_open_right_scion:
mutex_post(&tg_dev_mutex);
return result;
}
//----快速打开设备右手接口-----------------------------------------------------
//功能: 按快速打开设备右手接口,只适用于曾经打开且一直没有被删除的设备,因为不用
// 按设备名查找设备,速度很快
//参数: handle,待打开的设备句柄,实际上存的是泛设备指针,
// timeout,超时设置,单位是毫秒,cn_timeout_forever=无限等待,0则立即按
// 超时返回。非0值将被向上调整为cn_tick_ms的整数倍
//返回: 成功打开设备则返回true,否则返回flase.
//备注: 如果有多个用户共享本设备,为了充分共享,每次使用完毕后应该关闭设备,当需要
// 再次用同一句柄打开时,可以使用本函数.
//-----------------------------------------------------------------------------
bool_t dev_open_right_again(struct dev_handle *handle,uint32_t timeout)
{
struct pan_device *pan;
bool_t result;
if (handle == NULL) //句柄空
return false;
if( ! mutex_pend(&tg_dev_mutex,timeout)) //这是保护设备树的互斥量
return false;
pan = (struct pan_device *)handle; //句柄里存的实际是泛设备指针
if(semp_pend(pan->right_semp,timeout)==false)//获取信号量
{
result = false;
goto end_of_dev_open_right_again;
}
handle = mb_malloc(pg_device_handle_pool,0); //分配泛设备句柄控制块
if(handle == NULL)
{//分配不成功
handle = pan; //恢复句柄指针
result = false;
}else
{
handle->dev_interfase = pan;
handle->owner = pg_event_running;
handle->iam = enum_iam_right; //我是右手接口句柄
if(pg_event_running->held_device == NULL) //事件还没有打开过设备
{
handle->next = handle;
handle->previous = handle;
pg_event_running->held_device = handle;
}else //事件已经有打开的设备
{
//以下把新设备插入到事件打开的设备队列头部
handle->next = pg_event_running->held_device;
handle->previous = pg_event_running->held_device->previous;
pg_event_running->held_device->previous->next = handle;
pg_event_running->held_device->previous = handle;
}
result = true;
}
end_of_dev_open_right_again:
mutex_post(&tg_dev_mutex);
return result;
}
//----关闭设备左手接口---------------------------------------------------------
//功能: 关闭设备左手接口,执行如下操作:
// 1.把设备的用户数减1,
// 2.从事件的held_device队列中删除泛设备句柄
// 3.释放句柄
// 4.句柄指针指向原打开设备的泛设备控制块,以备快速打开
//参数: handle,被关闭的设备句柄
//返回: 成功关闭返回被关闭设备的设备控制块地址,否则返回NULL
//-----------------------------------------------------------------------------
struct dev_handle * dev_close_left(struct dev_handle *handle)
{
struct pan_device *pan;
struct dev_handle *next;
if (handle == NULL)
return NULL;
if(handle->iam != enum_iam_left)
return NULL;
mutex_pend(&tg_dev_mutex,cn_timeout_forever);
pan = handle->dev_interfase;
if(handle->previous == handle)
{//事件的held_device队列中只有一个设备
handle->owner->held_device = NULL;
}else
{//held_device队列中有多个设备,把本设备从队列中取出.
handle->next->previous = handle->previous;
handle->previous->next = handle->next;
if(handle->owner->held_device == handle)
handle->owner->held_device = handle->next;
}
mutex_post(&tg_dev_mutex);
mb_free(pg_device_handle_pool,handle); //释放内存
semp_post(pan->left_semp);
//返回原打开设备的泛设备控制块,以备快速打开
return (struct dev_handle *)pan;
}
//----关闭设备右手接口---------------------------------------------------------
//功能: 关闭设备右手接口,执行如下操作:
// 1.把设备的用户数减1,
// 2.从事件的held_device队列中删除泛设备句柄
// 3.释放句柄
// 4.句柄指针指向原打开设备的泛设备控制块,以备快速打开
//参数: handle,被关闭的设备句柄
//返回: 成功关闭返回被关闭设备的设备控制块地址,否则返回NULL
//-----------------------------------------------------------------------------
struct dev_handle *dev_close_right(struct dev_handle *handle)
{
struct pan_device *pan;
if (handle == NULL)
return NULL;
if(handle->iam != enum_iam_right)
return NULL;
mutex_pend(&tg_dev_mutex,cn_timeout_forever);
pan = handle->dev_interfase;
if(handle->previous == handle)
{
handle->owner->held_device = NULL;
}else
{
handle->next->previous = handle->previous;
handle->previous->next = handle->next;
if(handle->owner->held_device == handle)
handle->owner->held_device = handle->next;
}
mutex_post(&tg_dev_mutex);
mb_free(pg_device_handle_pool,handle);
semp_post(pan->left_semp);
//返回原打开设备的泛设备控制块,以备快速打开
return (struct dev_handle *)pan;
}
//----读设备函数---------------------------------------------------------------
//功能: 调用设备的读函数读取数据.
//参数: handle,设备句柄
// 其他参数:由设备开发者定义
//返回: 由设备开发者定义,推荐是实际读取的数据长度.
//-----------------------------------------------------------------------------
ptu32_t dev_read(struct dev_handle *handle,ptu32_t src_buf,
ptu32_t des_buf,ptu32_t len)
{
if (handle == NULL)
return 0;
if(handle->iam == enum_iam_left)
return (handle->dev_interfase->left_hand.io_read
(handle,src_buf,des_buf,len));
else if(handle->iam == enum_iam_right)
return (handle->dev_interfase->right_hand.io_read
(handle,src_buf,des_buf,len));
return 0;
}
//----写设备函数---------------------------------------------------------------
//功能: 调用设备的写函数写入数据.
//参数: handle,设备句柄
// 其他参数:由设备开发者定义
//返回: 由设备开发者定义,推荐是实际写入的数据长度.
//-----------------------------------------------------------------------------
ptu32_t dev_write(struct dev_handle *handle,ptu32_t src_buf,
ptu32_t des_buf,ptu32_t len)
{
if (handle == NULL)
return 0;
if(handle->iam == enum_iam_left)
return (handle->dev_interfase->left_hand.io_write
(handle,src_buf,des_buf,len));
else if(handle->iam == enum_iam_right)
return (handle->dev_interfase->right_hand.io_write
(handle,src_buf,des_buf,len));
return 0;
}
//----控制设备函数-------------------------------------------------------------
//功能: 调用设备的控制函数.
//参数: handle,设备句柄
// 其他参数:由设备开发者定义
//返回: 由设备开发者定义
//-----------------------------------------------------------------------------
ptu32_t dev_ctrl(struct dev_handle *handle,uint32_t cmd,
ptu32_t data1,ptu32_t data2)
{
if (handle == NULL)
return 0;
if(handle->iam == enum_iam_left)
return (handle->dev_interfase->left_hand.io_ctrl
(handle,cmd,data1,data2));
else if(handle->iam == enum_iam_right)
return (handle->dev_interfase->right_hand.io_ctrl
(handle,cmd,data1,data2));
return 0;
}
//----清理设备-----------------------------------------------------------------
//功能: 关闭一个设备队列中的所有设备,本函数用于事件完成后清理泄漏的资源,如果
// 一个事件线程打开设备没有关闭,直接结束可能引起资源泄漏,本函数由
// y_event_done函数调用
//参数: handle,设备队列指针,双向循环链表
//返回: 无
//-----------------------------------------------------------------------------
void dev_cleanup(struct event_script *event)
{
if(event == NULL)
return;
while(event->held_device != NULL)
{
if(event->held_device->iam == enum_iam_left)
dev_close_left(event->held_device);
else
dev_close_right(event->held_device);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -