update folder structure, v0 for FT25 (Schematic and Layout)
This commit is contained in:
130
Software/Converter/Src/Converter.cpp
Normal file
130
Software/Converter/Src/Converter.cpp
Normal file
@ -0,0 +1,130 @@
|
||||
#include "Converter.h"
|
||||
|
||||
#define DELAY 2 // ms
|
||||
|
||||
HAL_StatusTypeDef spi2can(SPI_HandleTypeDef *hspi, CAN_HandleTypeDef *hcan) {
|
||||
// Standard at FaSTTUBe - Sadly. Please fix this with CAN FD for such sensors.
|
||||
size_t datalen = 8;
|
||||
HAL_StatusTypeDef status = HAL_OK;
|
||||
|
||||
// ==================
|
||||
// Hardware Version
|
||||
// ==================
|
||||
// auto request_hw_version = vn::pkg_request_read_t(vn::HardwareVersion::ID);
|
||||
// auto response_hw_version = vn::pkg_response_t<vn::HardwareVersionRegister>();
|
||||
// spi_read(hspi, &request_hw_version, &response_hw_version);
|
||||
|
||||
// ==================
|
||||
// Hardware Version --> 2001
|
||||
// ==================
|
||||
// auto request_fw_version = vn::pkg_request_read_t(vn::FirmwareVersion::ID);
|
||||
// auto response_fw_version = vn::pkg_response_t<vn::FirmwareVersionRegister>();
|
||||
// spi_read(hspi, &request_fw_version, &response_fw_version);
|
||||
|
||||
// ==================
|
||||
// ATT YawPitchRoll
|
||||
// ==================
|
||||
// auto request_att_ypr = vn::pkg_request_read_t(vn::YawPitchRoll::ID);
|
||||
// auto response_att_ypr = vn::pkg_response_t<vn::YawPitchRollRegister>();
|
||||
// spi_read(hspi, &request_att_ypr, &response_att_ypr);
|
||||
|
||||
// ==================
|
||||
// IMU Accel
|
||||
// ==================
|
||||
// auto request_imu_accel = vn::pkg_request_read_t(vn::ImuAccelerometer::ID);
|
||||
// auto response_imu_accel = vn::pkg_response_t<vn::ImuAccelerometerRegister>();
|
||||
// spi_read(hspi, &request_imu_accel, &response_imu_accel);
|
||||
|
||||
// ==================
|
||||
// IMU Gyro
|
||||
// ==================
|
||||
auto request_imu_gyro = vn::pkg_request_read_t(vn::ImuGyro::ID);
|
||||
auto response_imu_gyro = vn::pkg_response_t<vn::ImuGyroRegister>();
|
||||
spi_read(hspi, &request_imu_gyro, &response_imu_gyro);
|
||||
|
||||
// ==================
|
||||
// INS
|
||||
// ==================
|
||||
// EXTRACT INS
|
||||
auto request_ins_solution_lla = vn::pkg_request_read_t(vn::InsSolutionLla::ID);
|
||||
auto response_ins_solution_lla = vn::pkg_response_t<vn::InsSolutionLlaRegister>();
|
||||
|
||||
spi_read(hspi, &request_ins_solution_lla, &response_ins_solution_lla);
|
||||
|
||||
vn::InsSolutionLlaRegister payload = response_ins_solution_lla.payload;
|
||||
// SEND INS YPR
|
||||
auto data_ins_ypr = canlib::encode::can1::vn200_ins_ypr(canlib::frame::decoded::can1::vn200_ins_ypr_t(
|
||||
(double)payload.yawPitchRoll.x, (double)payload.yawPitchRoll.y, (double)payload.yawPitchRoll.z, (double)payload.attUncertainty));
|
||||
uint8_t packed_data_ins_ypr[datalen];
|
||||
can1_vn200_ins_ypr_pack(packed_data_ins_ypr, &data_ins_ypr, datalen);
|
||||
status = ftcan_transmit(hcan, CAN1_VN200_INS_YPR_FRAME_ID, packed_data_ins_ypr, datalen);
|
||||
|
||||
HAL_Delay(DELAY);
|
||||
|
||||
// SEND INS LLA
|
||||
auto data_ins_ll = canlib::encode::can1::vn200_ins_ll(canlib::frame::decoded::can1::vn200_ins_ll_t(
|
||||
(double)payload.position.x, (double)payload.position.y, (double)payload.posUncertainty, (double)payload.posUncertainty));
|
||||
uint8_t packed_data_ins_ll[datalen];
|
||||
can1_vn200_ins_ll_pack(packed_data_ins_ll, &data_ins_ll, datalen);
|
||||
status = ftcan_transmit(hcan, CAN1_VN200_INS_LL_FRAME_ID, packed_data_ins_ll, datalen);
|
||||
|
||||
HAL_Delay(DELAY);
|
||||
|
||||
// SEND INS VEL
|
||||
auto data_ins_vel = canlib::encode::can1::vn200_ins_vel(canlib::frame::decoded::can1::vn200_ins_vel_t(
|
||||
(double)payload.nedVel.x, (double)payload.nedVel.y, (double)payload.velUncertainty, (double)payload.velUncertainty));
|
||||
uint8_t packed_data_ins_vel[datalen];
|
||||
can1_vn200_ins_vel_pack(packed_data_ins_vel, &data_ins_vel, datalen);
|
||||
status = ftcan_transmit(hcan, CAN1_VN200_INS_VEL_FRAME_ID, packed_data_ins_vel, datalen);
|
||||
|
||||
HAL_Delay(DELAY);
|
||||
|
||||
// ==================
|
||||
// IMU
|
||||
// ==================
|
||||
// EXTRACT IMU
|
||||
auto request_imu = vn::pkg_request_read_t(vn::MagneticAccelerationAndAngularRates::ID);
|
||||
auto response_imu = vn::pkg_response_t<vn::MagneticAccelerationAndAngularRatesRegister>();
|
||||
|
||||
spi_read(hspi, &request_imu, &response_imu);
|
||||
|
||||
vn::MagneticAccelerationAndAngularRatesRegister payload_imu = response_imu.payload;
|
||||
// SEND ACC LIN
|
||||
const auto data_imu_acc_lin = canlib::encode::can1::vn200_imu_acc_lin(
|
||||
canlib::frame::decoded::can1::vn200_imu_acc_lin_t((double)payload_imu.accel.x, (double)payload_imu.accel.y, (double)payload_imu.accel.z));
|
||||
uint8_t packed_data_imu_acc_lin[datalen];
|
||||
can1_vn200_imu_acc_lin_pack(packed_data_imu_acc_lin, &data_imu_acc_lin, datalen);
|
||||
status = ftcan_transmit(hcan, CAN1_VN200_IMU_ACC_LIN_FRAME_ID, packed_data_imu_acc_lin, datalen);
|
||||
|
||||
HAL_Delay(DELAY);
|
||||
|
||||
// SEND ACC ANG
|
||||
auto data_imu_acc_ang = canlib::encode::can1::vn200_imu_acc_ang(
|
||||
canlib::frame::decoded::can1::vn200_imu_acc_ang_t((double)payload_imu.gyro.x, (double)payload_imu.gyro.y, (double)payload_imu.gyro.z));
|
||||
uint8_t packed_data_imu_acc_ang[datalen];
|
||||
can1_vn200_imu_acc_ang_pack(packed_data_imu_acc_ang, &data_imu_acc_ang, datalen);
|
||||
status = ftcan_transmit(hcan, CAN1_VN200_IMU_ACC_ANG_FRAME_ID, packed_data_imu_acc_ang, datalen);
|
||||
|
||||
HAL_Delay(DELAY);
|
||||
|
||||
// ==================
|
||||
// GNSS
|
||||
// ==================
|
||||
// EXTRACT GNSS LLA
|
||||
auto request_gnss = vn::pkg_request_read_t(vn::GpsSolutionLla::ID);
|
||||
auto response_gnss = vn::pkg_response_t<vn::GpsSolutionLlaRegister>();
|
||||
|
||||
spi_read(hspi, &request_gnss, &response_gnss);
|
||||
|
||||
vn::GpsSolutionLlaRegister payload_gnss = response_gnss.payload;
|
||||
// SEND ACC LIN
|
||||
auto data_gnss = canlib::encode::can1::vn200_gnss_ll(canlib::frame::decoded::can1::vn200_gnss_ll_t(
|
||||
(double)payload_gnss.lla.x, (double)payload_gnss.lla.y, (double)payload_gnss.nedAcc.x, (double)payload_gnss.nedAcc.y));
|
||||
uint8_t packed_data_gnss[datalen];
|
||||
can1_vn200_gnss_ll_pack(packed_data_gnss, &data_gnss, datalen);
|
||||
status = ftcan_transmit(hcan, CAN1_VN200_GNSS_LL_FRAME_ID, packed_data_gnss, datalen);
|
||||
|
||||
HAL_Delay(DELAY);
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
54
Software/Converter/Src/canhalal.cpp
Normal file
54
Software/Converter/Src/canhalal.cpp
Normal file
@ -0,0 +1,54 @@
|
||||
#include "canhalal.h"
|
||||
#define FTCAN_NUM_FILTERS 2
|
||||
HAL_StatusTypeDef ftcan_init(CAN_HandleTypeDef *handle) {
|
||||
HAL_StatusTypeDef status = HAL_CAN_ActivateNotification(handle, CAN_IT_RX_FIFO0_MSG_PENDING);
|
||||
if (status != HAL_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
return HAL_CAN_Start(handle);
|
||||
}
|
||||
|
||||
HAL_StatusTypeDef ftcan_transmit(CAN_HandleTypeDef *handle, uint16_t id, const uint8_t *data, size_t datalen) {
|
||||
static CAN_TxHeaderTypeDef header;
|
||||
header.StdId = id;
|
||||
header.IDE = CAN_ID_STD;
|
||||
header.RTR = CAN_RTR_DATA;
|
||||
header.DLC = datalen;
|
||||
uint32_t mailbox;
|
||||
return HAL_CAN_AddTxMessage(handle, &header, data, &mailbox);
|
||||
}
|
||||
|
||||
HAL_StatusTypeDef ftcan_add_filter(CAN_HandleTypeDef *handle, uint16_t id, uint16_t mask) {
|
||||
static uint32_t next_filter_no = 0;
|
||||
static CAN_FilterTypeDef filter;
|
||||
if (next_filter_no % 2 == 0) {
|
||||
filter.FilterIdHigh = id << 5;
|
||||
filter.FilterMaskIdHigh = mask << 5;
|
||||
filter.FilterIdLow = id << 5;
|
||||
filter.FilterMaskIdLow = mask << 5;
|
||||
} else {
|
||||
// Leave high filter untouched from the last configuration
|
||||
filter.FilterIdLow = id << 5;
|
||||
filter.FilterMaskIdLow = mask << 5;
|
||||
}
|
||||
filter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
|
||||
filter.FilterBank = next_filter_no / 2;
|
||||
if (filter.FilterBank > FTCAN_NUM_FILTERS + 1) {
|
||||
return HAL_ERROR;
|
||||
}
|
||||
filter.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||
filter.FilterScale = CAN_FILTERSCALE_16BIT;
|
||||
filter.FilterActivation = CAN_FILTER_ENABLE;
|
||||
|
||||
// Disable slave filters
|
||||
// TODO: Some STM32 have multiple CAN peripherals, and one uses the slave
|
||||
// filter bank
|
||||
filter.SlaveStartFilterBank = FTCAN_NUM_FILTERS;
|
||||
|
||||
HAL_StatusTypeDef status = HAL_CAN_ConfigFilter(handle, &filter);
|
||||
if (status == HAL_OK) {
|
||||
next_filter_no++;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
Reference in New Issue
Block a user