Open FFBoard
Open source force feedback firmware
LocalAnalog.cpp
Go to the documentation of this file.
1/*
2 * LocalAnalog.cpp
3 *
4 * Created on: Nov 6, 2020
5 * Author: Yannick
6 */
7
8#include "LocalAnalog.h"
9#include "global_callbacks.h"
10#include "flash_helpers.h"
11#include "eeprom_addresses.h"
12#include "AdcHandler.h"
13
15 .name = "AIN-Pins" ,
16 .id=CLSID_ANALOG_LOCAL, //0
17};
18
19
20const std::array<std::pair<uint16_t,uint16_t>,8> minMaxValAddr = {
21 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_0,ADR_LOCALANALOG_MAX_0),
22 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_1,ADR_LOCALANALOG_MAX_1),
23 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_2,ADR_LOCALANALOG_MAX_2),
24 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_3,ADR_LOCALANALOG_MAX_3),
25 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_4,ADR_LOCALANALOG_MAX_4),
26 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_5,ADR_LOCALANALOG_MAX_5),
27 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_6,ADR_LOCALANALOG_MAX_6),
28 std::pair<uint16_t,uint16_t>(ADR_LOCALANALOG_MIN_7,ADR_LOCALANALOG_MAX_7),
29};
30
31LocalAnalog::LocalAnalog() : CommandHandler("apin",CLSID_ANALOG_LOCAL,0),AnalogAxisProcessing(ADC_PINS,this,this, true,true,true,true) {
32 // Determine resolution
33 uint8_t bits = AdcHandler::getAdcResolutionBits(&AIN_HADC);
34 mask = (1 << bits) -1;
35 bitshift = std::max(0,16-bits);
36 this->restoreFlash();
37
39 registerCommand("mask", LocalAnalog_commands::pinmask, "Enabled pins",CMDFLAG_GET|CMDFLAG_SET);
40
41 registerCommand("pins", LocalAnalog_commands::pins, "Available pins",CMDFLAG_GET|CMDFLAG_SET);
42 //registerCommand("values", LocalAnalog_commands::values, "Analog values",CMDFLAG_GET);
43}
44
46
47}
48
50 return info;
51}
52
55 uint16_t conf1 = aconf.analogmask | (processingConf << 8);
56 Flash_Write(ADR_LOCALANALOG_MASK, conf1);
57
59}
60
62 uint16_t aconfint;
63 if(Flash_Read(ADR_LOCALANALOG_MASK,&aconfint)){
65 aconf.analogmask = aconfint & 0xff;
66 }
68}
69
70
71
72std::vector<int32_t>* LocalAnalog::getAxes(){
73 uint8_t chans = 0;
74 this->buf.clear();
75 volatile uint32_t* adcbuf = getAnalogBuffer(&AIN_HADC,&chans);
76
77 uint8_t axes = std::min<uint8_t>(chans-ADC_CHAN_FPIN,numPins);
78
79 for(uint8_t i = 0;i<axes;i++){
80 int32_t val = ((adcbuf[i+ADC_CHAN_FPIN] & mask) << bitshift)-0x7fff;
81 if(!(aconf.analogmask & 0x01 << i))
82 continue;
83
84
85 this->buf.push_back(val);
86 }
87
89 return &this->buf;
90}
91
92
93CommandStatus LocalAnalog::command(const ParsedCommand& cmd,std::vector<CommandReply>& replies){
94
95 switch(static_cast<LocalAnalog_commands>(cmd.cmdId)){
97 return handleGetSet(cmd, replies, this->aconf.analogmask);
98 break;
99
101 if(cmd.type == CMDtype::get){
102 replies.emplace_back(numPins);
103 }else{
104 return CommandStatus::ERR;
105 }
106 break;
107
108 default:
109 return AnalogAxisProcessing::command(cmd, replies); // Try processing command
110 }
111
112 return CommandStatus::OK;
113}
CommandStatus
const std::array< std::pair< uint16_t, uint16_t >, 8 > minMaxValAddr
Definition: LocalAnalog.cpp:20
static uint8_t getAdcResolutionBits(ADC_HandleTypeDef *hadc)
Definition: AdcHandler.cpp:26
void saveMinMaxValues(const std::array< std::pair< uint16_t, uint16_t >, size > &minMaxAddresses)
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)
void setAnalogProcessingConfig(AnalogProcessingConfig conf)
std::vector< int32_t > buf
Definition: AnalogSource.h:31
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)
static ClassIdentifier info
Definition: LocalAnalog.h:32
const ClassIdentifier getInfo()
Definition: LocalAnalog.cpp:49
const uint8_t numPins
Definition: LocalAnalog.h:47
void restoreFlash()
Definition: LocalAnalog.cpp:61
std::vector< int32_t > * getAxes()
Definition: LocalAnalog.cpp:72
void saveFlash()
Definition: LocalAnalog.cpp:53
LocalAnalogConfig aconf
Definition: LocalAnalog.h:50
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
Definition: LocalAnalog.cpp:93
uint8_t bitshift
Definition: LocalAnalog.h:48
virtual ~LocalAnalog()
Definition: LocalAnalog.cpp:45
uint16_t mask
Definition: LocalAnalog.h:49
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
volatile uint32_t * getAnalogBuffer(ADC_HandleTypeDef *hadc, uint8_t *chans)
const char * name
uint8_t analogmask
Definition: LocalAnalog.h:20
uint32_t cmdId