shenwou 发表于 2014-10-28 22:56:48

多谢楼主分享,先MARK下

xtaens 发表于 2014-10-30 22:22:22

y574924080 发表于 2014-8-29 23:43
最新的 oopc.h可以到 http://www.amobbs.com/thread-5590165-1-1.html

下载工程模板就可以找到了 ...

lz你好,我把你的这个按键驱动移植到stm32f103上,使用最新的ooc.h,编译报错说有一个变量没有定义,但是我包含了那个定义的文件

还是提示没有定义,这是怎么了?使用旧的oopc.h文件编译正常。




slzm40 发表于 2014-10-30 22:49:12

xtaens 发表于 2014-10-30 22:22
lz你好,我把你的这个按键驱动移植到stm32f103上,使用最新的ooc.h,编译报错说有一个变量没有定义,但是 ...

这个变量应该是自定义布尔类型。。要自己定义。 状态机执行完毕,返回true(fsm_xxx_finish),状态机进行中,返回false(fsm_xxx_going),好像是这个意思。 我把它们改成bool也能用

zl_123 发表于 2014-10-30 22:59:12

看了很不错,mark                  

y574924080 发表于 2014-10-30 23:38:22

xtaens 发表于 2014-10-30 22:22
lz你好,我把你的这个按键驱动移植到stm32f103上,使用最新的ooc.h,编译报错说有一个变量没有定义,但是 ...

fsm_rt_t 在工程模版下 .\gsf\utilities\arm

我们的习惯是一个通用的宏定义,类型等,都是定义在 .\gsf\utilities\ 下,这样可以避免重复劳动,

事实上 .\gsf\utilities\下还有不少很有意思的东西,{:biggrin:}

y574924080 发表于 2014-10-30 23:40:02

slzm40 发表于 2014-10-30 22:49
这个变量应该是自定义布尔类型。。要自己定义。 状态机执行完毕,返回true(fsm_xxx_finish),状态机进行中 ...

这个是我们状态机通用的返回值类型,

一开始也使用过布尔类型,但是再后来需要表达更多返回状态的时候,就改成了 fsm_rt_t

都习惯了这个,忘记说明了,{:titter:}

xtaens 发表于 2014-10-31 08:34:43

y574924080 发表于 2014-10-30 23:38
fsm_rt_t 在工程模版下 .\gsf\utilities\arm

我们的习惯是一个通用的宏定义,类型等,都是定义在 .\gsf\ ...

我使用的是 旧工程test_2F 下的app_cfg.h文件,此文件中有类

typedef enum {
    fsm_rt_err          = -1,    //!< fsm error, error code can be get from other interface
    fsm_rt_cpl          = 0,   //!< fsm complete
    fsm_rt_on_going   = 1,   //!< fsm on-going
    fsm_rt_wait_for_obj = 2,   //!< fsm wait for object
    fsm_rt_asyn         = 3,   //!< fsm asynchronose complete, you can check it later.
} fsm_rt_t;
//! @}



没有使用新工程下的那个文件哦。

selflag_bbs 发表于 2014-10-31 08:36:46

不错,留着

xtaens 发表于 2014-10-31 08:38:14

y574924080 发表于 2014-10-30 23:38
fsm_rt_t 在工程模版下 .\gsf\utilities\arm

我们的习惯是一个通用的宏定义,类型等,都是定义在 .\gsf\ ...

目前的处理方法是直接把下面的两个直接屏蔽,就可以编译通过了

//! \name general event handler
//! @{
EXTERN_CLASS( DELEGATE_HANDLE,
      typedef fsm_rt_t DELEGATE_HANDLE_FUNC(void *pArg, void *pParam);
    )
    DELEGATE_HANDLE_FUNC   *fnHandler;      //!< event handler
    void                   *pArg;         //!< Argument
    DELEGATE_HANDLE      *ptNext;         //!< next
END_EXTERN_CLASS(DELEGATE_HANDLE)
//! @}

//! \name event
//! @{
EXTERN_CLASS(DELEGATE)
    DELEGATE_HANDLE   *ptEvent;
    DELEGATE_HANDLE   *ptBlockedList;
    DELEGATE_HANDLE   **pptHandler;
