ssRender插件(Plugin):动态时钟
本篇尝试用Plugin插件的提供数据特性,制作动态时钟效果,上效果:
这个例子我们用到的是数据类型的Plugin插件,为工具端提供时间的数据,根据说明文档的提示,我们需要创建“属性”,“属性”在插件被加载后会显示在ssRender Editor工具端。
1.创建属性
我们一共创建了6个“属性”,分别为小时、分钟、秒的十位和个位
SSR_PLUGIN_PROPERTY_DEF_BEGIN(UserPluginDLL)
SSR_PLUGIN_PLUGIN_PROPERTY("GROUP_NAME", "time_Hour_01", TYPE_INT, "1", 0, 2, "PROPTY_TIPS")
SSR_PLUGIN_PLUGIN_PROPERTY("GROUP_NAME", "time_Hour_02", TYPE_INT, "1", 0, 9, "PROPTY_TIPS")
SSR_PLUGIN_PLUGIN_PROPERTY("GROUP_NAME", "time_Minute_01", TYPE_INT, "1", 0, 5, "PROPTY_TIPS")
SSR_PLUGIN_PLUGIN_PROPERTY("GROUP_NAME", "time_Minute_02", TYPE_INT, "1", 0, 9, "PROPTY_TIPS")
SSR_PLUGIN_PLUGIN_PROPERTY("GROUP_NAME", "time_second_01", TYPE_INT, "1", 0, 9, "PROPTY_TIPS")
SSR_PLUGIN_PLUGIN_PROPERTY("GROUP_NAME", "time_second_02", TYPE_INT, "1", 0, 9, "PROPTY_TIPS")
//可以多次调用SSR_PLUGIN_PLUGIN_PROPERTY,创建不同的属性。
SSR_PLUGIN_PROPERTY_DEF_END()
2.创建线程
这个例子我们要用到一个知识点->建立新线程,此线程为了获取本地时间,并更新插件的“属性”数据。
定义线程处理函数Thread_fun,然后我们在createSSRObject的接口中创建线程。
void* Thread_fun(void* arg);
SSRObject* UserPluginDLL::createSSRObject()
{
#ifdef _PLUGIN_TYPE_RENDER_//该宏定义是为了区分数据类型的plugin和渲染类型的plugin
SSRObject* ssrObj = new UserPluginDLL;
ssrObj->m_ssRptr_plugin = this;
#else
SSRObject* ssrObj = new SSRObject;
ssrObj->m_ssRptr_plugin = this;
#endif
ssrObj->m_ssRtype = OBJECT_TYPE_PLUGIN;
m_ssrObject = ssrObj;
//创建获取时间的线程
pthread_create(&m_thread, NULL, Thread_fun, (void *)this);
return ssrObj;
}
//处理属性值更新的函数
void UserPluginDLL::updateData(time_st time)
{
ProptyList::iterator it = UserPluginDLL::m_listPropties.begin();
for (; it != UserPluginDLL::m_listPropties.end(); it++)
{
Property prop((*it));
if (prop.name == "time_Hour_01")
{
prop.value = to_string(time.time_hour_01);
}
else if (prop.name == "time_Hour_02")
{
prop.value = to_string(time.time_hour_02);
}
else if (prop.name == "time_Minute_01")
{
prop.value = to_string(time.time_minute_01);
}
else if (prop.name == "time_Minute_02")
{
prop.value = to_string(time.time_minute_02);
}
else if (prop.name == "time_second_01")
{
prop.value = to_string(time.time_second_01);
}
else if (prop.name == "time_second_02")
{
prop.value = to_string(time.time_second_02);
}
if (m_renderEngine) //check data diff
{
Common::printlog(LOG_LEV_ERROR, "prop.name:[%s], prop.value:[%s]\n", prop.name, prop.value);
m_renderEngine->getPropertySystem()->setPropertyValue(m_ssrObject, prop.name, prop.value);
}
}
}
//此函数为了获取系统的时间
void* Thread_fun(void* arg)
{
time_st time1;
UserPluginDLL* dataSource = (UserPluginDLL*)arg;
while (1)
{
time_t rawtime;
struct tm timeinfo;
time(&rawtime);
localtime_s(&timeinfo, &rawtime);
time1.time_hour_01 = (timeinfo.tm_hour) / 10;
time1.time_hour_02 = (timeinfo.tm_hour) % 10;
time1.time_minute_01 = (timeinfo.tm_min) / 10;
time1.time_minute_02 = (timeinfo.tm_min) % 10;
time1.time_second_01 = (timeinfo.tm_sec) / 10;
time1.time_second_02 = (timeinfo.tm_sec) % 10;
dataSource->updateData(time1);
Common::printlog(LOG_LEV_ERROR, "timeinfo.tm_hour : [%02d]\n", timeinfo.tm_hour);
Common::printlog(LOG_LEV_ERROR, "timeinfo.tm_min : [%02d]\n", timeinfo.tm_min);
Common::printlog(LOG_LEV_ERROR, "timeinfo.tm_sec : [%02d]\n", timeinfo.tm_sec);
Common::sleep(1000);
}
return 0;
}
3.编译Plugin
右键点击工程->生成或者重新生成,然后在工程的Dbug目录下可以找到对应的dll文件。
4.加载Plugin插件
打开ssRenderEditor工具,找到Resource窗口,接着找到Plugin的sheet页,点击New Plugin
找到刚才编译好的Plugin文件
5.使用Plugin插件
然后我们把加载进来的Plugin插件,拖拽到Project的Page窗口
依次创建6个text控件分别将控件的Text跟Plugin插件的6个”属性“建立绑定关系。
直接选中Plugin插件的属性,拖拽到text控件的对应编辑框中,按下ok即可。
对于text控件执行的操作有:将text的控件中Fontsize设置为150,Width和Height分别设置为100,200,xy位置按照是当的方式进行排列。
当绑定关系简历完成之后,我们会发现一个会动的时钟效果就实现了,同时也完成了一次插件和工具端的数据互动。
如果本篇文献对你产生了帮助,点个赞那!!
ssRender力争做国人自己的HMI解决方案!