Open FFBoard
Open source force feedback firmware
I2C.h
Go to the documentation of this file.
1/*
2 * I2C.h
3 *
4 * Created on: 10.03.2022
5 * Author: Yannick
6 */
7
8#ifndef SRC_I2C_H_
9#define SRC_I2C_H_
10
11#include "constants.h"
12#ifdef I2CBUS
13#include "semaphore.hpp"
14#include "cppmain.h"
15#include "I2CHandler.h"
16#include "PersistentStorage.h"
17#include "CommandHandler.h"
18#include <array>
19//#define I2C_COMMANDS_DISABLED_IF_NOT_USED
20#include <span>
24class I2CPort;
26 friend I2CPort;
27public:
28 struct I2CPortHardwareConfig_preset{// Helper for preset entries
29 I2C_InitTypeDef init;
30 const char* name;
31 };
32 constexpr I2CPortHardwareConfig(const bool canChangeSpeed,std::span<const I2CPortHardwareConfig_preset> presets_list)
33 : canChangeSpeed(canChangeSpeed),presets(presets_list){}
34
35 // Values
36 const bool canChangeSpeed;
37 I2CPortHardwareConfig_preset getPreset(uint8_t idx) const {return I2CPortHardwareConfig_preset(presets[std::min<uint8_t>(idx,presets.size())]);}
38protected:
39 const std::span<const I2CPortHardwareConfig_preset> presets; // Name for listing and init types for setup
40};
41
42class I2CDevice;
43class I2CPort : public I2CHandler, public CommandHandler, public PersistentStorage{
44 enum class I2CPort_commands : uint32_t {speed};
45public:
46 I2CPort(I2C_HandleTypeDef &hi2c,const I2CPortHardwareConfig& presets,uint8_t instance = 0);
47 virtual ~I2CPort();
48
49
50 void configurePort(I2C_InitTypeDef* config); // Reconfigures the i2c port
51 void resetPort();
52
53 void takePort(I2CDevice* device);
54 void freePort(I2CDevice* device);
55 int32_t getPortUsers(){return portUsers;}
56
57 void setSpeedPreset(uint8_t preset);
58 uint8_t getSpeedPreset();
59
60 bool transmitMaster(I2CDevice* device, const uint16_t addr,uint8_t* pData,const uint16_t size,const uint32_t timeout,bool shiftAddr = true);
61 bool transmitMasterDMA(I2CDevice* device,const uint16_t addr,uint8_t* pData,const uint16_t size,bool shiftAddr = true);
62 bool transmitMasterIT(I2CDevice* device,const uint16_t addr,uint8_t* pData,const uint16_t size,bool shiftAddr = true);
63
64 bool receiveMaster(I2CDevice* device,const uint16_t addr,uint8_t* pData,const uint16_t size,const uint32_t timeout,bool shiftAddr = true);
65 bool receiveMasterDMA(I2CDevice* device,const uint16_t addr,uint8_t* pData,const uint16_t size,bool shiftAddr = true);
66 bool receiveMasterIT(I2CDevice* device,const uint16_t addr,uint8_t* pData,const uint16_t size,bool shiftAddr = true);
67
68 bool writeMem(I2CDevice* device,const uint16_t devAddr,const uint16_t memAddr,const uint16_t memAddSize,uint8_t* pData,const uint16_t size,const uint32_t timeout,bool shiftAddr = true);
69 bool readMem(I2CDevice* device,const uint16_t devAddr,const uint16_t memAddr,const uint16_t memAddSize,uint8_t* pData,const uint16_t size,const uint32_t timeout,bool shiftAddr = true);
70 bool readMemIT(I2CDevice* device,const uint16_t devAddr,const uint16_t memAddr,const uint16_t memAddSize,uint8_t* pData,const uint16_t size,bool shiftAddr = true);
71 bool writeMemIT(I2CDevice* device,const uint16_t devAddr,const uint16_t memAddr,const uint16_t memAddSize,uint8_t* pData,const uint16_t size,bool shiftAddr = true);
72
73 bool isDeviceReady(I2CDevice* device,const uint16_t devAddr,const uint32_t trials,uint32_t timeout,bool shiftAddr = true);
74
75 void takeSemaphore();
76 void giveSemaphore();
77 bool isTaken();
78
79 void I2cTxCplt(I2C_HandleTypeDef *hi2c);
80 void I2cRxCplt(I2C_HandleTypeDef *hi2c);
81 void I2cError(I2C_HandleTypeDef *hi2c);
82
83 // Config
84 enum class CanPort_commands : uint32_t {speed};
85 CommandStatus command(const ParsedCommand& cmd,std::vector<CommandReply>& replies);
86 void registerCommands();
87 void saveFlash();
88 void restoreFlash();
90 const ClassIdentifier getInfo(){return this->info;}
91 const ClassType getClassType() override {return ClassType::Port;};
92
93
94private:
96 //volatile bool isTakenFlag = false;
97 I2C_HandleTypeDef& hi2c;
99 int32_t portUsers = 0;
100 uint8_t speedPreset = 0;
101 I2C_InitTypeDef config;
103};
104
105
107public:
108 I2CDevice();
109 //I2CDevice(I2CPort& port);
110 virtual ~I2CDevice();
111
112 virtual void startI2CTransfer(I2CPort* port);
113 virtual void endI2CTransfer(I2CPort* port);
114 virtual void i2cTxCompleted(I2CPort* port);
115 virtual void i2cRxCompleted(I2CPort* port);
116 virtual void i2cError(I2CPort* port);
117
118//protected:
119// I2CDevice* port = nullptr;
120};
121#endif
122
123#endif /* SRC_I2C_H_ */
ClassType
Definition: ClassIDs.h:12
CommandStatus
Definition: I2C.h:106
virtual void i2cError(I2CPort *port)
Definition: I2C.cpp:328
virtual void i2cTxCompleted(I2CPort *port)
Definition: I2C.cpp:322
virtual void i2cRxCompleted(I2CPort *port)
Definition: I2C.cpp:325
virtual void startI2CTransfer(I2CPort *port)
Definition: I2C.cpp:313
virtual ~I2CDevice()
Definition: I2C.cpp:309
I2CDevice()
Definition: I2C.cpp:306
virtual void endI2CTransfer(I2CPort *port)
Definition: I2C.cpp:317
const std::span< const I2CPortHardwareConfig_preset > presets
Definition: I2C.h:39
I2CPortHardwareConfig_preset getPreset(uint8_t idx) const
Definition: I2C.h:37
const bool canChangeSpeed
Definition: I2C.h:36
constexpr I2CPortHardwareConfig(const bool canChangeSpeed, std::span< const I2CPortHardwareConfig_preset > presets_list)
Definition: I2C.h:32
friend I2CPort
Definition: I2C.h:26
Definition: I2C.h:43
bool writeMemIT(I2CDevice *device, const uint16_t devAddr, const uint16_t memAddr, const uint16_t memAddSize, uint8_t *pData, const uint16_t size, bool shiftAddr=true)
Definition: I2C.cpp:224
uint8_t speedPreset
Definition: I2C.h:100
cpp_freertos::BinarySemaphore semaphore
Definition: I2C.h:95
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
Definition: I2C.cpp:83
void registerCommands()
Definition: I2C.cpp:78
const I2CPortHardwareConfig & presets
Definition: I2C.h:102
virtual ~I2CPort()
Definition: I2C.cpp:43
void I2cError(I2C_HandleTypeDef *hi2c)
Definition: I2C.cpp:268
void takeSemaphore()
Definition: I2C.cpp:280
bool isDeviceReady(I2CDevice *device, const uint16_t devAddr, const uint32_t trials, uint32_t timeout, bool shiftAddr=true)
Definition: I2C.cpp:232
I2C_HandleTypeDef & hi2c
Definition: I2C.h:97
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
Definition: I2C.h:90
bool transmitMasterDMA(I2CDevice *device, const uint16_t addr, uint8_t *pData, const uint16_t size, bool shiftAddr=true)
Definition: I2C.cpp:167
void giveSemaphore()
Definition: I2C.cpp:293
bool receiveMasterIT(I2CDevice *device, const uint16_t addr, uint8_t *pData, const uint16_t size, bool shiftAddr=true)
Definition: I2C.cpp:193
bool receiveMaster(I2CDevice *device, const uint16_t addr, uint8_t *pData, const uint16_t size, const uint32_t timeout, bool shiftAddr=true)
Definition: I2C.cpp:179
void restoreFlash()
Definition: I2C.cpp:55
int32_t portUsers
Definition: I2C.h:99
bool transmitMaster(I2CDevice *device, const uint16_t addr, uint8_t *pData, const uint16_t size, const uint32_t timeout, bool shiftAddr=true)
Definition: I2C.cpp:159
CanPort_commands
Definition: I2C.h:84
bool readMem(I2CDevice *device, const uint16_t devAddr, const uint16_t memAddr, const uint16_t memAddSize, uint8_t *pData, const uint16_t size, const uint32_t timeout, bool shiftAddr=true)
Definition: I2C.cpp:208
void freePort(I2CDevice *device)
Definition: I2C.cpp:132
bool readMemIT(I2CDevice *device, const uint16_t devAddr, const uint16_t memAddr, const uint16_t memAddSize, uint8_t *pData, const uint16_t size, bool shiftAddr=true)
Definition: I2C.cpp:216
I2CPort(I2C_HandleTypeDef &hi2c, const I2CPortHardwareConfig &presets, uint8_t instance=0)
Definition: I2C.cpp:35
I2C_InitTypeDef config
Definition: I2C.h:101
void saveFlash()
Definition: I2C.cpp:47
void I2cTxCplt(I2C_HandleTypeDef *hi2c)
Definition: I2C.cpp:240
void takePort(I2CDevice *device)
Definition: I2C.cpp:117
void I2cRxCplt(I2C_HandleTypeDef *hi2c)
Definition: I2C.cpp:254
static ClassIdentifier info
Definition: I2C.h:89
bool writeMem(I2CDevice *device, const uint16_t devAddr, const uint16_t memAddr, const uint16_t memAddSize, uint8_t *pData, const uint16_t size, const uint32_t timeout, bool shiftAddr=true)
Definition: I2C.cpp:200
void configurePort(I2C_InitTypeDef *config)
Definition: I2C.cpp:150
int32_t getPortUsers()
Definition: I2C.h:55
void resetPort()
Definition: I2C.cpp:108
void setSpeedPreset(uint8_t preset)
Definition: I2C.cpp:65
const ClassType getClassType() override
Definition: I2C.h:91
bool receiveMasterDMA(I2CDevice *device, const uint16_t addr, uint8_t *pData, const uint16_t size, bool shiftAddr=true)
Definition: I2C.cpp:187
I2CDevice * currentDevice
Definition: I2C.h:98
bool transmitMasterIT(I2CDevice *device, const uint16_t addr, uint8_t *pData, const uint16_t size, bool shiftAddr=true)
Definition: I2C.cpp:173
I2CPort_commands
Definition: I2C.h:44
uint8_t getSpeedPreset()
Definition: I2C.cpp:74
bool isTaken()
Definition: I2C.cpp:276