END_EXTERN_CLASS(DELEGATE)
//! @}

hellohaitong 发表于 2014-10-31 09:35:35

楼主很强大,

mafeimafei 发表于 2014-11-4 16:33:22


学习,mark,谢谢!

mafeimafei 发表于 2014-11-5 11:23:15

再次学习了。

beijisnow 发表于 2014-11-5 17:26:47

好帖 留名~~~~~~~~~

snaky_mok 发表于 2014-12-3 21:05:24

收下了,MARK

haoyu0729 发表于 2014-12-3 23:16:14

状态机很强大

yao2013lin 发表于 2014-12-4 00:05:31

谢谢分享,不错的设计

shuimubai 发表于 2014-12-4 10:26:21

是否带缓存处理按键?

Gorgon_Meducer 发表于 2014-12-4 10:40:41

sunismyself-la 发表于 2014-10-22 15:11
版主,这是哪个资料上的图,求介绍

我自己用word画的

Gorgon_Meducer 发表于 2014-12-4 10:41:04

shuimubai 发表于 2014-12-4 10:26
是否带缓存处理按键?

必须带啊~

minicatcatcn 发表于 2014-12-15 09:35:38

留个脚印,学习一下。

gracialee 发表于 2014-12-26 20:48:33

通用的按键,正想弄这个程序测试。

北辰 发表于 2014-12-26 23:24:25

mark                  

北辰 发表于 2014-12-26 23:24:43

mark         think      

Dongshan888 发表于 2014-12-26 23:46:15

非常感谢分享,学习了

gy810986741 发表于 2014-12-27 10:56:26

赞一个,学习了

ztlaputa 发表于 2014-12-28 12:13:26

留着,慢慢消化,用来学习下编程思想。

zyorai 发表于 2014-12-29 18:53:56

非常好用~~~~

chess01 发表于 2014-12-29 20:17:41

mark,留待后观

ustcls 发表于 2014-12-29 21:17:30

mark一下,谢谢分享

zhongsandaoren 发表于 2014-12-30 09:24:50

没有看过傻孩子,自己研究出来的,用了好几年了,原理大同小异。

tcpln 发表于 2014-12-30 09:43:38

果断收藏了,状态机的思想真得很重要,以前按键检测用的是延时,不能能用,自己用了状态机之后,程序的稳定性自己也有保障了。

Gorgon_Meducer 发表于 2014-12-30 09:51:27

zhongsandaoren 发表于 2014-12-30 09:24
没有看过傻孩子,自己研究出来的,用了好几年了,原理大同小异。

不同的人在不交流的情况下经过足够的时间得出了相同的结论,这是计算机技术客观性的体现。赞兄弟!

levy 发表于 2014-12-30 10:57:18

收藏,谢谢。。。

taiyangshendi2 发表于 2014-12-30 11:08:03

水平不够 只看懂了一部分,不过很少用到这么多按键的时候先收藏了吧

unnormal 发表于 2014-12-30 11:34:52

留下来以后慢慢看

xhcyfc 发表于 2014-12-30 11:49:47

mark, 有空仔细看看

demonye 发表于 2015-1-3 21:13:15

学习了
谢谢楼主

lf8013 发表于 2015-1-3 22:46:40

强大,很好,学习....

feiante116 发表于 2015-1-3 23:30:25

“支持最多255个按键,每个按键都支持包括按下检测、
松手检测、长按、连按的效果”
这个要看看,有机会移植一下,用于以后的项目中

枫叶情缘 发表于 2015-1-8 16:41:34

经典,学习

wen007pcb 发表于 2015-1-8 18:46:47

收藏了!!

foxpro2005 发表于 2015-1-26 23:31:19

更新日志
    - 2014-3-24
      a. 修改key_queue接口:增加中断保护修改注释风格
      b. 更新Demo工程,并将key_task放入到system tick 异常处理程序中

------------------------------------------------------------------------------------------------------------------------
您现在楼主位的test2F工程是最近一次更新的么, 没有看到有把 “b. 更新Demo工程,并将key_task放入到system tick 异常处理程序中”(我应该没看漏吧...{:lol:} )。

