Open FFBoard
Open source force feedback firmware
CanAnalog.cpp
Go to the documentation of this file.
1/*
2 * CanAnalog.cpp
3 *
4 * Created on: 06.04.2022
5 * Author: Yannick
6 */
7
8#include <CanAnalog.h>
9#include "math.h"
10
11#ifdef CANANALOG
13 .name = "CAN Analog" ,
14 .id=CLSID_ANALOG_CAN,
15 };
17 return info;
18}
19
20CanAnalogBase::CanAnalogBase(uint8_t maxAxes) : CommandHandler("cananalog", CLSID_ANALOG_CAN, 0), maxAxes(maxAxes) {
22 registerCommand("canid", CanAnalog_commands::canid, "CAN frame ID of first packet. Next packet ID+1",CMDFLAG_GET | CMDFLAG_SET);
23 registerCommand("amount", CanAnalog_commands::amount, "Amount of analog axes",CMDFLAG_GET | CMDFLAG_SET);
24 registerCommand("maxamount", CanAnalog_commands::maxAmount, "Maxmimum amount of analog axes",CMDFLAG_GET);
26
29}
30
32 if(filterId != -1){
34 }
35
36 CAN_filter filterConf;
37 filterConf.buffer = 0;
38 filterConf.filter_id = canId;
39 filterConf.filter_mask = ~((canId) ^ ((canId+1) ));
40 this->filterId = this->port->addCanFilter(filterConf);
41 //this->port->setSpeedPreset(CANSPEEDPRESET_500); // default speed used
42 this->port->start();
43}
44
46 if(filterId != -1)
48}
49
51 uint16_t conf1 = canId & 0x7FF;
52 conf1 |= (axes & 0xF) << 11;
53 Flash_Write(ADR_CANANALOG_CONF1, conf1);
54
55
56}
57
59 uint16_t conf;
60
61 // CAN settings
62 if(Flash_Read(ADR_CANANALOG_CONF1, &conf)){
63 canId = conf & 0x7ff;
64 setAxisNum((conf >> 11) & 0xF);
65 }
66}
67
68void CanAnalogBase::setAxisNum(uint8_t num){
69 axes = std::min(num,maxAxes);
70 packets = ((axes-1)/4) +1;
71 this->buf.resize(axes,0);
72}
73
74
75
76
77CommandStatus CanAnalogBase::command(const ParsedCommand& cmd,std::vector<CommandReply>& replies){
78
79 switch(static_cast<CanAnalog_commands>(cmd.cmdId)){
80
82 if(cmd.type == CMDtype::get){
83 replies.emplace_back(this->axes);
84 }else if(cmd.type == CMDtype::set){
85 setAxisNum(cmd.val);
86 }
87 break;
88
90 replies.emplace_back(this->maxAxes);
91 break;
92
94 if(cmd.type == CMDtype::get){
95 replies.emplace_back(this->canId);
96 }else if(cmd.type == CMDtype::set){
97 canId = std::min<uint32_t>((cmd.val) & 0x7ff,0x7ff-(this->axes/4));
98 setupCanPort(); // Set can filter
99 }
100 break;
101
102 default:
104 }
105 return CommandStatus::OK;
106}
107
109
110 uint32_t id = (msg.header.id) & 0x7FF;
111 if(msg.header.rtr){
112 return;
113 }
114
115 for(uint8_t packet = 0; packet < packets ; packet++){
116 if(id != this->canId+packet){
117 continue;
118 }
119 for(uint8_t i = 0; i < 4 && (i + packet*4) < axes && (i*2+1) < msg.header.length; i++) {
120 this->buf[i + packet*4] = msg.data[i*2] | (msg.data[i*2+1] << 8);
121 }
122 }
123}
124
125
126#endif
CommandStatus
std::vector< int32_t > buf
Definition: AnalogSource.h:31
bool rtr
Definition: CAN.h:73
uint32_t id
Definition: CAN.h:70
uint32_t length
Definition: CAN.h:71
Definition: CAN.h:119
virtual bool start()=0
virtual int32_t addCanFilter(CAN_filter filter)=0
virtual void removeCanFilter(uint8_t filterId)=0
const uint8_t maxAxes
Definition: CanAnalog.h:52
uint32_t canId
Definition: CanAnalog.h:48
static ClassIdentifier info
Definition: CanAnalog.h:32
void setupCanPort()
Definition: CanAnalog.cpp:31
void restoreFlash()
Definition: CanAnalog.cpp:58
virtual ~CanAnalogBase()
Definition: CanAnalog.cpp:45
int32_t filterId
Definition: CanAnalog.h:49
const ClassIdentifier getInfo()
Definition: CanAnalog.cpp:16
void setAxisNum(uint8_t num)
Definition: CanAnalog.cpp:68
uint8_t packets
Definition: CanAnalog.h:53
void canRxPendCallback(CANPort *port, CAN_rx_msg &msg) override
Definition: CanAnalog.cpp:108
uint8_t axes
Definition: CanAnalog.h:51
void saveFlash()
Definition: CanAnalog.cpp:50
CANPort * port
Definition: CanAnalog.h:50
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
Definition: CanAnalog.cpp:77
CanAnalogBase(uint8_t maxAxes=8)
Definition: CanAnalog.cpp:20
void registerCommand(const char *cmd, const ID cmdid, const char *help=nullptr, uint32_t flags=0)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
uint32_t buffer
Definition: CAN.h:110
uint32_t filter_mask
Definition: CAN.h:109
uint32_t filter_id
Definition: CAN.h:108
Definition: CAN.h:96
uint8_t data[CAN_MSGBUFSIZE]
Definition: CAN.h:97
CAN_msg_header_rx header
Definition: CAN.h:99
const char * name
uint32_t cmdId