Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 2
KeepEmptyLinesAtTheStartOfBlocks: true
LineEnding: LF
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCSpaceAfterProperty: false
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
cmake-build*
*.map
scripts/parameter-descriptions.md
CMakeFiles/
CMakeCache.txt

*.aux
*.fdb_latexmk
Expand Down
68 changes: 0 additions & 68 deletions boards/varmint_h7/.clang-format

This file was deleted.

1 change: 1 addition & 0 deletions boards/varmint_h7/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ cmake_install.cmake
varmint_11x/
varmint_11x_test/
varmint_12x/
Liv4f.*
4 changes: 2 additions & 2 deletions boards/varmint_h7/common/STM32H7LinkerScript.ld
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = ORIGIN(RAM_D1) + LENGTH(RAM_D1); /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x2000; /* required amount of heap */
_Min_Stack_Size = 0x2000; /* required amount of stack */
_Min_Heap_Size = 0x10000; /* required amount of heap note _user_heap_stack is one location */
_Min_Stack_Size = 0x20000; /* required amount of stack */

/* Specify the memory areas */
MEMORY
Expand Down
69 changes: 18 additions & 51 deletions boards/varmint_h7/common/Varmint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ uint16_t Varmint::sensors_init_message(char * message, uint16_t size, uint16_t i
bool Varmint::imu_read(rosflight_firmware::ImuStruct * imu)
{
ImuPacket p;
if (imu0_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (imu0_.read((uint8_t *) &p, sizeof(p))) {
imu->header = p.header;
imu->accel[0] = p.accel[0];
imu->accel[1] = p.accel[1];
Expand All @@ -167,7 +167,7 @@ bool Varmint::imu_read(rosflight_firmware::ImuStruct * imu)
bool Varmint::mag_read(rosflight_firmware::MagStruct * mag)
{
MagPacket p;
if (mag_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (mag_.read((uint8_t *) &p, sizeof(p))) {
mag->header = p.header;
mag->flux[0] = p.flux[0];
mag->flux[1] = p.flux[1];
Expand All @@ -183,7 +183,7 @@ bool Varmint::mag_read(rosflight_firmware::MagStruct * mag)
bool Varmint::baro_read(rosflight_firmware::PressureStruct * baro)
{
PressurePacket p;
if (baro_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (baro_.read((uint8_t *) &p, sizeof(p))) {
baro->header = p.header;
baro->pressure = p.pressure;
baro->temperature = p.temperature;
Expand All @@ -197,7 +197,7 @@ bool Varmint::baro_read(rosflight_firmware::PressureStruct * baro)
bool Varmint::diff_pressure_read(rosflight_firmware::PressureStruct * diff_pressure)
{
PressurePacket p;
if (pitot_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (pitot_.read((uint8_t *) &p, sizeof(p))) {
diff_pressure->header = p.header;
diff_pressure->pressure = p.pressure;
diff_pressure->temperature = p.temperature;
Expand All @@ -219,7 +219,7 @@ bool Varmint::sonar_read(rosflight_firmware::RangeStruct * sonar)
bool Varmint::battery_read(rosflight_firmware::BatteryStruct * batt)
{
AdcPacket p;
if (adc_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (adc_.read((uint8_t *) &p, sizeof(p))) {
batt->header = p.header;
batt->current = p.volts[ADC_BATTERY_CURRENT];
batt->voltage = p.volts[ADC_BATTERY_VOLTS];
Expand All @@ -245,57 +245,24 @@ bool Varmint::gnss_read(rosflight_firmware::GnssStruct * gnss)
{
UbxPacket p;

if (gps_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (gps_.read((uint8_t *) &p, sizeof(p))) {
gnss->header = p.header;
gnss->pps = p.pps;
gnss->unix_seconds = p.unix_seconds; // Unix time
gnss->t_acc = p.pvt.tAcc;
gnss->time_of_week = p.pvt.iTOW;
gnss->year = p.pvt.year;
gnss->month = p.pvt.month;
gnss->day = p.pvt.day;
gnss->hour = p.pvt.hour;
gnss->min = p.pvt.min;
gnss->sec = p.pvt.sec;
gnss->nano = p.pvt.nano;
gnss->lon = p.pvt.lon;
gnss->lat = p.pvt.lat;
gnss->height_ellipsoid = p.pvt.height;
gnss->height_msl = p.pvt.hMSL;
gnss->h_acc = p.pvt.hAcc;
gnss->v_acc = p.pvt.vAcc;
gnss->vel_n = p.pvt.velN;
gnss->vel_e = p.pvt.velE;
gnss->vel_d = p.pvt.velD;
gnss->mag_var = p.pvt.magDec;
gnss->ground_speed = p.pvt.gSpeed;
gnss->course = p.pvt.headMot;
gnss->course_accy = p.pvt.headAcc;
gnss->vel_n = p.pvt.velN;
gnss->vel_e = p.pvt.velE;
gnss->vel_d = p.pvt.velD;
gnss->speed_accy = p.pvt.sAcc;
gnss->mag_var = p.pvt.magDec;
gnss->valid = ((p.pvt.flags & 0x01) != 0);
gnss->num_sat = p.pvt.numSV;
gnss->dop = p.pvt.pDOP;
gnss->unix_nanos = p.unix_nanos;
gnss->fix_type = p.pvt.fixType;

// These are not available from standard NMEA messages
// from ublox Class 0x01, ID 0x20
gnss->ecef.x = p.ecefp.ecefX;
gnss->ecef.y = p.ecefp.ecefY;
gnss->ecef.z = p.ecefp.ecefZ;
gnss->ecef.p_acc = p.ecefp.pAcc;
// from ublox Class 0x01, ID 0x11
gnss->ecef.vx = p.ecefv.ecefVX;
gnss->ecef.vy = p.ecefv.ecefVY;
gnss->ecef.vz = p.ecefv.ecefVZ;
gnss->ecef.s_acc = p.ecefv.sAcc;

gnss->num_sat = p.pvt.numSV;
gnss->lon = (double)p.pvt.lon* 1e-7; // Convert 100's of nanodegs into deg (DDS format)
gnss->lat = (double)p.pvt.lat* 1e-7; // Convert 100's of nanodegs into deg (DDS format)
gnss->height_msl = (float)p.pvt.hMSL* 1e-3; //mm to m
gnss->vel_n = (float)p.pvt.velN* 1e-3; // mm/s to m/s
gnss->vel_e = (float)p.pvt.velE* 1e-3; // mm/s to m/s
gnss->vel_d = (float)p.pvt.velD* 1e-3; // mm/s to m/s
gnss->h_acc = (float)p.pvt.hAcc* 1e-3; //mm to m
gnss->v_acc = (float)p.pvt.vAcc* 1e-3; //mm to m
gnss->speed_accy = (float)p.pvt.sAcc* 1e-3; // mm/s to m/s
return true;
}

return false;
}

Expand All @@ -306,7 +273,7 @@ bool Varmint::rc_read(rosflight_firmware::RcStruct * rc_struct)
{
RcPacket p;

if (rc_.rxFifoReadMostRecent((uint8_t *) &p, sizeof(p))) {
if (rc_.read((uint8_t *) &p, sizeof(p))) {
rc_struct->header = p.header;
uint16_t len = RC_STRUCT_CHANNELS < RC_PACKET_CHANNELS ? RC_STRUCT_CHANNELS : RC_PACKET_CHANNELS;
for (uint16_t i = 0; i < len; i++) { rc_struct->chan[i] = p.chan[i]; }
Expand Down
21 changes: 9 additions & 12 deletions boards/varmint_h7/common/drivers/Adc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ extern Time64 time64;
#define ADC_DMA_BUF_SIZE_EXT (ADC_CHANNELS_EXT * sizeof(uint32_t))
#define ADC_DMA_BUF_SIZE_MAX (16 * sizeof(uint32_t)) // 16 channels is max for the ADC sequencer

DTCM_RAM uint8_t adc_fifo_rx_buffer[ADC_FIFO_BUFFERS * sizeof(AdcPacket)];
DTCM_RAM uint8_t adc_double_buffer[2 * sizeof(AdcPacket)];

DTCM_RAM uint32_t adc_counts[ADC_CHANNELS];

ADC_EXT_DMA_RAM uint32_t adc_dma_buf_ext[ADC_DMA_BUF_SIZE_MAX / 4];
Expand All @@ -70,9 +71,7 @@ uint32_t Adc::init(uint16_t sample_rate_hz, ADC_HandleTypeDef * hadc_ext,
hadcInt_ = hadc_int;
cfg_ = adc_cfg;

groupDelay_ = 1000000 / sampleRateHz_;

rxFifo_.init(ADC_FIFO_BUFFERS, sizeof(AdcPacket), adc_fifo_rx_buffer);
double_buffer_.init(adc_double_buffer, sizeof(adc_double_buffer));

if (DRIVER_OK != configAdc(hadcExt_, adc_instance_ext, cfg_, ADC_CHANNELS_EXT)) {
initializationStatus_ = DRIVER_HAL_ERROR;
Expand Down Expand Up @@ -189,14 +188,12 @@ void Adc::endDma(ADC_HandleTypeDef * hadc)
double vcc = p.vRef;
#endif
for (int i = 0; i < ADC_CHANNELS; i++) {
// p.volts[i] = ((double)(adc_counts[i]&0xFFFF)/65535.0 - cfg_[i].offset) * p.vRef * cfg_[i].scaleFactor;
p.volts[i] = ((double) (adc_counts[i] & 0xFFFF) / 65535.0 * p.vRef - vcc * cfg_[i].offset) * cfg_[i].scaleFactor;
p.volts[i] = ((double) (adc_counts[i] & 0xFFFF) / 65535.0 * vcc - cfg_[i].offset) * cfg_[i].scaleFactor;
}

p.header.timestamp = time64.Us();
p.drdy = drdy_;
p.groupDelay = groupDelay_;
rxFifo_.write((uint8_t *) &p, sizeof(p));
p.header.complete = time64.Us();
p.header.timestamp = (drdy_+p.header.complete)/2;
write((uint8_t *) &p, sizeof(p));
ext_read = 0;
int_read = 0;
}
Expand All @@ -207,8 +204,8 @@ bool Adc::display(void)
AdcPacket p;
char name[] = "Adc (adc)";

if (rxFifo_.readMostRecent((uint8_t *) &p, sizeof(p))) {
misc_header(name, p.drdy, p.header.timestamp, p.groupDelay);
if (read((uint8_t *) &p, sizeof(p))) {
misc_header(name, p.header);
misc_printf("\n");

misc_printf(" %-8s : ", "STM");
Expand Down
15 changes: 12 additions & 3 deletions boards/varmint_h7/common/drivers/Adc.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@
#ifndef ADC_H_
#define ADC_H_

#include "DoubleBuffer.h"
#include "BoardConfig.h"
#include "Driver.h"


typedef struct __attribute__((__packed__))
{
Expand All @@ -52,7 +53,7 @@ typedef struct __attribute__((__packed__))
/*
*
*/
class Adc : public Driver
class Adc : public Status
{
public:
uint32_t init(uint16_t sample_rate_hz, ADC_HandleTypeDef * hadc_ext,
Expand All @@ -64,11 +65,19 @@ class Adc : public Driver
bool poll(uint64_t poll_offset);
void endDma(ADC_HandleTypeDef * hadc);

bool display(void) override;
bool display(void);
bool isMy(ADC_HandleTypeDef * hadc) { return (hadcExt_ == hadc) || (hadcInt_ == hadc); }
void setScaleFactor(uint16_t n, float scale_factor);

bool read(uint8_t * data, uint16_t size) { return double_buffer_.read(data, size)==DoubleBufferStatus::OK; }

private:
bool write(uint8_t * data, uint16_t size) { return double_buffer_.write(data, size)==DoubleBufferStatus::OK; }
DoubleBuffer double_buffer_;
uint16_t sampleRateHz_;
uint64_t drdy_;


uint32_t configChan(ADC_HandleTypeDef * hadc, ADC_ChannelConfTypeDef * sConfig, AdcChannelCfg * cfg);
uint32_t configAdc(ADC_HandleTypeDef * hadc, ADC_TypeDef * adc_instance, AdcChannelCfg * cfg, uint16_t cfg_channels);
ADC_HandleTypeDef *hadcExt_, *hadcInt_; // The shared SPI handle
Expand Down
Loading