This commit is contained in:
r.koeppe
2024-06-18 12:42:44 +02:00
parent 665276e910
commit b5623b4580
101 changed files with 114171 additions and 0 deletions

62
Converter/Inc/Converter.h Normal file
View File

@ -0,0 +1,62 @@
#include <stm32f302xc.h>
#include <stm32f3xx_hal.h>
#include <stm32f3xx_hal_conf.h>
#include <vn-interface/helper.h>
#include <vn-interface/frames.h>
#include <can-transceiver-lib/can1.h>
#include <can-transceiver-lib/endec.hpp>
#include "canhalal.h"
template <typename payload_t>
HAL_StatusTypeDef spi_read(SPI_HandleTypeDef *hspi, vn::pkg_request_read_t *pRequestMOSI, vn::pkg_response_t<payload_t> *pResponseMISO) {
HAL_StatusTypeDef status = HAL_OK;
vn::header_t::response_t requestMISO;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
status = HAL_SPI_TransmitReceive(hspi, (uint8_t *)(pRequestMOSI),
(uint8_t *)(&requestMISO), // not relevant, but there to function
sizeof(*pRequestMOSI), 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
vn::pkg_response_t<payload_t> responseMOSI;
status = HAL_SPI_TransmitReceive(hspi,
(uint8_t *)(&responseMOSI), // just empty byte to allow the slave to transmit
(uint8_t *)(pResponseMISO), sizeof(*pResponseMISO), 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
return status;
}
template <typename payload_t>
HAL_StatusTypeDef spi_write(SPI_HandleTypeDef *hspi, vn::pkg_request_write_t<payload_t> *pRequestMOSI, vn::pkg_response_t<payload_t> *pResponseMISO) {
HAL_StatusTypeDef status = HAL_OK;
vn::header_t::response_t requestMISO;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
status = HAL_SPI_TransmitReceive(hspi, (uint8_t *)(pRequestMOSI),
(uint8_t *)(&requestMISO), // not relevant, but there to function
sizeof(*pRequestMOSI), 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
vn::pkg_response_t<payload_t> responseMOSI;
status = HAL_SPI_TransmitReceive(hspi,
(uint8_t *)(&responseMOSI), // just empty byte to allow the slave to transmit
(uint8_t *)(pResponseMISO), sizeof(*pResponseMISO), 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
return status;
}
HAL_StatusTypeDef spi2can(SPI_HandleTypeDef *hspi, CAN_HandleTypeDef *hcan);

7
Converter/Inc/canhalal.h Normal file
View File

@ -0,0 +1,7 @@
#include <stm32f302xc.h>
#include <stm32f3xx_hal.h>
#include <stm32f3xx_hal_conf.h>
HAL_StatusTypeDef ftcan_init(CAN_HandleTypeDef *hcan);
HAL_StatusTypeDef ftcan_transmit(CAN_HandleTypeDef *hcan, uint16_t id, const uint8_t *data, size_t datalen);

View File

@ -0,0 +1,65 @@
#include "Converter.h"
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;
// ==================
// 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));
ftcan_transmit(hcan, CAN1_VN200_INS_YPR_FRAME_ID, (uint8_t *)(&data_ins_ypr), datalen);
// 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));
ftcan_transmit(hcan, CAN1_VN200_INS_LL_FRAME_ID, (uint8_t *)(&data_ins_ll), datalen);
// 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));
ftcan_transmit(hcan, CAN1_VN200_INS_VEL_FRAME_ID, (uint8_t *)(&data_ins_vel), datalen);
// ==================
// 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
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));
ftcan_transmit(hcan, CAN1_VN200_IMU_ACC_LIN_FRAME_ID, (uint8_t *)(&data_imu_acc_lin), datalen);
// 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));
ftcan_transmit(hcan, CAN1_VN200_IMU_ACC_ANG_FRAME_ID, (uint8_t *)(&data_imu_acc_ang), datalen);
// ==================
// 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));
ftcan_transmit(hcan, CAN1_VN200_GNSS_LL_FRAME_ID, (uint8_t *)(&data_gnss), datalen);
return HAL_OK;
}

View File

@ -0,0 +1,20 @@
#include "canhalal.h"
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);
}