Buttons with function pointer when press or release
This commit is contained in:
		
							
								
								
									
										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());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lON(){
 | 
			
		||||
    LED_on(l9());
 | 
			
		||||
}
 | 
			
		||||
void lOFF() {
 | 
			
		||||
    LED_off(l9());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//connect objects if required
 | 
			
		||||
void Factory_build() {
 | 
			
		||||
    
 | 
			
		||||
    BUTTON_setEventFunctions(b1(), &lON, &lOFF);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//start all state machines
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/* this is the Factory class */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef FACTORY_ONCE
 | 
			
		||||
#define FACTORY_ONCE
 | 
			
		||||
#ifndef FACTORY_H
 | 
			
		||||
#define FACTORY_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,7 @@
 | 
			
		||||
 | 
			
		||||
#include "../mcc_generated_files/mcc.h"
 | 
			
		||||
#include "../board/led/led.h"
 | 
			
		||||
#include "../app/factory/factory.h"
 | 
			
		||||
#include "../xf/xf.h"
 | 
			
		||||
#include "../board/button/button.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@
 | 
			
		||||
 | 
			
		||||
#include "button.h"
 | 
			
		||||
#include "../../mcc_generated_files/pin_manager.h"
 | 
			
		||||
#include "../led/led.h"
 | 
			
		||||
#include "../../app/factory/factory.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -82,31 +81,29 @@ bool BUTTON_processEvent(Event * ev) {
 | 
			
		||||
    switch(me->state){
 | 
			
		||||
        case ST_PBINIT:
 | 
			
		||||
            if (evid == evPBInit) {
 | 
			
		||||
                POST(me, &BUTTON_processEvent, evPBPoll, 0, 0);
 | 
			
		||||
                if(BUTTON_isPressed(me)) {
 | 
			
		||||
                    me->state = ST_PBPRESSED;
 | 
			
		||||
                } else {
 | 
			
		||||
                    me->state = ST_PBRELEASED;
 | 
			
		||||
                }
 | 
			
		||||
                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case ST_PBPOLL:
 | 
			
		||||
            break;
 | 
			
		||||
        case ST_PBRELEASED:
 | 
			
		||||
            if(evid == evPBPoll) {
 | 
			
		||||
                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
 | 
			
		||||
                if(BUTTON_isPressed(me)) {
 | 
			
		||||
                    me->state = ST_PBPRESSED;
 | 
			
		||||
                }
 | 
			
		||||
                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            break;
 | 
			
		||||
        case ST_PBPRESSED:
 | 
			
		||||
            if(evid == evPBPoll) {
 | 
			
		||||
                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);                
 | 
			
		||||
                if(!BUTTON_isPressed(me)){
 | 
			
		||||
                    me->state = ST_PBRELEASED;
 | 
			
		||||
                }
 | 
			
		||||
                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);                
 | 
			
		||||
                    
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
@@ -116,16 +113,19 @@ bool BUTTON_processEvent(Event * ev) {
 | 
			
		||||
        switch(me->state){
 | 
			
		||||
            case ST_PBINIT:
 | 
			
		||||
                break;
 | 
			
		||||
            case ST_PBPOLL:
 | 
			
		||||
                break;
 | 
			
		||||
            case ST_PBRELEASED:
 | 
			
		||||
                LED_off(l10());
 | 
			
		||||
                if(me->fButtonRelease != NULL) me->fButtonRelease();
 | 
			
		||||
                break;
 | 
			
		||||
            case ST_PBPRESSED:
 | 
			
		||||
                LED_on(l10());
 | 
			
		||||
                if(me->fButtonPress != NULL) me->fButtonPress();
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        processed = true;
 | 
			
		||||
    }
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
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 struct {
 | 
			
		||||
    uint8_t id;
 | 
			
		||||
    BUTTON_STATES state;
 | 
			
		||||
 | 
			
		||||
    void (*fButtonPress)(void);
 | 
			
		||||
    void (*fButtonRelease)(void);
 | 
			
		||||
} BUTTON;
 | 
			
		||||
 | 
			
		||||
void BUTTON_init(BUTTON* me, uint8_t id);
 | 
			
		||||
@@ -28,5 +29,6 @@ void BUTTON_initHW(BUTTON* me);
 | 
			
		||||
bool BUTTON_isPressed(BUTTON* me);
 | 
			
		||||
void BUTTON_startBehaviour(BUTTON* me);
 | 
			
		||||
bool BUTTON_processEvent(Event* ev);
 | 
			
		||||
void BUTTON_setEventFunctions(BUTTON* me, void (*fPress)(void), void (*fRelease)(void));
 | 
			
		||||
 | 
			
		||||
#endif	/* BUTTON_H */
 | 
			
		||||
		Reference in New Issue
	
	Block a user