-
Notifications
You must be signed in to change notification settings - Fork 0
/
ButtonMessageControl.h
90 lines (78 loc) · 2.43 KB
/
ButtonMessageControl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef ButtonMessageControl_h
#define ButtonMessageControl_h
#include "RFMessageControl.h"
#define MASTER 0
/*
* enum of command types
* array of callback functions?
*
*/
enum { ACKNOWLEDGE, BUTTON, LED, VIBRATE };
typedef struct pwm_command_s {
uint8_t shape;
uint8_t offset;
uint8_t duration;
uint8_t amplitude;
uint8_t period;
} pwm_command_t;
typedef struct {
uint8_t value;
} digital_command_t;
typedef struct {
uint8_t label;
union {
pwm_command_t pwm;
digital_command_t digital;
};
} od_command_header_t;
/*
* keep reference and metadata for command handlers
* allows for the handler to reply on the message
* but will send and ACKNOWLEDGE command if the handler does not wish to reply
*
*/
class CommandContext
{
public:
CommandContext(AbstractRFMessageControl * control) { _replied = false; _control = control;}
/*
* Allow for the handler to reply immediately
*/
void reply(od_command_header_t * command);
/*
* to be called from within the control to set the correct MessageQueueItem
*/
void setMessageQueueItem(MessageQueueItem * item){_item = item;}
/*
* control finalizes the MessageQueueItem, updates the command if needed to ACKNOWLEDGE
*/
void finalizeMessage();
AbstractRFMessageControl * control();
private:
bool _replied;
AbstractRFMessageControl * _control;
MessageQueueItem * _item;
};
typedef void (* DigitalCommand) (CommandContext * context, digital_command_t cmd);
typedef void (* PWMCommand) (CommandContext * context, pwm_command_t cmd);
class ButtonMessageControl: public AbstractRFMessageControl
{
public:
ButtonMessageControl(BaseSenderReceiver * transceiver) : AbstractRFMessageControl(transceiver){
handleButtonCommand = NULL;
handleVibrateCommand = NULL;
handleLedCommand = NULL;
}
virtual void handleIncommingMessage(MessageQueueItem * item);
virtual void handleIncommingReply(MessageQueueItem * item);
bool sendButtonEvent(bool pressed);
bool sendLedCommand(uint8_t toChannelID, pwm_command_t pwm);
bool sendLedCommand(uint8_t toChannelID, uint8_t shape,uint8_t offset,uint8_t duration,uint8_t amplitude,uint8_t period);
bool sendVibrateCommand(uint8_t toChannelID, pwm_command_t pwm);
bool sendVibrateCommand(uint8_t toChannelID, uint8_t shape,uint8_t offset,uint8_t duration,uint8_t amplitude,uint8_t period);
PWMCommand handleLedCommand;
PWMCommand handleVibrateCommand;
DigitalCommand handleButtonCommand;
private:
};
#endif