ssRender之插件(Plugin)篇

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解决方案!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Maven自定义插件是通过创建Plugin项目来实现的。在Maven项目中,插件被打包成jar文件,并在pom.xml中进行配置和调用。 首先,我们需要在插件项目的pom.xml中声明插件的元数据信息,包括插件的groupId、artifactId、version等。然后,在项目的src/main/java目录下创建插件的实现类,该类需要继承AbstractMojo类,并实现execute方法。在execute方法中编写插件的执行逻辑。 在定义插件时,除了实现类,还可以定义一些插件参数。这些参数可以通过插件的参数注解进行定义,并在插件实现类中获取和使用。参数注解包括@Parameter、@MojoParameter等。 在编写插件逻辑时,我们可以调用Maven提供的API来实现自定义的功能。这些API包括Project对象、MavenSession对象等,可以用于获取项目信息、执行Maven命令等。 编写插件完成后,我们需要在插件项目的pom.xml中配置maven-plugin-plugin插件来进行打包。该插件会根据插件项目中的配置信息来生成插件的描述文件。我们还可以在pom.xml中配置其他插件,用于生成插件的部署和安装文件。 最后,我们需要在使用插件的项目的pom.xml中进行插件的配置和调用。配置插件的groupId、artifactId、version等,并指定插件的执行阶段和参数等。 总的来说,Maven自定义插件是通过创建插件项目,编写插件类和配置插件的元数据信息来实现的。插件项目的打包和安装后,可以在使用插件的项目中进行配置和调用,实现自定义的功能。插件的编写和使用可以提高项目的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值