Buttons with function pointer when press or release
This commit is contained in:
parent
3f1ce81ad5
commit
06ad7c948b
179
02-UML/ST_BUTTON.uxf
Normal file
179
02-UML/ST_BUTTON.uxf
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<diagram program="umlet" version="15.1">
|
||||||
|
<zoom_level>14</zoom_level>
|
||||||
|
<element>
|
||||||
|
<id>UMLSpecialState</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>546</x>
|
||||||
|
<y>140</y>
|
||||||
|
<w>28</w>
|
||||||
|
<h>28</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>type=initial</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLState</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>210</x>
|
||||||
|
<y>364</y>
|
||||||
|
<w>196</w>
|
||||||
|
<h>56</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>ST_PBPRESSED</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLState</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>714</x>
|
||||||
|
<y>364</y>
|
||||||
|
<w>196</w>
|
||||||
|
<h>56</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>ST_PBRELEASED</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>798</x>
|
||||||
|
<y>406</y>
|
||||||
|
<w>126</w>
|
||||||
|
<h>168</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
evPBPoll</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;10.0;100.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>546</x>
|
||||||
|
<y>154</y>
|
||||||
|
<w>126</w>
|
||||||
|
<h>126</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
evPBInit</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;10.0;70.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLSpecialState</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>532</x>
|
||||||
|
<y>252</y>
|
||||||
|
<w>56</w>
|
||||||
|
<h>56</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>type=decision</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>294</x>
|
||||||
|
<y>266</y>
|
||||||
|
<w>266</w>
|
||||||
|
<h>126</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
m1=[pB==1]</panel_attributes>
|
||||||
|
<additional_attributes>170.0;10.0;10.0;10.0;10.0;70.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>294</x>
|
||||||
|
<y>406</y>
|
||||||
|
<w>126</w>
|
||||||
|
<h>126</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
evPBPoll</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;10.0;70.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>574</x>
|
||||||
|
<y>266</y>
|
||||||
|
<w>266</w>
|
||||||
|
<h>126</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
m1=[pB==0]</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;170.0;10.0;170.0;70.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLSpecialState</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>280</x>
|
||||||
|
<y>504</y>
|
||||||
|
<w>56</w>
|
||||||
|
<h>56</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>type=decision</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLSpecialState</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>784</x>
|
||||||
|
<y>546</y>
|
||||||
|
<w>56</w>
|
||||||
|
<h>56</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>type=decision</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>350</x>
|
||||||
|
<y>308</y>
|
||||||
|
<w>462</w>
|
||||||
|
<h>308</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
m1=[pB==1] / pbPress()</panel_attributes>
|
||||||
|
<additional_attributes>310.0;190.0;260.0;190.0;40.0;10.0;10.0;10.0;10.0;40.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>322</x>
|
||||||
|
<y>308</y>
|
||||||
|
<w>462</w>
|
||||||
|
<h>266</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
|
||||||
|
m1=[pB==0] / pbRelease()</panel_attributes>
|
||||||
|
<additional_attributes>10.0;160.0;60.0;160.0;280.0;10.0;310.0;10.0;310.0;40.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>154</x>
|
||||||
|
<y>308</y>
|
||||||
|
<w>154</w>
|
||||||
|
<h>266</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
m1=[else]</panel_attributes>
|
||||||
|
<additional_attributes>90.0;160.0;10.0;160.0;10.0;10.0;70.0;10.0;70.0;40.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>826</x>
|
||||||
|
<y>308</y>
|
||||||
|
<w>154</w>
|
||||||
|
<h>308</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->
|
||||||
|
m1=[else]</panel_attributes>
|
||||||
|
<additional_attributes>10.0;190.0;90.0;190.0;90.0;10.0;30.0;10.0;30.0;40.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
</diagram>
|
@ -86,9 +86,16 @@ void Factory_init() {
|
|||||||
BUTTON_initHW(b3());
|
BUTTON_initHW(b3());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lON(){
|
||||||
|
LED_on(l9());
|
||||||
|
}
|
||||||
|
void lOFF() {
|
||||||
|
LED_off(l9());
|
||||||
|
}
|
||||||
|
|
||||||
//connect objects if required
|
//connect objects if required
|
||||||
void Factory_build() {
|
void Factory_build() {
|
||||||
|
BUTTON_setEventFunctions(b1(), &lON, &lOFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
//start all state machines
|
//start all state machines
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/* this is the Factory class */
|
/* this is the Factory class */
|
||||||
|
|
||||||
|
|
||||||
#ifndef FACTORY_ONCE
|
#ifndef FACTORY_H
|
||||||
#define FACTORY_ONCE
|
#define FACTORY_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
|
|
||||||
#include "../mcc_generated_files/mcc.h"
|
#include "../mcc_generated_files/mcc.h"
|
||||||
#include "../board/led/led.h"
|
|
||||||
#include "../app/factory/factory.h"
|
#include "../app/factory/factory.h"
|
||||||
#include "../xf/xf.h"
|
#include "../xf/xf.h"
|
||||||
#include "../board/button/button.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "../../mcc_generated_files/pin_manager.h"
|
#include "../../mcc_generated_files/pin_manager.h"
|
||||||
#include "../led/led.h"
|
|
||||||
#include "../../app/factory/factory.h"
|
#include "../../app/factory/factory.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,31 +81,29 @@ bool BUTTON_processEvent(Event * ev) {
|
|||||||
switch(me->state){
|
switch(me->state){
|
||||||
case ST_PBINIT:
|
case ST_PBINIT:
|
||||||
if (evid == evPBInit) {
|
if (evid == evPBInit) {
|
||||||
|
POST(me, &BUTTON_processEvent, evPBPoll, 0, 0);
|
||||||
if(BUTTON_isPressed(me)) {
|
if(BUTTON_isPressed(me)) {
|
||||||
me->state = ST_PBPRESSED;
|
me->state = ST_PBPRESSED;
|
||||||
} else {
|
} else {
|
||||||
me->state = ST_PBRELEASED;
|
me->state = ST_PBRELEASED;
|
||||||
}
|
}
|
||||||
POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ST_PBPOLL:
|
|
||||||
break;
|
|
||||||
case ST_PBRELEASED:
|
case ST_PBRELEASED:
|
||||||
if(evid == evPBPoll) {
|
if(evid == evPBPoll) {
|
||||||
|
POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
|
||||||
if(BUTTON_isPressed(me)) {
|
if(BUTTON_isPressed(me)) {
|
||||||
me->state = ST_PBPRESSED;
|
me->state = ST_PBPRESSED;
|
||||||
}
|
}
|
||||||
POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case ST_PBPRESSED:
|
case ST_PBPRESSED:
|
||||||
if(evid == evPBPoll) {
|
if(evid == evPBPoll) {
|
||||||
|
POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
|
||||||
if(!BUTTON_isPressed(me)){
|
if(!BUTTON_isPressed(me)){
|
||||||
me->state = ST_PBRELEASED;
|
me->state = ST_PBRELEASED;
|
||||||
}
|
}
|
||||||
POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -116,16 +113,19 @@ bool BUTTON_processEvent(Event * ev) {
|
|||||||
switch(me->state){
|
switch(me->state){
|
||||||
case ST_PBINIT:
|
case ST_PBINIT:
|
||||||
break;
|
break;
|
||||||
case ST_PBPOLL:
|
|
||||||
break;
|
|
||||||
case ST_PBRELEASED:
|
case ST_PBRELEASED:
|
||||||
LED_off(l10());
|
if(me->fButtonRelease != NULL) me->fButtonRelease();
|
||||||
break;
|
break;
|
||||||
case ST_PBPRESSED:
|
case ST_PBPRESSED:
|
||||||
LED_on(l10());
|
if(me->fButtonPress != NULL) me->fButtonPress();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
processed = true;
|
processed = true;
|
||||||
}
|
}
|
||||||
return processed;
|
return processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BUTTON_setEventFunctions(BUTTON* me, void (*fPress)(void), void (*fRelease)(void)) {
|
||||||
|
me->fButtonPress = fPress;
|
||||||
|
me->fButtonRelease = fRelease;
|
||||||
|
}
|
@ -14,13 +14,14 @@
|
|||||||
|
|
||||||
#define PB_POLL_TIME 20
|
#define PB_POLL_TIME 20
|
||||||
|
|
||||||
typedef enum {ST_PBINIT, ST_PBWAIT, ST_PBPOLL, ST_PBRELEASED, ST_PBPRESSED} BUTTON_STATES;
|
typedef enum {ST_PBINIT, ST_PBRELEASED, ST_PBPRESSED} BUTTON_STATES;
|
||||||
typedef enum {evPBInit=100, evPBPoll} BUTTON_EVENTS;
|
typedef enum {evPBInit=100, evPBPoll} BUTTON_EVENTS;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
BUTTON_STATES state;
|
BUTTON_STATES state;
|
||||||
|
void (*fButtonPress)(void);
|
||||||
|
void (*fButtonRelease)(void);
|
||||||
} BUTTON;
|
} BUTTON;
|
||||||
|
|
||||||
void BUTTON_init(BUTTON* me, uint8_t id);
|
void BUTTON_init(BUTTON* me, uint8_t id);
|
||||||
@ -28,5 +29,6 @@ void BUTTON_initHW(BUTTON* me);
|
|||||||
bool BUTTON_isPressed(BUTTON* me);
|
bool BUTTON_isPressed(BUTTON* me);
|
||||||
void BUTTON_startBehaviour(BUTTON* me);
|
void BUTTON_startBehaviour(BUTTON* me);
|
||||||
bool BUTTON_processEvent(Event* ev);
|
bool BUTTON_processEvent(Event* ev);
|
||||||
|
void BUTTON_setEventFunctions(BUTTON* me, void (*fPress)(void), void (*fRelease)(void));
|
||||||
|
|
||||||
#endif /* BUTTON_H */
|
#endif /* BUTTON_H */
|
Reference in New Issue
Block a user