Open FFBoard
Open source force feedback firmware
AnalogAxisProcessing.h
Go to the documentation of this file.
1/*
2 * AnalogAxisProcessing.h
3 *
4 * Created on: Jun 29, 2022
5 * Author: Yannick
6 */
7
8#ifndef SRC_ANALOGAXISPROCESSING_H_
9#define SRC_ANALOGAXISPROCESSING_H_
10#include "constants.h"
11#include <optional>
12#include <vector>
13#include <array>
14#include "CommandHandler.h"
15#include "Filters.h"
16#include "limits.h"
17#include "AnalogSource.h"
18
19
21 bool autorange = false;
22 bool filtersEnabled = false;
23 bool raw = false;
24};
26 int32_t min = 0x7fff;
27 int32_t max = -0x7fff;
28};
30
32 values=0xAA0,filter=0xAA2,autoscale=0xAA3,rawvalues=0XAA1,min=0xAA4,max=0xAA5
33 };
34
35public:
36 //AnalogAxisProcessing(const uint32_t axisAmount,CommandHandler* cmdHandler = nullptr,bool allowFilters = true,bool allowAutoscale = true,const std::optional<const std::vector<std::pair<uint16_t,uint16_t>>*> manualMinMaxAddresses=std::nullopt);
37 AnalogAxisProcessing(const uint32_t axisAmount,AnalogSource* analogSource, CommandHandler* cmdHandler = nullptr,bool allowFilters = true,bool allowAutoscale = true, bool allowRawValues=false, bool allowManualScale = false);
38 virtual ~AnalogAxisProcessing();
39 CommandStatus command(const ParsedCommand& cmd,std::vector<CommandReply>& replies);
40 void setupFilters();
41 void processAxes(std::vector<int32_t>& buf);
44// void saveFlash();
45// void restoreSettings(uint16_t val);
46
49 //void setRawValues(std::vector<int32_t>* rawValues);
50
55 template<size_t size>
56 void restoreMinMaxValues(const std::array<std::pair<uint16_t,uint16_t>,size>& minMaxAddresses){
58 return; // Do not save if autoscale is on
59 }
60 for(uint8_t i = 0; i < std::min<uint32_t>(size, this->axisAmount); i++){
61 uint16_t bufMin,bufMax;
62 if(Flash_Read(minMaxAddresses[i].first, &bufMin) && Flash_Read(minMaxAddresses[i].second, &bufMax)){
63 this->minMaxVals[i].min = (int16_t)bufMin;
64 this->minMaxVals[i].max = (int16_t)bufMax;
65 }
66 }
67 }
72 template<size_t size>
73 void saveMinMaxValues(const std::array<std::pair<uint16_t,uint16_t>,size>& minMaxAddresses){
75 return; // Do not save if autoscale is on
76 }
77 for(uint8_t i = 0; i < std::min<uint32_t>(size, this->axisAmount); i++){
78 Flash_Write(minMaxAddresses[i].first, (uint16_t)this->minMaxVals[i].min);
79 Flash_Write(minMaxAddresses[i].second, (uint16_t)this->minMaxVals[i].max);
80 }
81 }
82
83protected:
85 const uint32_t axisAmount;
87
88 std::vector<Biquad> filters; // Optional filters
89 std::vector<MinMaxPair> minMaxVals; // TODO maybe use 2 minMax vectors to separate manual and autoscale later?
90 //const std::vector<std::pair<uint16_t,uint16_t>> *minMaxValAddr = nullptr;
91
92 const float filterF = 30.0/1000.0 , filterQ = 0.5;
93 uint32_t filterSamples = 0;
94 const uint32_t waitFilterSamples = 500;
95
96 float autorangeScale = 1.05; // Multiplies autorange scale to add some margin
97
98 std::vector<int32_t> rawValues; // Pointer to unscaled raw values
99
100private:
102 bool allowFilters : 1;
107};
108
109
110
111#endif /* SRC_ANALOGAXISPROCESSING_H_ */
CommandStatus
AnalogProcessingConfig conf
std::vector< int32_t > rawValues
std::vector< MinMaxPair > minMaxVals
const uint32_t waitFilterSamples
void saveMinMaxValues(const std::array< std::pair< uint16_t, uint16_t >, size > &minMaxAddresses)
AnalogAxisProcessing(const uint32_t axisAmount, AnalogSource *analogSource, CommandHandler *cmdHandler=nullptr, bool allowFilters=true, bool allowAutoscale=true, bool allowRawValues=false, bool allowManualScale=false)
void processAxes(std::vector< int32_t > &buf)
static AnalogProcessingConfig decodeAnalogProcessingConfFromInt(uint16_t val)
AnalogProcessingConfig & getAnalogProcessingConfig()
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
void restoreMinMaxValues(const std::array< std::pair< uint16_t, uint16_t >, size > &minMaxAddresses)
static uint16_t encodeAnalogProcessingConfToInt(AnalogProcessingConfig &conf)
std::vector< Biquad > filters
const struct AnalogAxisProcessing::AnalogProcessingMode modes
void setAnalogProcessingConfig(AnalogProcessingConfig conf)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)