机顶盒装linux教程,一种Linux机顶盒焦点控制方法与流程

a312318c7b315551dd879645ede98c9f.gif

本发明涉及数字电视机顶盒技术领域,具体涉及一种Linux机顶盒焦点控制方法。

背景技术:

在个人电脑上浏览页面时,一般直接用鼠标点击想要查看到的页面链接,浏览器即可跳转到链接所指向的页面。但在数字电视交互应用中,是以机顶盒为载体,向用户呈现业务,由于没有鼠标,只有遥控器,所以在数字电视机顶盒环境中进行焦点切换的工作只能依靠遥控器来完成。因此,焦点控制对用户体验有着较大的影响。

传统上在进入数字电视业务页面后,按照机顶盒默认的焦点,机顶盒会选中具有超链接属性的区域,且在光标移动时,选中的位置与具有超链接属性区域的位置及大小有关,默认找距离最近的超链接,不具备规律性,这归源于机顶盒自身属性,是无法改变控制的,如果以默认的焦点具备规律性,那么必须对业务的终端的设计进行非常规范的排版,但在一些业务中对光标的位置选择有业务自身的逻辑需求,且每个业务的特性以及对用户的UI(User Interface)、UE(User Experience)的体验又要求终端设计是灵活多变的,开发人员需要对具有超链接属性区域的位置及大小进行调试,且不同的机顶盒会存在一定差异,不同的机顶盒会进行不同的调试,这在一定程度上给开发人员造成困难,耗时耗力、带来极大不便,摒弃机顶盒默认焦点属性,使光标精准地按自身业务逻辑移动,成为机顶盒业务开发领域的一大难题。

技术实现要素:

本发明的目的在于提供一种Linux机顶盒焦点控制方法,用以解决现有Linux机顶盒超链接默认焦点不受控制,不同机顶盒焦点逻辑不同,用户体验差等问题。使光标精准地按自身业务逻辑移动,灵活控制焦点的选中。

为实现上述目的,本发明提供了一种Linux机顶盒焦点控制方法,通过拦截机顶盒键值,使用JS(Java Script)控制焦点逻辑。具体地,该方法包括如下步骤:

步骤S11.机顶盒接收到遥控器发出的红外线信号;

步骤S12.所述机顶盒将接收到的所述红外线信号转换成十进制的值并被所述机顶盒的当前业务界面拦截;

步骤S13.所述当机顶盒根据拦截到的所述十进制的值判断遥控器按下的是哪个键;

步骤S14.所述机顶盒控制所述当前业务界面按照所述按下的键值执行焦点移动逻辑或触发与所述键值对应的运行方法。

进一步地,所述步骤S13中的遥控器键包括上下左右四个方向键、确认键和返回键。

进一步地,所述步骤S14中的所述运行方法为确定或返回。

进一步地,所述步骤S14中焦点移动逻辑采用假焦点移动形式,通过对所述业务界面中需要选择的区域进行编码获得标识码,并所述标识码放在同一数组中,根据所述数组下标获取标识码来改变所属区域样式。

进一步地,所述业务界面可根据功能位置不同划分为不同模块,所述每一个模块包含若干区域,所述每一个模块用一个数组表示。

进一步地,所述假焦点移动形式中焦点移动逻辑判断获取方法如下:

所述机顶盒开发人员根据特定业务逻辑要求和用户需求,对所述业务界面进行调试得到所述焦点移动对应逻辑判断。

进一步地,所述假焦点移动形式逻辑判断调试方法步骤如下:

步骤S21.对需要选择的区域进行有序编码,获得所述选择区域的标识码,并将所述标识码放在同一数组中;

步骤S22.初次访问机顶盒业务时,默认从数组下标为0的位置取所述标识码,改变所述标识码所属区域的样式,此区域变为焦点选中状态;

步骤S23.在光标向右移动时,数组下标加1,拿到数组下标为1的标识码,同样改变该标识码所属区域的样式,此区域变为焦点选中状态,前面数组下标为0的标识码所属区域的样式则变为焦点离开状态;

步骤S24.在光标向左移动时,数组下标减1,判断是否存在左边区域,若存在,则把所述左边区域设置为焦点选中状态;若不存在,则保持位置为最左边,并保持当前焦点选中状态;

步骤S25.在光标上下移动时根据上下选择区域数量不同,所述数组下标加减值不同。

步骤S26.当光标从一个模块移动到另一个模块时,则直接找到该选择区域的标识码,根据所述标识码选中所属区域,把所述区域设置为焦点选中状态。