另外,昨天看了一下, 不解systick.c与systick.h中类型定义部分的用意, 两个文件中均有重复定义, 而systick.c并没有依赖systick.h,是不是想把类型通过接口输出(而隐藏具体细节信息, 就是之前傻孩子大师讲的做掩码结构体),但看test2F代码并不完全是。如下对比图:

y574924080 发表于 2015-1-27 00:07:21

foxpro2005 发表于 2015-1-26 23:31
更新日志
    - 2014-3-24
      a. 修改key_queue接口:增加中断保护修改注释风格


最后一次更新工程模版, 我上传第二天就发现上传错了,

但是没人指出, 就懒得改了, 现在也找不到工程模版了

这个贴, 其实是傻孩子老师培训的题目....


然后关于.c .h的使用, 我们的习惯就是把*.h作为向外提供信息的文件, 理应包含恰好的信息,

systick_cfg_t作为systick的配置结构体, 外部需要这个信息, 所以可以在.h可以看到


你看到的工程模版是我培训中间的成果, 很多习惯还没改变

建议去看傻孩子老师的蜘蛛机器人贴 或者 播放器帖子的工程模版

foxpro2005 发表于 2015-1-27 00:19:30

本帖最后由 foxpro2005 于 2015-1-27 00:21 编辑

y574924080 发表于 2015-1-27 00:07
最后一次更新工程模版, 我上传第二天就发现上传错了,

但是没人指出, 就懒得改了, 现在也找不到工程模版 ...

之前一直处于忙碌中,没及时关注傻孩子老师团队的帖子, 这两天稍微有点空, 在跟你们的步伐在看, 再慢去细品、学习...,感谢你们的开源分享..
看你们在用svn在管理项目, git也是一个非常不错的版本管理工具哦。

y574924080 发表于 2015-1-27 10:41:05

foxpro2005 发表于 2015-1-27 00:19
之前一直处于忙碌中,没及时关注傻孩子老师团队的帖子, 这两天稍微有点空, 在跟你们的步伐在看, 再慢 ...

用svn, 是因为公司的服务器搭建的就是svn服务器

git的话, 现在正在学习~~~ {:lol:}

gy810986741 发表于 2015-2-6 12:38:10

多谢楼主分享

huaidan2088 发表于 2015-2-6 15:31:55

看了,很不错,这个很好

xujianglun1 发表于 2015-2-24 16:58:53

好,记下了

wszyjsw2 发表于 2015-2-25 11:51:10

mark通用按键模块

F_QD_000A 发表于 2015-2-26 17:14:04

看似简单的按键代码,要做好还真得需要高水平。

HalenYU 发表于 2015-2-26 20:34:26

{:sad:}。还米有感受到这个

captain_steve 发表于 2015-2-27 10:00:53

很强大,收下了,谢谢楼主

Harlan 发表于 2015-3-8 22:52:28

不得不说又学习了

efree 发表于 2015-4-3 15:38:17

学习了,支持                  一下。

jjkkty 发表于 2015-4-3 21:52:11

mark按键

sos9616 发表于 2015-4-7 16:59:56

谢谢!
对我帮助很大

efree 发表于 2015-4-14 17:05:23

好贴要顶。绝对支持。

if_else 发表于 2015-4-14 23:43:30

学习了,按键程序不同的系统要使用不同框架的程序

miight 发表于 2015-4-16 15:24:43

学习了,谢谢LZ分享!

darkness27 发表于 2015-4-25 01:17:03

请问为什么会有两个相同 的app_cfg.h文件呢?谢谢。

堂吉诃德 发表于 2015-4-25 09:59:07

好东西,收藏

didadida 发表于 2015-5-9 12:07:04

顶一顶贴,层次状态机

索达客 发表于 2015-7-8 10:33:23

谢谢楼主分享,收藏备用了!

yangpeng012 发表于 2015-7-13 21:42:10

这个代码必须在IAR下吗?在keil里面怎么不行!!!

longjunyi 发表于 2015-7-13 22:16:42

xuexixuexi

yangpeng012 发表于 2015-7-13 23:26:03

楼主给的工程是基于IAR的,下面的这两个获取当前中断状态和恢复中断状态的宏定义在KEIL下如何移植呢???感谢了

