Open FFBoard
Open source force feedback firmware
SPIButtons.h
Go to the documentation of this file.
1/*
2 * ButtonSourceSPI.h
3 *
4 * Created on: 11.02.2020
5 * Author: Yannick
6 */
7
8#ifndef SPIBUTTONS_H_
9#define SPIBUTTONS_H_
10
11#include "CommandHandler.h"
12#include <ButtonSource.h>
13#include "cppmain.h"
14#include "ChoosableClass.h"
15
16#include "SPI.h"
17#include "cpp_target_config.h"
18
19// Set this to 64, 128 or 256 to slow down SPI if unstable.
20#define SPIBUTTONS_SPEED SPI_BAUDRATEPRESCALER_32
21
22enum class SPI_BtnMode : uint8_t {TM=0,PISOSR=1};
23
24
26 uint8_t numButtons = 8;
27 bool cutRight = false; // if num buttons to read are not byte aligned specify where to shift
28 bool invert = false;
30 uint8_t cs_num = 0;
31 uint8_t spi_speed = 1; // Medium
32};
33
34
35class SPI_Buttons: public ButtonSource,public CommandHandler,public SPIDevice {
36
37 enum class SPIButtons_commands : uint32_t {
39 };
40
41public:
42 static const std::vector<std::string> mode_names;
43 static const std::vector<std::string> speed_names;
44
45 virtual ~SPI_Buttons();
46
47 uint8_t readButtons(uint64_t* buf);
48
49 CommandStatus command(const ParsedCommand& cmd,std::vector<CommandReply>& replies) override;
50 void registerCommands();
51 virtual std::string getHelpstring(){return "SPI 2 Button";}
52
53 void saveFlash();
54 void restoreFlash();
55
56 const uint8_t maxButtons = 64;
57 std::string printModes(const std::vector<std::string>& names);
58
59 void setMode(SPI_BtnMode mode);
60 void initSPI();
62
63 void setSpiSpeed(uint8_t speedPreset);
64
65protected:
67
68private:
71 bool ready = false;
72 void setConfig(ButtonSourceConfig config);
74 void process(uint64_t* buf);
75 uint8_t bytes = 4;
76 uint64_t mask = 0xff;
77 uint8_t offset = 0;
78
80
81 uint8_t spi_buf[4] = {0};
82
83 static constexpr std::array<uint32_t,3> speedPresets= {SPI_BAUDRATEPRESCALER_16,SPI_BAUDRATEPRESCALER_32,SPI_BAUDRATEPRESCALER_64};
84};
85
86class SPI_Buttons_1 : public SPI_Buttons {
87public:
89 : SPI_Buttons{ADR_SPI_BTN_1_CONF, ADR_SPI_BTN_1_CONF_2} {
90 setInstance(0);
91 }
92
93 const ClassIdentifier getInfo() override;
95 static bool isCreatable();
96 static bool exists;
97};
98
99class SPI_Buttons_2 : public SPI_Buttons {
100public:
102 : SPI_Buttons{ADR_SPI_BTN_2_CONF, ADR_SPI_BTN_2_CONF_2} {
103 setInstance(1);
104 }
105
106 const ClassIdentifier getInfo() override;
108 static bool isCreatable();
109};
110
111#endif /* SPIBUTTONS_H_ */
ClassType
Definition: ClassIDs.h:12
CommandStatus
SPI_BtnMode
Definition: SPIButtons.h:22
void setInstance(uint8_t instance)
const ClassIdentifier getInfo() override
Definition: SPIButtons.cpp:25
static bool isCreatable()
Definition: SPIButtons.cpp:29
static ClassIdentifier info
Definition: SPIButtons.h:94
static bool exists
Definition: SPIButtons.h:96
static ClassIdentifier info
Definition: SPIButtons.h:107
static bool isCreatable()
Definition: SPIButtons.cpp:41
const ClassIdentifier getInfo() override
Definition: SPIButtons.cpp:37
virtual ~SPI_Buttons()
Definition: SPIButtons.cpp:74
uint8_t bytes
Definition: SPIButtons.h:75
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies) override
Definition: SPIButtons.cpp:202
void setSpiSpeed(uint8_t speedPreset)
Definition: SPIButtons.cpp:146
static const std::vector< std::string > speed_names
Definition: SPIButtons.h:43
void restoreFlash()
Definition: SPIButtons.cpp:160
void setConfig(ButtonSourceConfig config)
Definition: SPIButtons.cpp:97
ButtonSourceConfig conf
Definition: SPIButtons.h:79
uint8_t readButtons(uint64_t *buf)
uint16_t configuration_address
Definition: SPIButtons.h:69
virtual ButtonSourceConfig * getConfig()
Definition: SPIButtons.cpp:142
SPI_Buttons(uint16_t configuration_address, uint16_t configuration_address_2)
Definition: SPIButtons.cpp:47
const ClassType getClassType() override
returns the used classchooser selection id of this instance
Definition: SPIButtons.h:61
static constexpr std::array< uint32_t, 3 > speedPresets
Definition: SPIButtons.h:83
uint64_t mask
Definition: SPIButtons.h:76
const uint8_t maxButtons
Definition: SPIButtons.h:56
static const std::vector< std::string > mode_names
Definition: SPIButtons.h:42
void saveFlash()
Definition: SPIButtons.cpp:153
uint16_t configuration_address_2
Definition: SPIButtons.h:70
void initSPI()
Definition: SPIButtons.cpp:68
bool ready
Definition: SPIButtons.h:71
void setMode(SPI_BtnMode mode)
Definition: SPIButtons.cpp:92
uint8_t spi_buf[4]
Definition: SPIButtons.h:81
virtual std::string getHelpstring()
Definition: SPIButtons.h:51
std::string printModes(const std::vector< std::string > &names)
Definition: SPIButtons.cpp:194
uint8_t offset
Definition: SPIButtons.h:77
void registerCommands()
Definition: SPIButtons.cpp:79
void process(uint64_t *buf)
Definition: SPIButtons.cpp:167
Definition: SPI.h:100
SPI_BtnMode mode
Definition: SPIButtons.h:29
uint8_t numButtons
Definition: SPIButtons.h:26