本发明方法具有如下优点:

摒弃机顶盒默认焦点属性,使光标精准地按自身业务逻辑移动,减轻了特定业务逻辑需求中开发人员对具有超链接属性区域的位置及大小进行调试的困难。焦点灵活控制,遥控器操作更加灵活多变,提升了用户焦点移动体验。可以广泛适用所有Linux机顶盒,具备通用性。

附图说明

图1是本发明实施例中的Linux机顶盒焦点控制方法流程示意图。

图2本发明实施例中的假焦点移动形式实现示意图。

具体实施方式

以下实施例用于说明本发明,但不用来限制本发明的范围。

本发明提供了一种Linux机顶盒焦点控制方法,通过拦截机顶盒键值,再使用JS(Java Script)控制焦点逻辑,该方法流程图如图1所示,具体步骤如下:

步骤S11.机顶盒接收到遥控器发出的红外线信号。

由于没有鼠标,只有遥控器,所以在数字电视机顶盒环境中进行焦点切换的工作只能依靠遥控器来完成。

步骤S12.机顶盒将接收到的红外线信号转换成十进制的值并被机顶盒当前业务界面拦截。

红外信号无法直接被JS处理,因此需要使用信号转换器将红外线信号转换为十进制值,机顶盒当前业务界面为机顶盒当前正在处理的页面,该页面显示在机顶盒控制的屏幕上,用户通过遥控器控制光标的移动对该页面上的业务进行选择。

步骤S13.所述机顶盒根据拦截到的十进制的值判断遥控器按下的是哪个键。遥控器上的按键一般包括:上下左右方向键、数字键、确认键和返回键等键。其中,方向键用于切换焦点,确定键用于点击进入焦点连接的页面,返回键用于返回上个栏目页面。对于使用Linux嵌入式浏览器来说,主要通过方向键和确认键来完成。

遥控器不同按键发出的红外信号编码不同,根据该红外信号编码转化后的十进制值可以判断出遥控器按下的是哪一个键。

步骤S14.机顶盒控制当前业务界面按照按下的键值执行焦点移动逻辑或触发与所述键值对应的运行方法。

其中,焦点移动逻辑采用假焦点移动形式,通过对需要选择的区域进行编码获得标识码,并标识码放在同一数组中,根据数组下标获取标识码来改变所属区域样式。

业务界面可根据功能位置不同划分为不同模块,每一个模块包含若干区域,每一个模块用一个数组表示。

机顶盒开发人员根据特定业务逻辑要求和用户需求,对业务界面进行调试得到焦点移动对应逻辑判断。

假焦点移动逻辑判断调试方法步骤如下:

步骤S21.对需要选择的区域进行有序编码,获得选择区域的标识码,并将标识码放在同一数组中;

步骤S22.初次访问机顶盒业务时,默认从数组下标为0的位置取标识码,改变标识码所属区域的样式,此区域变为焦点选中状态;

步骤S23.在光标向右移动时,数组下标加1,拿到数组下标为1的标识码,同样改变该标识码所属区域的样式,此区域变为焦点选中状态,前面数组下标为0的标识码所属区域的样式则变为焦点离开状态;

步骤S24.在光标向左移动时,数组下标减1,判断是否存在左边区域,若存在,则把左边区域设置为焦点选中状态;若不存在,则保持位置为最左边,并保持当前焦点选中状态;

步骤S25.在光标上下移动时根据上下选择区域数量不同,数组下标加减值不同。

步骤S26.当光标从一个模块移动到另一个模块时,则直接找到该选择区域的标识码,根据标识码选中所属区域,把该区域设置为焦点选中状态。

按普通焦点移动方式当光标在从一个模块向另外一个模块移动时则光标位置不好判断,只能依靠调试。而按假焦点移动形式的数组形式移动就能定位到具体的位置,在移动的时候通过JS直接找到该选择区域的标识码即可。

假焦点形式设计给开发人员带来极大便利,使得光标按自己的方式精准移动,省时、高效。

