精华内容
下载资源
问答
  • 后台管理系统项目流程及逻辑处理(一)
    千次阅读 多人点赞
    2019-05-04 21:40:04

    项目流程图

    在这里插入图片描述

    考试管理系统流程

    技术栈 **

    Vue + element-ui

    模块设计 (四个模块)***

    设计图拿到后,我们会根据设计图进行评估分析和模块划分, 内容部分我们这里划分出五个模块

    • 试卷管理
    • 用户管理
    • 考试管理
    • 班级管理
    • 阅卷管理

    项目进展管理工具 采用 的是teambition ,这个工具可以安利一下,能高效,清晰的对我们的整个项目进行统筹处理,更适用于团队协作,很是强大

    接口处理(axios)***

    我们与后台对数据采用的 是axios

    • 在对接过程中会遇到跨域问题
    • ------开发环境下我们就用webpack 的proxy 处理,但是上线的话 webpack的处理方式显然不适用,webpack只是一个开发辅助工具,,不会被打包上线 ,解决方案是 用当前比较流行的 CORS (跨域资源共享)机制,让后台去做跨域处理,也就是加一个响应头部键名:across-control-allow-origin,值为请求资源的 域名
    • 跨域问题虽然解决了 但是与之相关其他问题也随之而来,因为across-control-allow-origin 的值只能填写一个 ,我们前台可能有多个域名进行数据请求,那么对于这个问题的处理我们的解决方案比较简单粗暴一些,就是在后台做一个简单的逻辑处理,设置一个白名单, 进行请求时后台会知道是哪个域名正在请求,然后去对照白名单, 名单上有的 才允许请求
    权限及动态路由的处理 *****
    	在 vue 的全局导航守卫进行 权限处理
    
    RBAC

    在进入一个管理系统前 一定是由一个 入口通道的,也就是我们最最常见的 登录页面, 对于后台管理来说 登录者的身份至关重要,

    我们在用户登录的权限处理方式 是 RBAC (role based access control基于角色的权限控制)下面介绍一下 权限模型

    在这里插入图片描述
    权限的解决方案很多 ,我们为什么选择RBAC呢,简单的介绍一下 RBAC 的优势
    用一张图做下ACL 与RBAC 的对比
    在这里插入图片描述
    RBAC 简化了 用户 与权限的关系,使之更易维护和拓展
    在这里插入图片描述
    上图中RBAC 不需要给每个用户分配具体视图权限 而是给分配角色,每个 角色的 视图权限固定,那么用户的视图权限就得到了,这使得给用户分配权限和回收权限更加方便

    动态路由

    我们用户在登录在登录成功的那一刻开始 ,就会得到后台返回给我们的登录态,也就是角色权限码,登录成功进入主页 的时候 我们需要知道当前是谁 登录上了,应该给当前的角色 分配什么样的视图,当然我们在进行数据请求的时候也需要知道是谁在请求,是否该角色有请求的权限等等,这是我们在处理权限这一业务时必须要考虑的事
    1. 技巧:

    • 在做业务请求时每次都带上登录态,会是请求体太过繁重,可以将登录态token这种 属于公共的非业务逻辑,可以放在axios的拦截器中区处理,这样还能保证性能的优化提高
    • 设置cookie时 用第三方包 cookiejs 将cookie 的增删改查封装好留着待用
    • 若手动修改地址栏url时 需要一个白名单 ,判断是否还是 login 或是redirect 以防出现页面重复跳转的情况 陷入死循环

    待续…

    更多相关内容
  • 参考文献:基于matlab的系统分析与设计—模糊系统 ...模糊逻辑工具箱包括五个工具:FIS编辑器、隶属度函数编辑器、规则编辑器、规则观测器和曲面观测器。 FIS编辑器: 可处理模糊系统的高层次问题,如系统中有

    参考文献:基于matlab的系统分析与设计—模糊系统
    是不是原理看了几遍,脑袋里面还是朦朦胧胧的。动手实现一下就可以更好的理解模糊逻辑!!!

    工具箱介绍

    模糊逻辑工具箱包括五个工具:FIS编辑器、隶属度函数编辑器、规则编辑器、规则观测器和曲面观测器。
    FIS编辑器: 可处理模糊系统的高层次问题,如系统中有多少个输入和输出变量。
    隶属度函数编辑器: 用来定义每个变量的隶属度函数的形状及参数。
    规则编辑器: 用来编辑FIS的规则。
    规则观测器和曲面观测器: 分别用来观察FIS的规则和输出曲面。

    %%打开方式如下
    fuzzy
    ruleedit
    mfedit
    ruleview
    surfview
    

    场景假设

    例:考虑两个输入和一个输出的侍者小费问题。当你在饭店里用餐后,会根据侍者的服务和饭店菜肴的质量付给侍者小费。如果用0-10表示饭店的服务质量,菜肴的质量也用0-10表示,那么如何给小费?这里设计一个模糊推理系统来完成,输入为服务质量和菜肴质量,输入为小费。

    分析

    根据美国人的用餐习惯,可以得到三条模糊规则:

    1. If 服务差 or 菜肴差 then 小费低;
    2. If 服务好 then 小费中等;
    3. If 服务很好 or 菜肴好 then 小费高;
      我们假定小费低为餐费的5%,小费中等为15%,小费高为25%

    FIS编辑器Fuzzy Logic Designer

    在matlab下,输入

    fuzzy
    

    本例有两个输入,因此首先的FIS编辑器界面的Edit下选择Add input,使系统变成两个输入、一个输出。
    给输入、输出变量命名
    在这里插入图片描述
    File下export中可以选择to workspace 或者 to flie
    在这里插入图片描述

    隶属度函数编辑器Membership Function Editor

    在FIS编辑器界面中双击输入或输出图标即可加入隶属度函数编辑器。
    在这里插入图片描述
    打开隶属度函数编辑器后,可在左上角选择变量,然后在Edit中选择Add MFs,可以打开i专门用于输入隶属度函数的窗口,从中输入所选变量的隶属度函数。(本例选择gaussmf和数量为3)(这里是新增隶属度函数,有的打开就存在隶属度函数,所以这步需要视情况而定)
    在这里插入图片描述
    本例第一个隶属度函数曲线参数设置如下:
    在这里插入图片描述
    第一条隶属度曲线:名称(差) Params(【1.8 0】)
    第二条隶属度曲线:名称(好) Params(【1.8 5】)
    第三条隶属度曲线:名称(很好) Params(【1.8 10】)
    同理
    给输入变量“菜肴”建立两个梯形隶属度函数(差、好),参数范围【1 10】,其参数分别为:【0 0 1 3】
    给输出变量“小费”建立三个三角形隶属度函数(低、中等、高),参数范围【0 30】,其参数分别为:【0 6 12】、【8 15 22】、【18 24 30】。
    至此已经完成了对输入输出变量的隶属度函数定义。
    在这里插入图片描述
    在这里插入图片描述

    规则编辑器

    双击FIS编辑器中间的图片即可打开规则编辑器。
    根据之前的提到的模糊规则

    1. If 服务差 or 菜肴差 then 小费低;
    2. If 服务好 then 小费中等;
    3. If 服务很好 or 菜肴好 then 小费高;
      可在规则编辑器GUI上产生这些规则;操作步骤如下
    4. 由于规则前件之间应该采用or连接,因此首先在GUI的左下角选择or连接符。
    5. 根据每条模糊规则添加对应的rule
      在这里插入图片描述
      至此建立了模糊推理系统,在FIS编辑器的File下选择Export to File,即可得到后缀为fis的模糊推理系统文件。

    规则观测器和曲面观测器

    我们可以利用规则观测器和曲面观测器来查看模糊规则推理和输出曲面。
    在FIS编辑器的View中选择View rules,可打开规则观测器
    在这里插入图片描述

    在FIS编辑器的View中选择View surface,可打开曲面观测器

    在这里插入图片描述

    模糊推理系统的使用

    %% 利用surfview命令绘制系统输出曲面
    % surfview(tip);
    %% 利用plotfis命令可绘制出所建立的FIS系统
    % plotfis(tip)
    %% 利用evalfis可计算出指定输入的输出值
    % evalfis([1.5 5],tip);
    % evalfis([8 2.5],tip);
    %% 另外可以利用evalfis函数绘制输入\输出曲线,
    %例如:若当计算当菜肴中为中等(5)时,小费与服务之间的关系,可输入
    x1=0:0.1:10;x2=5;
    y=evalfis([x1' x2*ones(size(x1'))],tip);
    figure(2)
    plot(x1',y),xlabel('服务'),ylabel('小费');
    gtext('菜肴固定为5');
    

    在这里插入图片描述

    总结

    使用matlab的模糊逻辑工具箱实现基本的模糊规则就是这么简单!!!
    开始搭建自己的模糊系统吧!!!

    展开全文
  • 因此影像后处理工具主要有两方面的要求:易用性(交互参数少)和易拓展性(加入新功能快,第三方开发容易)。所有的工具都必须要平衡这两方面上找到一个定位(下图)。 果要强调易用性,整个软件架构就要封闭一些,...

    来源:融视影像科技

    综述

    医学影像的处理有两个特质。一是复杂,整个处理流程涉及多种算法,需要调整的参数较多。二是发展快,从采集、重建到后处理,新处理方法层出不穷,每年都有新工具,每五年又有个大热点。因此影像后处理工具主要有两方面的要求:易用性(交互参数少)和易拓展性(加入新功能快,第三方开发容易)。所有的工具都必须要平衡这两方面上找到一个定位(下图)。
    在这里插入图片描述

    果要强调易用性,整个软件架构就要封闭一些,首先开放给用户调整的参数就不能太多,其次要保证计算速度,设计上多考虑并发和内存传递,最后是要有一个设计良好的用户界面。各种工作站就是此类产品的例子,操作按照解剖部位和处理需求进行流程优化,基本上点点鼠标就能完成。但是这样一来,可扩展性就不强,虽然也有可能做一些插件接口支持用户开发(如飞利浦的PRIDE和GE的Func2),但开发必须符合设定好的框架,空间很小。更极端的例子是CAD软件,譬如invivo的DynaCAD之类,使用上非常简便,但基本不考虑扩展。

    如果要强调可拓展性,整个软件架构就要非常开放。开放的极致就是一个各种工具组成的包,譬如FSL,DIPY等,用户自己设计处理流程,自由组合工具函数,并加入自己开发的模块。可扩展性极强。稍微用户友好一些的是MITK(作者为德国癌症研究中心的那套软件www.mitk.org),MRtrix之类带图形界面的后处理工具包,用户可以通过修改编译脚本来自行调配处理流程和组件。开放的代价是易用性很差,如果科研团队里没有熟悉编程的计算机背景的成员,几乎不能真正用上这些工具。

    我们在开发IMAge/enGINE(核磁弥散处理工具新版本)的时候,考虑面向的用户是没有工程团队支持的医学背景的大夫和研究生,因此尽量向易用性优化了,因此界面操作简单,计算速度快。举例来说,在i5-4570 CPU的计算机上测试,与其它开源工具比较如下。

    在这里插入图片描述

    在这里插入图片描述
    OsiriX(http://www.osirix-viewer.com)是一款运行在Mac OS上的DICOM浏览器 (只有Mac OS版,无MAC的同学请跳过此节 )。其收费版,也就是OsiriX MD版是通过FDA认证的,可以在很多国家和地区直接用于临床。OsiriX也提供免费版,代价是运行过程中有弹窗跳出,需要等待若干秒才能继续使用。OsiriX的功能主要集中在影像融合,影像渲染,影像标注上,计算参数图并不是强项。其提供了第三方开发接口(https://github.com/pixmeo/osirixplugins),有很多第三方的插件,譬如提供结构化报告的Pi-RADS Bi-RADS 冠脉分析等插件,也有计算ADC的IB diffusion,计算DCE的IB DCE等等。
    在这里插入图片描述
    3DSlicer (https://www.slicer.org/)可能是发展最好,最全面的免费+开源影像处理工具了。它可以运行在Mac OS, windows和linux上。3DSlicer主要是哈佛大学医学院布列根妇女医院(BWH),麻省总医院(MGH),依阿华大学(University of Iowa)和GE医疗开发的。3DSlicer是用04年到现在超过47个的NIH经费灌溉出来的。光弥散方向的插件,就有04,13,15年的3项经费。另外还有放疗引导,手术引导,放射组学,深度学习,XNAT接口,胸部影像平台(Chest Imaging Platform)等海量功能组件。而且要相信哈佛医学院系统拿funding的能力,他们可以一直搞新玩意儿,因此开发社区也极其活跃,新东西层出不穷。譬如这两年火爆的深度学习,就已经有Deep Infer提供的前列腺分割和肺外形分割组件了。其中前列腺分割号称DICE85+,建议各位把自己数据灌进去玩一玩,省得天天吹CNN也不知道最后替谁背了锅。基本上,掌握了3DSlicer,大部分花钱的科研平台就是来搞笑的……(部分组件见下图)
    在这里插入图片描述
    更加难能可贵的是,这是一个开源平台(Why?在美国,纳税人经费做的当然要开源),许可非常宽松,允许改造、商用等等。我们仔细阅读过它的源码,在开发IMAgen/enGINE的过程中,也借鉴了它的很多模块(如DICOM导入管理部分)。我们码农界有句老话,叫Talk is cheap, show me the code (吹水无用,请给代码)。我们看了Slicer的代码,真心膜拜人家在代码架构,多团队合作管理,版本控制方面的专业性。

    但是,正如它在易用性-易扩展性图中的位置一样,它为了多单位合作,支持更多的开发者,将插件接口做得极其开放。因此有2个缺点,1是暴露的参数太多了,使用非常复杂,必须仔细看文档或者参加培训班才容易上手。自己瞎玩的话,大概率连个弥散数据都灌不进去。(或许……我们可以开个培训班赚钱?)2是计算速度慢,缘于其使用了大量的硬盘文件缓存方式进行模块间通讯。举例来说,下图是UKF(Unscented Karman Filter)白质纤维束追踪插件的参数界面,此种纤维束追踪方法比较新,对数据量要求小追踪效果好纤维束不容易断,而且支持NODDI模型的追踪。不过我感觉对于不懂技术细节的临床背景研究者,只能抓瞎了:
    在这里插入图片描述
    在这里插入图片描述
    ImageJ(https://imagej.nih.gov)是一个工程师界的传奇。它是NIH一个工作人员Wayne Rasband利用自己的业余时间搭建的影像处理工具,开发者2010年从NIH退休之后,还在继续做很多工作。它也拥有大量的第三方插件(列表见此https://imagej.nih.gov/ij/plugins)。和大部分影像处理软件不同,这是个使用Java语言开发的工具,曾经还以applet方式提供在线使用。假设您团队的开发者更熟悉Java系的工具,这应该是您首选的科研工具。不过它也存在用户友好性的问题,而且界面比3DSlicer更加粗陋。因为我们不用Java,这个工具我们用得比较少。各位可以自己官网查阅资料。
    MITK
    在这里插入图片描述
    The Medical Imaging Toolkit (MITK, www.mitk.org)是德国癌症协会(German Cancer Research Center)搞的一套跨平台的免费+开源软件。虽然有图形界面,但它更像是一套工具集而不是一个软件。它可以理解为基于QT,ITK,VTK,OpenCV编写了一些自有的图形组件和算法库。然后通过灵活编写cmake脚本和使用它的预编译宏,可以把这些组件组成一个应用软件。譬如官方搞的MITK Diffusion,可以做HARDI之类的运算和追踪。下图是一个DTI的一个界面:

    在这里插入在这里插入图片描述图片描述

    根据上次文章所说的易用性和开放性成反比的理论,MITK架构设计灵活,易用性就比较差。根据我的使用经验,以它的工具库组织起来的软件往往不太稳定,bug比较多。各位可以试着下载安装版试试,不经历一番摸爬滚打恐怕是用不了的。MITK更像是给研究团队中的工程技术人员根据科研需求,快速定制自制软件用的。同样在德国的一家公司出品的mevislab软件应该是延续了这个思路(https://www.mevislab.de/),工程团队可以用mevislab快速把算法界面化,给医疗团队使用。这种研究团队种包含了有开发实力的工程技术人员的情况,在国内可能不太多见。这也是我们把IMAge/enGINE往易用性方面优化的原因。

    另外再介绍两种专门用来做分割的后处理工具:

    ITK Snap
    在这里插入图片描述
    ITK Snap (http://itksnap.org) 是跨平台的免费开源软件。支持Mac OS,WIN和Linux。其界面走技术硬核风,如下图:

    在这里插入图片描述

    手动分割工具齐全而且实现了大量的ITK半自动方法,而且软件架构比较开放,很方便往里塞ITK写的新方法,比较适合做分割算法开发的工程师们用来调参数或者尝试新算法。对于医学背景的同学们,我更推荐下面这个软件:

    Seg3D

    Seg3D (http://www.sci.utah.edu/download/seg3d/)是一款交互设计非常独树一帜的免费开源影像处理软件。考虑到它的开发单位犹他大学与Photoshop的渊源,Seg3D基于“蒙版”和“图层”的使用也并不意外。每一步分割算法都是生成一个新的“蒙版”,蒙版之间也可以便捷的逻辑运算。不过Seg3D里的半自动方法比较有限,只有区域生长,阈值之类的几种。软件比较封闭,想要二次开发加入新的方法也不是那么容易。下图是一个CT增强的颅内血管分割的小例子

    在这里插入图片描述

    首先可以使用阈值和联通域找到血管(图层一,绿色),但很容易连到骨皮之类其它类似信号的区域上。

    然后再从原始数据使用Otsu法找到颅内,进行几次腐蚀,确保颅内区域远离骨皮(图层二,黄色)。

    最后把图层一和图层二做一个“与”逻辑(图层三,紫色),就能粗略地得到颅内的血管部分了。

    结合手动方法,愿意花时间的话,应该说可以满足绝大多数医学影像分割需求了。还可以把分割好的模型直接3D打印。

    展开全文
  • 采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键。 源码地址:https://github.com/jiejieTop/ButtonDrive。作者:杰杰 前言 前几天写了个按键驱动,...

    button drive

    杰杰自己写的一个按键驱动,支持单双击、连按、长按;采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键。
    源码地址:https://github.com/jiejieTop/ButtonDrive。作者:杰杰

    前言

    前几天写了个按键驱动,参考了MulitButton的数据结构的用法,逻辑实现并不一样。
    在这里感谢所有的开源开发者,让我从中学到了很多,同时网络也是一个好平台,也希望所有的开发者能形成良性循环,从网络中学知识,回馈到网络中去。感谢MulitButton的作者0x1abin,感谢两位rtt的大佬:大法师流光

    Button_drive简介

    Button_drive是一个小巧的按键驱动,支持单击、双击、长按、连续触发等(后续可以在按键控制块中添加触发事件),理论上可无限量扩展Button,Button_drive采用按键触发事件回调方式处理业务逻辑,支持在RTOS中使用,我目前仅在RT-Thread上测试过。
    写按键驱动的目的是想要将用户按键逻辑与按键处理事件分离,用户无需处理复杂麻烦的逻辑事件。

    Button_drive使用效果

    1. 单击与长按

    单击与长按

    1. 双击

    双击

    1. 连按

    连按

    1. 连按释放

    连按释放

    使用方法

    1. 创建按键句柄
    Button_t Button1;
    Button_t Button2; 
    
    1. 创建按键,初始化按键信息,包括按键名字、按键电平检测函数接口、按键触发电平。
      Button_Create("Button1",				//按键名字
                    &Button1, 				//按键句柄
                    Read_Button1_Level, 	//按键电平检测函数接口
                    BTN_TRIGGER);		   	//触发电平
                    
                    ......
    
    1. 按键触发事件与事件回调函数链接映射,当按键事件被触发的时候,自动跳转回调函数中处理业务逻辑。
      Button_Attach(&Button1,BUTTON_DOWM,Btn2_Dowm_CallBack);		//按键单击
      Button_Attach(&Button1,BUTTON_DOUBLE,Btn2_Double_CallBack);	//双击
      Button_Attach(&Button1,BUTTON_LONG,Btn2_Long_CallBack);		//长按
    				
    				.......
    
    1. 周期调用回调按键处理函数即可,建议调用周期20-50ms。
    Button_Process();     //需要周期调用按键处理函数
    

    需要用户实现的 2 个函数:

    • 按键电平检测接口:
    uint8_t Read_Button1_Level(void)
    {
      return GPIO_ReadInputDataBit(BTN1_GPIO_PORT,BTN1_GPIO_PIN);
    }
    
    uint8_t Read_Button2_Level(void)
    {
      return GPIO_ReadInputDataBit(BTN2_GPIO_PORT,BTN2_GPIO_PIN);
    }
    
    // 这是我在stm32上简单测试的伪代码,以实际源码为准
    
    
    • 按键逻辑处理
    void Btn1_Dowm_CallBack(void *btn)
    {
      PRINT_INFO("Button1 单击!");
    }
    
    void Btn1_Double_CallBack(void *btn)
    {
      PRINT_INFO("Button1 双击!");
    }
    
    void Btn1_Long_CallBack(void *btn)
    {
      PRINT_INFO("Button1 长按!");
      
      Button_Delete(&Button2);
      PRINT_INFO("删除Button1");
      Search_Button();
    }
    

    特点

    Button_drive开放源码,按键控制块采用数据结构方式,按键事件采用枚举类型,确保不会重复,也便于添加用户需要逻辑,采用宏定义方式定义消抖时间、连按触发时间、双击时间间隔、长按时间等,便于修改。
    同时所有被创建的按键采用单链表方式连击,用户只管创建,无需理会按键处理,只需调用Button_Process()即可,在函数中会自动遍历所有被创建的按键。
    支持按键删除操作,用户无需在代码中删除对应的按键创建于映射链接代码,也无需删除关于按键的任何回调事件处理函数,只需调用Button_Delete()函数即可,这样子,就不会处理关于被删除按键的任何状态。当然目前按键内存不会释放,如果使用os的话,建议释放按键内存。

    按键控制块
    /*
    	每个按键对应1个全局的结构体变量。
    	其成员变量是实现消抖和多种按键状态所必须的
    */
    typedef struct button
    {
    	/* 下面是一个函数指针,指向判断按键手否按下的函数 */
    	uint8_t (*Read_Button_Level)(void); /* 读取按键电平函数,需要用户实现 */
      
      char Name[BTN_NAME_MAX];
      	
      uint8_t Button_State              :   4;	  /* 按键当前状态(按下还是弹起) */
      uint8_t Button_Last_State         :   4;	  /* 上一次的按键状态,用于判断双击 */
      uint8_t Button_Trigger_Level      :   2;    /* 按键触发电平 */
      uint8_t Button_Last_Level         :   2;    /* 按键当前电平 */
      
      uint8_t Button_Trigger_Event;     /* 按键触发事件,单击,双击,长按等 */
      
      Button_CallBack CallBack_Function[number_of_event];
      uint8_t Button_Cycle;	           /* 连续按键周期 */
      
      uint8_t Timer_Count;			/* 计时 */
      uint8_t Debounce_Time;		/* 消抖时间 */
      
      uint8_t Long_Time;		  /* 按键按下持续时间 */
      
      struct button *Next;
      
    }Button_t;
    
    
    触发事件
    typedef enum {
      BUTTON_DOWM = 0,
      BUTTON_UP,
      BUTTON_DOUBLE,
      BUTTON_LONG,
      BUTTON_CONTINUOS,
      BUTTON_CONTINUOS_FREE,
      BUTTON_ALL_RIGGER,
      number_of_event, /* 触发回调的事件 */
      NONE_TRIGGER
    }Button_Event;
    
    
    宏定义选择
    #define BTN_NAME_MAX  32     //名字最大为32字节
    
    /* 按键消抖时间40ms, 建议调用周期为20ms
     只有连续检测到40ms状态不变才认为有效,包括弹起和按下两种事件
    */
    
    #define CONTINUOS_TRIGGER             0  //是否支持连续触发,连发的话就不要检测单双击与长按了	
    
    /* 是否支持单击&双击同时存在触发,如果选择开启宏定义的话,单双击都回调,只不过单击会延迟响应,
       因为必须判断单击之后是否触发了双击否则,延迟时间是双击间隔时间 BUTTON_DOUBLE_TIME。
       而如果不开启这个宏定义,建议工程中只存在单击/双击中的一个,否则,在双击响应的时候会触发一次单击,
       因为双击必须是有一次按下并且释放之后才产生的 */
    #define SINGLE_AND_DOUBLE_TRIGGER     1 
    
    /* 是否支持长按释放才触发,如果打开这个宏定义,那么长按释放之后才触发单次长按,
       否则在长按指定时间就一直触发长按,触发周期由 BUTTON_LONG_CYCLE 决定 */
    #define LONG_FREE_TRIGGER             0 
    
    #define BUTTON_DEBOUNCE_TIME 	  2   //消抖时间      (n-1)*调用周期
    #define BUTTON_CONTINUOS_CYCLE  1	  //连按触发周期时间  (n-1)*调用周期  
    #define BUTTON_LONG_CYCLE       1	  //长按触发周期时间  (n-1)*调用周期 
    #define BUTTON_DOUBLE_TIME      15 	//双击间隔时间  (n-1)*调用周期  建议在200-600ms
    #define BUTTON_LONG_TIME 	      50		/* 持续n秒((n-1)*调用周期 ms),认为长按事件 */
    
    #define TRIGGER_CB(event)   \
            if(btn->CallBack_Function[event]) \
              btn->CallBack_Function[event]((Button_t*)btn)
    
    例子
      Button_Create("Button1",
                  &Button1, 
                  Read_KEY1_Level, 
                  KEY_ON);
      Button_Attach(&Button1,BUTTON_DOWM,Btn1_Dowm_CallBack);                       //单击
      Button_Attach(&Button1,BUTTON_DOUBLE,Btn1_Double_CallBack);                   //双击
      Button_Attach(&Button1,BUTTON_CONTINUOS,Btn1_Continuos_CallBack);             //连按  
      Button_Attach(&Button1,BUTTON_CONTINUOS_FREE,Btn1_ContinuosFree_CallBack);    //连按释放  
      Button_Attach(&Button1,BUTTON_LONG,Btn1_Long_CallBack);                       //长按
    
    
      Button_Create("Button2",
                  &Button2, 
                  Read_KEY2_Level, 
                  KEY_ON);
      Button_Attach(&Button2,BUTTON_DOWM,Btn2_Dowm_CallBack);                     //单击
      Button_Attach(&Button2,BUTTON_DOUBLE,Btn2_Double_CallBack);                 //双击
      Button_Attach(&Button2,BUTTON_CONTINUOS,Btn2_Continuos_CallBack);           //连按
      Button_Attach(&Button2,BUTTON_CONTINUOS_FREE,Btn2_ContinuosFree_CallBack);  //连按释放
      Button_Attach(&Button2,BUTTON_LONG,Btn2_Long_CallBack);                     //长按
    
      Get_Button_Event(&Button1);
      Get_Button_Event(&Button2);
    

    后续

    流光大佬的要求,让我玩一玩RTT的rtkpgs,打算用Button_drive练一练手吧。

    ButtonDrive在env使用

    目前我已将按键驱动做成软件包(packages),如果使用RT-Thread操作系统的话,可以在env中直接配置使用!

    步骤如下:

    1. 选择在线软件包

    1. 选择软件包属性为外设相关

    1. 选择button_drive

    1. 进入驱动的选项配置(自带默认属性)

    1. 如果不懂按键的配置是什么意思,按下“shift+?”,即可有解释

    1. 编译生成mdk/iar工程

    关于rtkpgs

    简介 (English)

    buildpkg 是用于生成 RT-Thread package 的快速构建工具。

    一个优秀的 package 应该是这样的:

    1. 代码优雅, 规范化。
    2. examples 例程,提供通俗易懂的使用例程。
    3. SConscript 文件,用于和 RT-Thread 环境一起进行编译。
    4. README.md 文档,向用户提供必要的功能说明。
    5. docs 文件夹, 放置除了 README 之外的其他细节文档。
    6. license 许可文件,版权说明。

    为了方便快速的生成 RT-Thread package 规范化模板 以及 减轻开源仓库迁移 RT-Thread 的前期准备工作的负担,基于此目的的 buildpkg 应运而生,为开发 Rt-Thread 的 package 的开发者提供辅助开发工具。

    序号支持功能描述
    1构建 package 模板创建指定名称 package , 自动添加 readme /版本号/ github ci脚本/demo/开源协议文件
    2迁移开源仓库从指定 git 仓库构建 package , 自动添加readme/版本号/ github ci脚本/demo/开源协议文件, 但是迁移的仓库需要用户自己按照实际情况修改
    3更新 package生成package后可以再次更新之前设定的版本号,开源协议或者scons脚本等

    使用说明

    1. 构建package

    buildpkg.exe make pkgdemo

    2. 迁移开源仓库

    buildpkg.exe make cstring https://github.com/liu2guang/cstring.git

    3. 更新package

    buildpkg.exe update pkgname

    4. 可选配置

    长参数短参数描述
    –version=v1.0.0-v v1.0.0设置 package 的版本
    –license=MIT-l MIT设置 package 所遵循的版权协议
    –submodule-s删除 git 子模块

    Windows10 及 Linux 平台的演示动图

    buildpkg

    测试平台

    序号测试平台测试结果
    1win10exe测试通过, py测试通过
    2win7exe待测试, py待测试
    3macpy脚本不知道是否兼容, 没有测试条件, 后面维护下
    4linuxpy脚本不知道是否兼容, 没有测试条件, 后面维护下

    联系人

    欢迎关注杰杰个人公众号

    杰杰公众号

    展开全文
  • 信号处理simulink仿真-DSP系统工具

    千次阅读 2020-11-11 21:13:14
    1 工具箱优点 (1)流信号处理和现行代数模块 (2)单素律、多速率、FIR、IIR和自适应滤波器设计 (3)可用于对流信号进行可视化和测量的示波器、频谱分析仪和逻辑分析仪 (4)对信号处理算法进行定点建模和仿真 (5...
  • Mybatis-Plus 使用逻辑分页处理

    千次阅读 2019-10-23 16:26:28
    但还是有部分数据是查询出来后再做处理的,所以使用不了物理分页,故需要使用逻辑分页 逻辑分页:就是把数据查询出来,再通过处理的出来的新的list再对该数据进行分页显示 1.下面是采用mybatis-plus的分页自带的...
  • 写加工逻辑说明的三个小工具

    千次阅读 热门讨论 2014-09-14 19:22:56
    在第九集中有一部分讲解了用于写加工逻辑说明的工具:结构化英语、判断表、判断树。之所以吸引我是因为“英语”二字和“判断”二字。英语就不必说了,每天都在看,最近在看新走遍美国;而后面的重复的判断二字,不知...
  • MATLAB工具箱包括:模糊逻辑,多维小波变换,时频分析,信号处理
  • 什么是逻辑回归算法? 逻辑回归(Logistic Regression)是机器学习中的一种分类模型,分类模型又有二分与多分类,逻辑回归通常用于二分类,用来完成 0/1 分类问题,逻辑一词也代表了是(1)和非(0)。 什么场景...
  • 数字电子技术逻辑运算

    千次阅读 多人点赞 2020-04-23 01:45:49
    数字电子技术学习笔记第一章 数制与编码第二章 基本逻辑运算与集成逻辑门2.1 基本概念2.1.1逻辑变量与逻辑函数2.1.2真值表2.2 三种基本逻辑运算2.2.1与逻辑(与运算、逻辑乘)2.2.2 或逻辑(或运算、逻辑加)2.2.3 ...
  • 中文自然语言处理工具介绍

    千次阅读 2017-03-09 16:54:02
    自然语言处理是人工智能领域中的一个重要方向。它研究能人机之间通讯的方式,并涉及机器对人类知识体系的学习和应用.从分词,相似度计算,情感分析,文章摘要,到学习文献,知识推理,都涉及自然语言分析.下面介绍...
  • 模糊逻辑学习--什么是模糊逻辑

    千次阅读 2020-06-28 10:59:16
    模糊逻辑的描述 近年来,模糊逻辑的应用数量和种类已大大增加。应用范围从消费产品(例如相机,便携式摄像机,洗衣机和微波炉)到工业过程控制,医疗仪器,决策支持系统和产品组合选择。 要了解为什么增加了模糊...
  • 8大底层逻辑,提升思维能力

    千次阅读 2021-01-17 11:28:29
    MECE法则的常用的工具就是逻辑树,逻辑树是将一个问题的所有子问题分层罗列,从最高层开始,逐步向下扩展,比如我们常用的思维导图,就是一种典型的逻辑树表达工具。 假设思考还有一个非常重要的点就是懂得利用前辈...
  • 订单取消是个比较复杂的流程,系统需要判断当前订单正处于在哪个环节,不同的环节的处理逻辑不同。按照我们的业务现状,商品从库房发出以后就不能再取消了,但如果我们的配送系统能够与各大物流公司系统打通实现联动...
  • 数字电子技术之逻辑函数的化简及表示

    千次阅读 多人点赞 2020-05-24 23:21:40
    数字电路的作用是用来表达一个现实的逻辑命题,实现逻辑功能。但是,从 逻辑功能中简单概括得出的逻辑函数,往往不是最简表达式,根据这样的非最简式来实现电路,系统会过于复杂,成本过高,同时,电路运行的安全性...
  • 华为硬件逻辑岗笔试题(一)

    千次阅读 2021-02-25 12:43:38
    积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 ...5. 对组合逻辑的认识 ...6. 对时序逻辑的认识 ...15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...
  • GDAL自带了很多实用方便的工具,方便大家直接使用。 它把这些功能封装了一些...所有的工具主要分为4类,二维栅格处理、多维栅格处理、矢量处理、地理网络处理。 这里我对这些工具做了核实和整理(我的版本GDAL3.0)
  • 【清华大学】《逻辑学概论》笔记

    万次阅读 多人点赞 2020-09-04 01:32:03
    教学视频来源 概要 讲师介绍 陈为蓬 清华大学人文学院 副教授 课程内容 第1讲 什么是逻辑学? 第2讲 逻辑学的产生与发展 第3讲 命题联结词及其基本推理形式 第4讲 复合命题的推理:...1.1 “逻辑逻辑学 什么是逻辑
  • 组合逻辑电路和时序逻辑电路区别

    万次阅读 多人点赞 2019-05-27 09:17:09
    比较项目组合逻辑电路时序逻辑电路(状态机)(同步) 输入输出关系任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关不仅仅取决于当前的输入信号,而且还取决于电路原来的状态,或者说,还与以前的...
  • 业务逻辑流程图

    万次阅读 多人点赞 2019-06-06 16:26:04
    用Axure注释逻辑 元件的逻辑有5种,具体如下: 功能逻辑:详细讲解该功能的逻辑。 交互逻辑:对页面之间的相互跳转进行说明。 视觉逻辑:对颜色,对图标的要求。 业务逻辑:讲一下该功能对应着什么业务。 技术逻辑:...
  • 模型检测工具汇总(比较全)

    千次阅读 2019-09-23 17:09:21
    面向形式化规格语言的模型检测工具 SMV(Symbolic Model Verifier) 符号模型检测工具 SMV用以检测一个有限状态系统是否满足CTL公式。 它的建模方式是以模块为单位,模块可以同步或异步组合,模块描述的基本...
  • 数字IC设计学习笔记(一)——逻辑综合简介

    千次阅读 多人点赞 2019-05-21 10:50:17
    根据系统逻辑功能与性能的要求,在包含众多结构、功能和性能已知的逻辑元件的单元库的支持下,综合工具寻找出一个逻辑网络结构的 最佳实现方案 ,即在满足电路功能、速度及面积等条件下, 将行为级描述转化为指定的...
  • 国内外主流静态分析类工具汇总

    万次阅读 多人点赞 2019-07-27 11:17:48
    笔者从事该软件安全方面工作,在工作和学习中收集了国内外比较主流的静态分析类工具,供大家参考。大多是资料来自于网络整理,如有不足或欠缺,还请在评论中指出。我进行修正。也欢迎同行多多交流。 我使用0标注...
  • mysql的逻辑结构

    千次阅读 2022-03-12 13:27:02
    最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP 的通信。 主要任务是连接处理、授权认证、及相关的安全方案等。 该层引入了线程池,为通过认证、安全接入的...
  • UI设计开发工具介绍

    千次阅读 2022-03-15 10:15:22
    UI设计开发工具介绍1 UI设计概念2 UI延申3 工具3.1 文档3.2 信息架构3.3 原型设计3.4 图形处理4 网站参考 1 UI设计概念 UI设计(或称界面设计)是指对软件的人机交互、操作逻辑、界面美观的整体设计。UI设计分为...
  • 11款程序员实用工具,老少皆宜,你一定用得上!

    万次阅读 多人点赞 2021-08-26 10:47:30
    传送门:https://marketplace.visualstudio.com/items?itemName=humao.rest-client 八、FSCapture(图像处理工具) 这是一款非常小巧实用的截图、编辑和录屏的工具,支持滚动截长图、图片编辑和修改、多种方式录屏...
  • 模糊逻辑学习--模糊逻辑的基础

    千次阅读 2020-06-28 19:58:33
    模糊逻辑的基础 总览 模糊逻辑的重点是将输入空间映射到输出空间,而执行此操作的主要机制是一系列if-then语句(称为规则)。所有规则都是并行评估的,规则的顺序并不重要。规则本身很有用,因为它们引用变量和...
  • 程序员的底层思维:逻辑思维

    千次阅读 多人点赞 2021-07-31 11:47:36
    但能够清晰的说出逻辑的定义(什么是逻辑)应该不多,能够正确的掌握逻辑推理的人就应该更少了。对于大部分人来说,逻辑更像是一个“熟悉的陌生人”。 举个例子。 小王说:“Frank真不是男人,竟然会怕老鼠。” 小张...
  • 为方便分析逻辑分析仪导出的csv数据, 简单做了个转换工具。。。 逻辑分析仪导出的csv数据是根据时间戳逐行排序,很难分析一个完整的帧数据, 例如下图: 下图逻辑分析仪工具导出的csv数据有3w多行,没办法直接通过该...
  • 数据分析师常用工具有哪些?初学者必看

    万次阅读 多人点赞 2018-01-11 08:41:24
    我给你一份数据分析师常用工具指南,按照这份指南,小白也能成为数据分析高手! 这是一份入门到熟练的工具指南,并不包含数据挖掘等高阶内容。 Step1:Excel学习掌握 所用的工具正是职场中最常用的Excel! ①...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 672,532
精华内容 269,012
关键字:

逻辑处理工具

友情链接: For.zip