#if __IS_COMPILER_IAR__
#define GET_GLOBAL_INTERRUPT_STATE()      __get_interrupt_state()
#define SET_GLOBAL_INTERRUPT_STATE(__STATE) __set_interrupt_state(__STATE)
typedef __istate_t   istate_t;
#else
#error No support for interrupt state access
#endif

//! \brief The safe ATOM code section macro
#define SAFE_ATOM_CODE(...)   {\
      istate_t tState = GET_GLOBAL_INTERRUPT_STATE();\
      DISABLE_GLOBAL_INTERRUPT();\
      __VA_ARGS__;\
      SET_GLOBAL_INTERRUPT_STATE(tState);\
    }

daska110a 发表于 2015-7-14 00:38:27

方便移植的按键程序

daska110a 发表于 2015-7-14 00:39:38

方便移植的按键程序

夜猫 发表于 2015-7-14 08:38:13

很强大的按键处理         

liulingang_1205 发表于 2015-7-14 11:42:32

按键处理,这个帖子值得收藏。

Gorgon_Meducer 发表于 2015-7-14 18:47:20

yangpeng012 发表于 2015-7-13 23:26
楼主给的工程是基于IAR的,下面的这两个获取当前中断状态和恢复中断状态的宏定义在KEIL下如何移植呢??? ...

鸣谢:祥子

arm_compiler.h

/*!< Macro to enable all interrupts. */
#if __IS_COMPILER_IAR__
#   define ENABLE_GLOBAL_INTERRUPT()       __enable_interrupt()
#elif __IS_COMPILER_MDK__
#   define ENABLE_GLOBAL_INTERRUPT()      __enable_irq()
#else
#   define ENABLE_GLOBAL_INTERRUPT()       __asm__ __volatile__ (" CPSIE i")
#endif

/*!< Macro to disable all interrupts. */
#if __IS_COMPILER_IAR__
#   define DISABLE_GLOBAL_INTERRUPT()      __disable_interrupt()
#elif __IS_COMPILER_MDK__
#   define DISABLE_GLOBAL_INTERRUPT()      __disable_irq()
#else
#   define DISABLE_GLOBAL_INTERRUPT()      __asm__ __volatile__ (" CPSID i");
#endif

#if __IS_COMPILER_IAR__
#   define GET_GLOBAL_INTERRUPT_STATE()      __get_interrupt_state()
#   define SET_GLOBAL_INTERRUPT_STATE(__STATE) __set_interrupt_state(__STATE)
typedef __istate_t   istate_t;
#elif __IS_COMPILER_MDK__
#   define GET_GLOBAL_INTERRUPT_STATE()      __disable_irq()
#   define SET_GLOBAL_INTERRUPT_STATE(__STATE) if (__STATE) { __enable_irq(); }
typedef int   istate_t;
#else
#error No support for interrupt state access
#endif

signal.h

#if __IS_COMPILER_MDK__
//! \brief The safe ATOM code section macro
# define SAFE_ATOM_CODE(...)   {\
      istate_t tState = GET_GLOBAL_INTERRUPT_STATE();\
      __VA_ARGS__;\
      SET_GLOBAL_INTERRUPT_STATE(tState);\
    }

//! \brief Exit from the safe atom operations
# define EXIT_SAFE_ATOM_CODE()          SET_GLOBAL_INTERRUPT_STATE(tState);
#else
//! \brief The safe ATOM code section macro
# define SAFE_ATOM_CODE(...)   {\
      istate_t tState = GET_GLOBAL_INTERRUPT_STATE();\
      DISABLE_GLOBAL_INTERRUPT();\
      __VA_ARGS__;\
      SET_GLOBAL_INTERRUPT_STATE(tState);\
    }

//! \brief Exit from the safe atom operations
# define EXIT_SAFE_ATOM_CODE()          SET_GLOBAL_INTERRUPT_STATE(tState);
#endif

ludlee 发表于 2015-7-15 17:03:43

{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}

tanek 发表于 2015-7-20 17:31:39

Gorgon_Meducer 发表于 2015-7-14 18:47
鸣谢:祥子

arm_compiler.h


GET_GLOBAL_INTERRUPT_STATE()这个怎么把全局中断都关掉了。也只能在 SAFE_ATOM_CODE 里面用了,貌似不能单独用

micheal147 发表于 2015-7-22 14:08:07