现有技术中焦点移动时机顶盒会默认选中具有超链接属性的区域,且在光标移动时,选中的位置与具有超链接属性区域的位置及大小有关,如果特定业务中对光标的位置选择有业务自身的逻辑需求,则开发人员需要对具有超链接属性区域的位置及大小进行调试,且不同的机顶盒会存在一定差异,不同的机顶盒会进行不同的调试。如图2所示,假设当前光标在A1位置,现在的业务逻辑需求是要光标移动到A2位置,如果依机顶盒默认属性光标右移的话,光标会移动到A3位置,但是现在的业务逻辑需求是要光标移动到A2位置,需要将A2的方形小边框向下移动到接近A3区域的位置,而A3的方形小边框也要向下移动给A2的方形小边框腾出位置,开发人员经过不断调试后,才有可能实现光标移动到A2位置,费时费力且不容易调试。而使用本实施例公开的假焦点移动形式,在设计时则只需要将A1、A2、A3三个标识码放在一个数组中,用con来表示一个数组,数组下标为0则con[0]=A1,数组下标为1则con[1]=A2,数组下标为2则con[2]=A3,当前选中区域为A1即con[0]为选中状态,当光标向右移动时,只需要将数组下标加1,con[0]变为con[1],con[1]即A2区域的样式变为选中状态,而con[0]即A1区域的样式变为离开状态,如果想让光标直接移动到A3区域,则数组下标加2即可,从而实现光标的选择性移动,在光标移动的时候不需要考虑具有超链接属性区域的位置,不需要繁琐的调试且移动精准,很大程度上节省了时间、提高开发效率。

