try to fix submodule

This commit is contained in:
2023-11-09 19:02:15 -05:00
parent c1d45aa443
commit deea94b076
366 changed files with 40228 additions and 2 deletions

View File

@@ -0,0 +1,42 @@
# SimpleFOC Telemetry
:warning: unfinished, untested
A flexible abstraction for telemetry (monitoring) of SimpleFOC systems.
The telemetry implementation is based on the SimpleFOC registers, and allows you to send telemetry for any (readable) register. Telemetry supports multiple motors.
The concept allows you to choose registers which are then sent by the telemetry automatically, on a regular schedule.
The method of sending depends on the type of telemetry you add to your program. There are telemetry drivers for:
- Serial ASCII telemetry
- Serial Binary telemetry
- and more drivers will be added in the future
Multiple motors can be added to the same telemetry, to monitor several motors at the same time. The registers reported by telemetry can be changed at run-time. Multiple instances of telemetry can be used to monitor different sets of values at different time intervals, or to send to multiple channels at the same time.
## Usage
Using telemetry is simple:
```c++
SerialASCIITelemetry telemetry = SerialASCIITelemetry();
...
void setup() {
...
telemetry.addMotor(&motor);
telemetry.setTelemetryRegisters(3, { REG_TARGET, REG_ANGLE, REG_VELOCITY });
telemetry.init();
...
}
void loop() {
motor.move();
motor.loopFOC();
telemetry.run();
}
```

View File

@@ -0,0 +1,67 @@
#include "./Telemetry.h"
Telemetry::Telemetry() {
this->numRegisters = 0;
};
Telemetry::~Telemetry(){
};
void Telemetry::setTelemetryRegisters(uint8_t numRegisters, uint8_t* registers, uint8_t* motors){
if (numRegisters<=TELEMETRY_MAX_REGISTERS) {
this->numRegisters = numRegisters;
for (uint8_t i=0; i<numRegisters; i++) {
this->registers[i] = registers[i];
if (motors!=NULL)
this->registers_motor[i] = motors[i];
else
this->registers_motor[i] = 0;
}
}
};
void Telemetry::init() {
headerSent = false;
};
void Telemetry::run() {
if (numRegisters<1)
return;
if (!headerSent) {
sendHeader();
headerSent = true;
}
if (downsampleCnt++ < downsample) return;
downsampleCnt = 0;
if (min_elapsed_time > 0) {
long now = _micros();
if (now - last_run_time < min_elapsed_time) return;
last_run_time = now;
}
sendTelemetry();
}
void Telemetry::addMotor(FOCMotor* motor) {
if (numMotors < TELEMETRY_MAX_MOTORS) {
motors[numMotors] = motor;
numMotors++;
}
};

View File

@@ -0,0 +1,53 @@
#pragma once
#include "../SimpleFOCRegisters.h"
#include "../RegisterSender.h"
#ifndef TELEMETRY_MAX_REGISTERS
#define TELEMETRY_MAX_REGISTERS 8
#endif
#ifndef TELEMETRY_MAX_MOTORS
#define TELEMETRY_MAX_MOTORS 4
#endif
#define DEF_TELEMETRY_DOWNSAMPLE 100
typedef enum : uint8_t {
TELEMETRY_FRAMETYPE_DATA = 0x01,
TELEMETRY_FRAMETYPE_HEADER = 0x02
} TelemetryFrameType;
class Telemetry : public RegisterSender {
public:
Telemetry();
virtual ~Telemetry();
virtual void init();
void addMotor(FOCMotor* motor);
void setTelemetryRegisters(uint8_t numRegisters, uint8_t* registers, uint8_t* motors = NULL);
void run();
uint16_t downsample = DEF_TELEMETRY_DOWNSAMPLE;
uint32_t min_elapsed_time = 0;
protected:
virtual void sendTelemetry() = 0;
virtual void sendHeader() = 0;
FOCMotor* motors[TELEMETRY_MAX_MOTORS];
uint8_t numMotors = 0;
uint8_t numRegisters;
uint8_t registers[TELEMETRY_MAX_REGISTERS];
uint8_t registers_motor[TELEMETRY_MAX_REGISTERS];
uint8_t frameSize;
bool headerSent;
long last_run_time = 0;
uint16_t downsampleCnt = 0;
};