Open FFBoard
Open source force feedback firmware
CanButtons.cpp
Go to the documentation of this file.
1/*
2 * CanButtons.cpp
3 *
4 * Created on: 06.04.2022
5 * Author: Yannick
6 */
7
8#include "CanButtons.h"
9#include "math.h"
10
11#ifdef CANBUTTONS
13 .name = "CAN Buttons" ,
14 .id=CLSID_BTN_CAN,
15 };
17 return info;
18}
19
20CanButtons::CanButtons() : CommandHandler("canbtn", CLSID_BTN_CAN, 0) {
23 registerCommand("btnnum", CanButtons_commands::btnnum, "Amount of buttons",CMDFLAG_GET | CMDFLAG_SET);
24 registerCommand("invert", CanButtons_commands::invert, "Invert buttons",CMDFLAG_GET | CMDFLAG_SET);
25 registerCommand("canid", CanButtons_commands::canid, "CAN frame ID",CMDFLAG_GET | CMDFLAG_SET);
27
29}
30
32 if(filterId != -1){
34 }
35// CAN_FilterTypeDef sFilterConfig;
36// sFilterConfig.FilterBank = 0;
37// sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
38// sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
39// sFilterConfig.FilterIdHigh = (canId << 5); // Just one ID
40// sFilterConfig.FilterIdLow = 0x0000;
41// sFilterConfig.FilterMaskIdHigh = 0xFFFF;
42// sFilterConfig.FilterMaskIdLow = 0x0000;
43// sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
44// sFilterConfig.FilterActivation = ENABLE;
45// sFilterConfig.SlaveStartFilterBank = 14;
46
47 CAN_filter filterConf;
48 filterConf.buffer = 0;
49 filterConf.filter_id = canId;
50 filterConf.filter_mask = 0xFFFF;
51
52 this->filterId = this->port->addCanFilter(filterConf);
53
54 //this->port->setSpeedPreset(CANSPEEDPRESET_500); // default speed used
55 this->port->start();
56}
57
59 if(filterId != -1)
61}
62
64 uint16_t conf1 = (btnnum-1) & 0x3F;
65 conf1 |= (invert & 0x1) << 6;
66 Flash_Write(ADR_CANBTN_CONF1, conf1);
67
68 uint16_t conf2 = canId & 0x7ff;
69 Flash_Write(ADR_CANBTN_CONF2, conf2);
70}
71
73 uint16_t conf;
74 if(Flash_Read(ADR_CANBTN_CONF1, &conf)){
75 setBtnNum((conf & 0x3F) +1);
76 invert = (conf >> 6) & 0x1;
77 }
78 // CAN settings
79 if(Flash_Read(ADR_CANBTN_CONF2, &conf)){
80 canId = conf & 0x7ff;
81 }
82}
83
84void CanButtons::setBtnNum(uint8_t num){
85 num = clip<uint8_t,uint8_t>(num, 1, 64); // up to 8 PCF8574 can be chained resulting in 64 buttons
86 this->btnnum = num;
87 if(num == 64){ // Special case
88 mask = 0xffffffffffffffff;
89 }else{
90 mask = (uint64_t)pow<uint64_t>(2,num)-(uint64_t)1; // Must be done completely in 64 bit!
91 }
92}
93
94
95uint8_t CanButtons::readButtons(uint64_t* buf){
96 if(invert){
97 *buf = ~currentButtons;
98 }else{
99 *buf = currentButtons;
100 }
101 *buf &= mask;
103}
104
105CommandStatus CanButtons::command(const ParsedCommand& cmd,std::vector<CommandReply>& replies){
106
107 switch(static_cast<CanButtons_commands>(cmd.cmdId)){
108
110 if(cmd.type == CMDtype::get){
111 replies.emplace_back(this->btnnum);
112 }else if(cmd.type == CMDtype::set){
113 setBtnNum(cmd.val);
114 }
115 break;
117 return handleGetSet(cmd, replies, this->invert);
118 break;
119
121 if(cmd.type == CMDtype::get){
122 replies.emplace_back(this->canId);
123 }else if(cmd.type == CMDtype::set){
124 canId = (cmd.val) & 0x7ff;
125 setupCanPort(); // Set can filter
126 }
127 break;
128
129 default:
131 }
132 return CommandStatus::OK;
133}
134
136
137 uint32_t id = (msg.header.id) & 0x7FF;
138 pulseClipLed();
139 if(id != this->canId || msg.header.rtr || msg.header.length != 8){
140 return;
141 }
142
143 currentButtons = *reinterpret_cast<uint64_t*>(msg.data);
144}
145
146
147#endif
CommandStatus
uint16_t btnnum
Definition: ButtonSource.h:38
bool rtr
Definition: CAN.h:73
uint32_t id
Definition: CAN.h:70
uint32_t length
Definition: CAN.h:71
Definition: CAN.h:119
virtual bool start()=0
virtual int32_t addCanFilter(CAN_filter filter)=0
virtual void removeCanFilter(uint8_t filterId)=0
volatile uint64_t currentButtons
Definition: CanButtons.h:52
int32_t filterId
Definition: CanButtons.h:48
uint64_t mask
Definition: CanButtons.h:50
void setBtnNum(uint8_t num)
Definition: CanButtons.cpp:84
virtual ~CanButtons()
Definition: CanButtons.cpp:58
CanButtons_commands
Definition: CanButtons.h:24
void setupCanPort()
Definition: CanButtons.cpp:31
uint8_t readButtons(uint64_t *buf)
Definition: CanButtons.cpp:95
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
Definition: CanButtons.cpp:105
const ClassIdentifier getInfo()
Definition: CanButtons.cpp:16
bool invert
Definition: CanButtons.h:46
void restoreFlash()
Definition: CanButtons.cpp:72
static ClassIdentifier info
Definition: CanButtons.h:32
void canRxPendCallback(CANPort *port, CAN_rx_msg &msg) override
Definition: CanButtons.cpp:135
uint32_t canId
Definition: CanButtons.h:47
CANPort * port
Definition: CanButtons.h:49
void saveFlash()
Definition: CanButtons.cpp:63
void registerCommand(const char *cmd, const ID cmdid, const char *help=nullptr, uint32_t flags=0)
static CommandStatus handleGetSet(const ParsedCommand &cmd, std::vector< CommandReply > &replies, TVal &value)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
void pulseClipLed()
Definition: ledEffects.cpp:49
uint32_t buffer
Definition: CAN.h:110
uint32_t filter_mask
Definition: CAN.h:109
uint32_t filter_id
Definition: CAN.h:108
Definition: CAN.h:96
uint8_t data[CAN_MSGBUFSIZE]
Definition: CAN.h:97
CAN_msg_header_rx header
Definition: CAN.h:99
const char * name
uint32_t cmdId