虽然,上文中已经用一般性说明及具体实施例对本发明作了详尽的描述,但在本发明基础上,可以对之作一些修改或改进,这对本领域技术人员而言是显而易见的。因此,在不偏离本发明精神的基础上所做的这些修改或改进,均属于本发明要求保护的范围。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Linux C语言实现的DLNA服务器示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <upnp/upnp.h> #define MAX_NAME_LEN 256 #define MAX_DESC_LEN 512 #define MAX_ICON_LEN 1024 int main(int argc, char* argv[]) { int ret; char name[MAX_NAME_LEN] = "My DLNA Server"; char desc[MAX_DESC_LEN] = "A simple DLNA server"; char icon[MAX_ICON_LEN] = "http://192.168.1.100:1234/icon.png"; char *udn = "uuid:01234567-89ab-cdef-0123-456789abcdef"; int port = 1234; char media_dir[MAX_NAME_LEN] = "/media"; ret = UpnpInit(NULL, 0); if (ret != UPNP_E_SUCCESS) { fprintf(stderr, "Error: UpnpInit failed: %d\n", ret); return -1; } UpnpDevice_Handle device_handle; ret = UpnpRegisterRootDevice(desc, &device_handle, NULL); if (ret != UPNP_E_SUCCESS) { fprintf(stderr, "Error: UpnpRegisterRootDevice failed: %d\n", ret); UpnpFinish(); return -1; } char udn_str[MAX_NAME_LEN]; snprintf(udn_str, MAX_NAME_LEN, "uuid:%s", udn); char *device_type = "urn:schemas-upnp-org:device:MediaServer:1"; char *friendly_name = name; char *manufacturer = "MyCompany"; char *manufacturer_url = "http://www.mycompany.com"; char *model_name = "My DLNA Server"; char *model_number = "1.0"; char *model_url = "http://www.mycompany.com/mymodel"; char *serial_number = "1234567890"; char *presentation_url = "http://192.168.1.100:1234/"; UpnpDevice_Handle device_handle; ret = UpnpRegisterRootDevice(desc, &device_handle, NULL); if (ret != UPNP_E_SUCCESS) { fprintf(stderr, "Error: UpnpRegisterRootDevice failed: %d\n", ret); UpnpFinish(); return -1; } char *service_type = "urn:schemas-upnp-org:service:ContentDirectory:1"; char *service_id = "urn:upnp-org:serviceId:ContentDirectory"; char *service_desc = "Content Directory Service"; char *service_control_url = "/ContentDirectory/control"; char *service_event_url = "/ContentDirectory/event"; char *service_scpd_url = "/ContentDirectory/scpd.xml"; UpnpService_Handle service_handle; ret = UpnpAddService(device_handle, service_type, service_id, service_desc, service_control_url, service_event_url, service_scpd_url, &service_handle); if (ret != UPNP_E_SUCCESS) { fprintf(stderr, "Error: UpnpAddService failed: %d\n", ret); UpnpFinish(); return -1; } UpnpSetServiceDefaultRespMsgTimeout(service_handle, 30); char *var_name = "SystemUpdateID"; char *var_value = "0"; UpnpAddStateVariable(service_handle, var_name, UPNP_STATE_VAR_TYPE_UI4, UPNP_STATE_VAR_FLAG_SEND_EVENTS, var_value); var_name = "ContainerUpdateIDs"; var_value = ""; UpnpAddStateVariable(service_handle, var_name, UPNP_STATE_VAR_TYPE_STRING, UPNP_STATE_VAR_FLAG_SEND_EVENTS, var_value); var_name = "SortCapabilities"; var_value = ""; UpnpAddStateVariable(service_handle, var_name, UPNP_STATE_VAR_TYPE_STRING, UPNP_STATE_VAR_FLAG_SEND_EVENTS, var_value); var_name = "SystemUpdateID"; var_value = "0"; UpnpAddStateVariable(service_handle, var_name, UPNP_STATE_VAR_TYPE_UI4, UPNP_STATE_VAR_FLAG_SEND_EVENTS, var_value); var_name = "ContainerUpdateIDs"; var_value = ""; UpnpAddStateVariable(service_handle, var_name, UPNP_STATE_VAR_TYPE_STRING, UPNP_STATE_VAR_FLAG_SEND_EVENTS, var_value); var_name = "SortCapabilities"; var_value = ""; UpnpAddStateVariable(service_handle, var_name, UPNP_STATE_VAR_TYPE_STRING, UPNP_STATE_VAR_FLAG_SEND_EVENTS, var_value); UpnpAddAction(service_handle, "Browse", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "Search", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "GetSortCapabilities", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "GetSystemUpdateID", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "GetSearchCapabilities", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "CreateObject", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "DestroyObject", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "UpdateObject", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "ImportResource", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "ExportResource", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "StopTransferResource", NULL, NULL, NULL, NULL, NULL, NULL); UpnpAddAction(service_handle, "GetTransferProgress", NULL, NULL, NULL, NULL, NULL, NULL); char *device_desc_template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<root xmlns=\"urn:schemas-upnp-org:device-1-0\">\n" " <specVersion>\n" " <major>1</major>\n" " <minor>0</minor>\n" " </specVersion>\n" " <device>\n" " <deviceType>%s</deviceType>\n" " <friendlyName>%s</friendlyName>\n" " <manufacturer>%s</manufacturer>\n" " <manufacturerURL>%s</manufacturerURL>\n" " <modelName>%s</modelName>\n" " <modelNumber>%s</modelNumber>\n" " <modelURL>%s</modelURL>\n" " <UDN>%s</UDN>\n" " <serialNumber>%s</serialNumber>\n" " <presentationURL>%s</presentationURL>\n" " <iconList>\n" " <icon>\n" " <mimetype>image/png</mimetype>\n" " <width>120</width>\n" " <height>120</height>\n" " <depth>24</depth>\n" " <url>%s</url>\n" " </icon>\n" " </iconList>\n" " <serviceList>\n" " <service>\n" " <serviceType>%s</serviceType>\n" " <serviceId>%s</serviceId>\n" " <SCPDURL>%s</SCPDURL>\n" " <controlURL>%s</controlURL>\n" " <eventSubURL>%s</eventSubURL>\n" " </service>\n" " </serviceList>\n" " </device>\n" "</root>\n"; char device_desc[MAX_DESC_LEN]; snprintf(device_desc, MAX_DESC_LEN, device_desc_template, device_type, friendly_name, manufacturer, manufacturer_url, model_name, model_number, model_url, udn_str, serial_number, presentation_url, icon, service_type, service_id, service_scpd_url, service_control_url, service_event_url); ret = UpnpSetDeviceDescription(device_handle, device_desc); if (ret != UPNP_E_SUCCESS) { fprintf(stderr, "Error: UpnpSetDeviceDescription failed: %d\n", ret); UpnpFinish(); return -1; } UpnpSetWebServerRootDir(media_dir); printf("DLNA server started on port %d\n", port); ret = UpnpStartWebServer(port, media_dir); if (ret != UPNP_E_SUCCESS) { fprintf(stderr, "Error: UpnpStartWebServer failed: %d\n", ret); UpnpFinish(); return -1; } UpnpFinish(); return 0; } ``` 这个示例代码使用了libupnp库来实现DLNA服务器的功能。在代码中定义了DLNA服务器的名称、描述、图标、UDN、端口号和媒体文件夹路径等参数。在UpnpInit()函数中初始化了libupnp库,在UpnpRegisterRootDevice()函数中注册了根设备,并返回设备句柄。然后在UpnpAddService()函数中添加了ContentDirectory服务,设置了服务的状态变量和动作。在UpnpSetDeviceDescription()函数中设置了设备描述文件。最后在UpnpStartWebServer()函数中启动了Web服务器,开始提供媒体文件的访问服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值