Open FFBoard
Open source force feedback firmware
SelectableInputs.cpp
Go to the documentation of this file.
1/*
2 * SelectableInputs.cpp
3 *
4 * Created on: Apr 28, 2025
5 * Author: Yannick
6 */
7
8#include "SelectableInputs.h"
9
11: btn_chooser(btn_chooser), analog_chooser(analog_chooser)
12{
13 analogsources_buf.reserve(8);
14}
15
19}
20
21// Buttons
23 // Destruct all button sources
24
25 this->btns.clear();
26}
27
28void SelectableInputs::setBtnTypes(uint16_t btntypes){
30 this->btnsources = btntypes;
32 for(uint8_t id = 0;id<16;id++){
33 if((btntypes >> id) & 0x1){
34 // Matching flag
35 ButtonSource* btn = btn_chooser.Create(id);
36 if(btn!=nullptr)
37 this->btns.push_back(std::unique_ptr<ButtonSource>(btn));
38 }
39 }
41}
42
44 for(auto &btn : this->btns){
45 if(btn->getInfo().id == id){
46 return;
47 }
48 }
49 ButtonSource* btn = btn_chooser.Create(id);
50 if(btn!=nullptr)
51 this->btns.push_back(std::unique_ptr<ButtonSource>(btn));
52}
53
54// Analog
56 // Destruct all button sources
57
58 this->analog_inputs.clear();
59}
60
61void SelectableInputs::setAinTypes(uint16_t aintypes){
63 this->ainsources = aintypes;
65 for(uint8_t id = 0;id<16;id++){
66 if((aintypes >> id) & 0x1){
67 // Matching flag
68 AnalogSource* ain = analog_chooser.Create(id);
69 if(ain!=nullptr)
70 this->analog_inputs.push_back(std::unique_ptr<AnalogSource>(ain));
71 }
72 }
74}
76 for(auto &ain : this->analog_inputs){
77 if(ain->getInfo().id == id){
78 return;
79 }
80 }
81 AnalogSource* ain = analog_chooser.Create(id);
82 if(ain!=nullptr)
83 this->analog_inputs.push_back(std::unique_ptr<AnalogSource>(ain));
84}
85
89uint8_t SelectableInputs::getButtonValues(uint64_t &values){
90 uint8_t shift = 0;
91 if(btns.size() != 0){
92 for(auto &btn : btns){
93 uint64_t buf = 0;
94 uint8_t amount = btn->readButtons(&buf);
95 values |= buf << shift;
96 shift += amount;
97 }
98 }
99 return shift;
100}
101
105std::vector<int32_t>* SelectableInputs::getAnalogValues(){
107 analogsources_buf.clear();
108 for(auto &ain : analog_inputs){
109 std::vector<int32_t>* buf = ain->getAxes();
110 analogsources_buf.insert(analogsources_buf.end(), buf->begin(), buf->end());
111 }
113 return &analogsources_buf;
114}
virtual void setAinTypes(uint16_t aintypes)
virtual void setBtnTypes(uint16_t btntypes)
virtual void clearAinTypes()
virtual void addAinType(uint16_t id)
std::vector< int32_t > analogsources_buf
cpp_freertos::BinarySemaphore sourcesSem
virtual std::vector< int32_t > * getAnalogValues()
virtual void addBtnType(uint16_t id)
ClassChooser< AnalogSource > analog_chooser
SelectableInputs(const ClassChooser< ButtonSource > &btn_chooser, const ClassChooser< AnalogSource > &analog_chooser)
virtual void clearBtnTypes()
std::vector< std::unique_ptr< ButtonSource > > btns
std::vector< std::unique_ptr< AnalogSource > > analog_inputs
ClassChooser< ButtonSource > btn_chooser
virtual ~SelectableInputs()
virtual uint8_t getButtonValues(uint64_t &values)
bool Take(TickType_t Timeout=portMAX_DELAY)
Definition: csemaphore.cpp:46