这个要MARK

lxk52000 发表于 2015-7-22 18:07:12

在这里总能受益匪浅啊

heisewangluo 发表于 2015-7-24 16:39:50

好贴,正在学习源码中,准备用我的stm8试试。

ponder2077 发表于 2015-7-24 18:32:59

没有系统看傻孩子的宏定义,所以有点难看懂,还是要坚持看懂,

ponder2077 发表于 2015-7-24 19:04:30

两个按键同时按下,或多个按键同时按下呢? 能否识别?

yoursnemo 发表于 2015-7-30 23:00:30

好东西~~

Gorgon_Meducer 发表于 2015-8-4 10:23:34

ponder2077 发表于 2015-7-24 19:04
两个按键同时按下,或多个按键同时按下呢? 能否识别?

这个问题前面已经有讨论,结论是取决于你的接口函数如何编码多按键的情况了。这个库只是对你的按键编码提供各类按键事件的识别服务。

ponder2077 发表于 2015-8-4 16:14:05

按下按键立即打开手筒, 但是,在打开手电筒状态下, 松开按键才能关手电筒?

wei669 发表于 2015-8-5 21:33:39

我现在比较头疼的是组合按键处理!有兴趣的朋友可以讨论下

wwoneway 发表于 2015-8-5 21:52:30

学习了{:handshake:}

Gorgon_Meducer 发表于 2015-8-6 15:47:35

ponder2077 发表于 2015-8-4 16:14
按下按键立即打开手筒, 但是,在打开手电筒状态下, 松开按键才能关手电筒?

怎么用好KEY_DOWN, KEY_UP, KEY_PRESSED, KEY_LONG_PRESSED这类事件能解决你的问题。

ponder2077 发表于 2015-8-6 16:36:11

Gorgon_Meducer 发表于 2015-8-6 15:47
怎么用好KEY_DOWN, KEY_UP, KEY_PRESSED, KEY_LONG_PRESSED这类事件能解决你的问题。

谢谢傻孩子, 虽然还是没有看懂,

catwill 发表于 2015-8-6 21:09:18

ponder2077 发表于 2015-8-6 16:36
谢谢傻孩子, 虽然还是没有看懂,

一次性看懂是非常困难的,最好能够先用起来

青叶林 发表于 2015-8-6 21:27:42

很好的一个程序!

zhj2000 发表于 2015-8-7 07:49:29

按键处理,必须用到的模块,下载学习{:biggrin:}{:biggrin:}{:biggrin:}

Vampireyifeng 发表于 2015-8-9 23:12:11

通用按键模块

ynleo 发表于 2015-10-28 09:17:22

MARK 好东西

wjg29542954 发表于 2015-10-28 09:54:18

研究研究

碧水渊 发表于 2015-11-23 10:58:18

大神们,对我来说这个看了很久没有看懂,谁有keil版本的啊,楼主的好多宏看不懂{:sad:}{:sad:}{:sad:}

碧水渊 发表于 2015-11-24 15:34:34

版主你好,有没有测试过,这个程序运行一遍需要多少时间,在ARM-M0上

大笨蛋1990 发表于 2015-11-24 18:28:37

学习   

atg525 发表于 2015-11-24 22:05:11

果断收藏

yao2013lin 发表于 2015-11-25 00:10:38

先标记下回头再看

碧水渊 发表于 2015-11-25 09:38:35

tanek 发表于 2015-7-20 17:31
GET_GLOBAL_INTERRUPT_STATE()这个怎么把全局中断都关掉了。也只能在 SAFE_ATOM_CODE 里面用了,貌似不 ...

请问你在keil下获取中段状态的宏问题解决了吗?我也遇到了同样的问题。key_task放在中断里面就不会运行了,放在主函数中就可以正常的用。

bigwei 发表于 2015-12-23 20:59:31

成功移植,可以用,但是还有问题,继续研究~

yzn327 发表于 2015-12-25 22:45:21

先MARK一下,下次再来看

yanzhiwei 发表于 2015-12-26 15:17:20

好贴顶起来,收藏了
页: 1 2 3 4 [5] 6
查看完整版本: [分享][交流]发一个通用按键模块,简单易用 [2014-3-24 Update]