Add CAN send logic and DIO mapping
This commit is contained in:
@ -35,7 +35,7 @@ extern "C" {
|
||||
extern ADC_HandleTypeDef hadc1;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
#define NUM_ADC_PINS 16
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_ADC1_Init(void);
|
||||
|
||||
@ -1,95 +1,176 @@
|
||||
#ifndef MAPPINGS_H
|
||||
#define MAPPINGS_H
|
||||
|
||||
#define CURRENT_NODE FRONT_NODE
|
||||
// CHOOSE ONE, comment the other or comment both and use -D SN_FRONT
|
||||
#define SN_FRONT
|
||||
//#define SN_REAR
|
||||
|
||||
#define IGRID_L1 1
|
||||
#define IGRID_L2 2
|
||||
#define IGRID_L3 3
|
||||
#define IGRID_L4 4
|
||||
#define IGRID_L5 5
|
||||
#define IGRID_L6 6
|
||||
#define IGRID_L7 7
|
||||
#define IGRID_L8 8
|
||||
#define IGRID_L9 9
|
||||
#define IGRID_L10 10
|
||||
#define IGRID_L11 11
|
||||
#define IGRID_L12 12
|
||||
#define IGRID_L13 13
|
||||
#define IGRID_L14 14
|
||||
#define IGRID_L15 15
|
||||
#define IGRID_L16 16
|
||||
#include <stdint.h>
|
||||
#include "main.h"
|
||||
|
||||
#define IGRID_R1 17
|
||||
#define IGRID_R2 18
|
||||
#define IGRID_R3 19
|
||||
#define IGRID_R4 20
|
||||
#define IGRID_R5 21
|
||||
#define IGRID_R6 22
|
||||
#define IGRID_R7 23
|
||||
#define IGRID_R8 24
|
||||
#define IGRID_R9 25
|
||||
#define IGRID_R10 26
|
||||
#define IGRID_R11 27
|
||||
#define IGRID_R12 28
|
||||
#define IGRID_R13 29
|
||||
#define IGRID_R14 30
|
||||
#define IGRID_R15 31
|
||||
#define IGRID_R16 32
|
||||
#define NUM_DIO_PINS 6
|
||||
|
||||
//
|
||||
// Node agnostic mappings:
|
||||
//
|
||||
static struct {
|
||||
GPIO_TypeDef* port;
|
||||
uint16_t pin;
|
||||
} DIO_PIN_MAP[NUM_DIO_PINS] = {
|
||||
/* 0 */ { .port = D1_IC_GPIO_Port, .pin = D1_IC_Pin},
|
||||
/* 1 */ { .port = D2_GPIO_Port, .pin = D2_Pin},
|
||||
/* 2 */ { .port = D3_GPIO_Port, .pin = D3_Pin},
|
||||
/* 3 */ { .port = D4_IC_GPIO_Port, .pin = D4_IC_Pin},
|
||||
/* 4 */ { .port = D5_GPIO_Port, .pin = D5_Pin},
|
||||
/* 5 */ { .port = D6_GPIO_Port, .pin = D6_Pin},
|
||||
};
|
||||
|
||||
// NUR BEISPIEL!!!!
|
||||
#define GET_GPIO_FROM_IGRID(igrid) \
|
||||
((igrid) == IGRID_L1 ? A16_Pin : \
|
||||
(igrid) == IGRID_L2 ? A15_Pin : \
|
||||
(igrid) == IGRID_L3 ? A14_Pin : \
|
||||
(igrid) == IGRID_L4 ? A13_Pin : \
|
||||
(igrid) == IGRID_L5 ? A12_Pin : \
|
||||
(igrid) == IGRID_L6 ? A11_Pin : \
|
||||
)
|
||||
typedef enum {
|
||||
L1 = 0,
|
||||
L2 = 1,
|
||||
L3 = 2,
|
||||
L4 = 3,
|
||||
L5 = 4,
|
||||
L6 = 5,
|
||||
L7 = 6,
|
||||
L8 = 7,
|
||||
R9 = 8,
|
||||
RA = 9,
|
||||
RB = 10,
|
||||
RC = 11,
|
||||
RD = 12,
|
||||
RE = 13,
|
||||
RF = 14,
|
||||
R0 = 15,
|
||||
} analog_pin_t;
|
||||
|
||||
// AUCH NUR BEISPIEL!!
|
||||
#define GET_ADC_CHANNEL_FROM_GPIO(gpio) \
|
||||
((gpio) == A16_Pin ? ADC_CHANNEL_9 : \
|
||||
(gpio) == A15_Pin ? ADC_CHANNEL_3 : \
|
||||
(gpio) == A14_Pin ? ADC_CHANNEL_7 : \
|
||||
(gpio) == A13_Pin ? ADC_CHANNEL_4 : \
|
||||
(gpio) == A12_Pin ? ADC_CHANNEL_10 : \
|
||||
(gpio) == A11_Pin ? ADC_CHANNEL_11 : \
|
||||
(gpio) == A10_Pin ? ADC_CHANNEL_12 : \
|
||||
)
|
||||
typedef enum {
|
||||
L9 = 0,
|
||||
LA = 1,
|
||||
LC = 2,
|
||||
R5 = 3,
|
||||
R6 = 4,
|
||||
R7 = 5,
|
||||
} digital_pin_t;
|
||||
|
||||
// ADC1 GPIO to ADC_Channel macro
|
||||
#define GET_ADC_CHANNEL_FROM_IGRID(igrid) \
|
||||
GET_ADC_CHANNEL_FROM_GPIO(GET_GPIO_FROM_IGRID(igrid))
|
||||
typedef enum {
|
||||
LB = 0,
|
||||
R8 = 1,
|
||||
} freq_pin_t;
|
||||
|
||||
// Node specific mappings:
|
||||
#if CURRENT_NODE == FRONT_NODE
|
||||
typedef enum {
|
||||
NONE = 0, // Not used
|
||||
AIN = 1, // Analog in
|
||||
DIN = 2, // Digital in
|
||||
FIN = 3, // Frequency in
|
||||
DOUT = 4, // Digital out
|
||||
POUT = 5, // PWM out
|
||||
} signal_type_t;
|
||||
|
||||
// Useful during development / for verification?
|
||||
#define GET_NAME_FROM_IGRID(igrid) \
|
||||
((igrid) == IGRID_L1 ? "WTPS1" : \
|
||||
(igrid) == IGRID_L2 ? "STS FL" : \
|
||||
)
|
||||
typedef struct {
|
||||
signal_type_t type;
|
||||
|
||||
// @Oskar nicht sicher wie man das am bestem macht, da ja nicht jeder pin ein input is der auf CAN kommt, also wonach man das ordnen will
|
||||
#define CAN_START_BIT_FROM_IGRID(igrid) \
|
||||
((igrid) == IGRID_L1 ? 0 : \
|
||||
(igrid) == IGRID_L2 ? 1 : \
|
||||
)
|
||||
// PERIPHERY INFO
|
||||
uint8_t channel; // ADC or PWM or Freq channel
|
||||
|
||||
// Hier würde ich dann weitere Defines machen für alles was dann das CAN frame bildet,
|
||||
// Start Bit, Bit count, etc, conversion factor (also von physischer größe die wir im
|
||||
// code bestimmen zu bits), quasi ne DBC mit defines. Abrufen macht man das dann mit macros
|
||||
// CAN INFO
|
||||
uint8_t start; // start bit
|
||||
uint8_t length; // in bits
|
||||
|
||||
#elif CURRENT_NODE == REAR_NODE
|
||||
// METADATA
|
||||
float factor; // (phys_range/can_scale)/adc_quants
|
||||
char name[16];
|
||||
} can_signal_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t can_id;
|
||||
uint8_t dlc;
|
||||
int8_t num_signals; // -1 => packet disabled
|
||||
uint16_t period; // ms
|
||||
can_signal_t signals[9];
|
||||
} can_pkt_t;
|
||||
|
||||
#define NUM_TX_PKT 4
|
||||
#define ADQ (1<<12)
|
||||
|
||||
#ifdef SN_FRONT
|
||||
|
||||
static can_pkt_t CAN_SIGNAL_MAP[NUM_TX_PKT] = {
|
||||
{
|
||||
.can_id = 0x0D1, .dlc = 3, .num_signals = 7, .period = 100, .signals = {
|
||||
{ .type = DIN, .channel = R5, .start = 0, .length = 1, .factor = 1., .name = "LS L" },
|
||||
{ .type = DIN, .channel = L9, .start = 1, .length = 1, .factor = 1., .name = "LS R" },
|
||||
{ .type = DIN, .channel = LA, .start = 2, .length = 1, .factor = 1., .name = "SDC M pre BOTS" },
|
||||
{ .type = DIN, .channel = LC, .start = 3, .length = 1, .factor = 1., .name = "SDC M post INS" },
|
||||
{ .type = DIN, .channel = R7, .start = 4, .length = 1, .factor = 1., .name = "SDC M post BSPD" },
|
||||
|
||||
{ .type = AIN, .channel = R0, .start = 8, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS FL" },
|
||||
{ .type = AIN, .channel = L8, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS FR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D3, .dlc = 7, .num_signals = 6, .period = 10, .signals = {
|
||||
{ .type = AIN, .channel = L1, .start = 0, .length = 8, .factor = (256./ADQ), .name = "APPS 1" },
|
||||
{ .type = AIN, .channel = L2, .start = 8, .length = 8, .factor = (256./ADQ), .name = "APPS 2" },
|
||||
{ .type = AIN, .channel = RA, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BP F" },
|
||||
{ .type = AIN, .channel = R9, .start = 24, .length = 12, .factor = 1., .name = "SAS" },
|
||||
{ .type = FIN, .channel = R8, .start = 40, .length = 8, .factor = 1., .name = "WSS FL" },
|
||||
{ .type = FIN, .channel = LB, .start = 48, .length = 8, .factor = 1., .name = "WSS FR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D5, .dlc = 3, .num_signals = 2, .period = 10, .signals = {
|
||||
{ .type = AIN, .channel = RC, .start = 0, .length = 12, .factor = 1., .name = "DS FL" },
|
||||
{ .type = AIN, .channel = L4, .start = 12, .length = 12, .factor = 1., .name = "DS FR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D7, .dlc = 3, .num_signals = 2, .period = 1, .signals = {
|
||||
{ .type = AIN, .channel = RE, .start = 0, .length = 12, .factor = 1., .name = "SLS FL" },
|
||||
{ .type = AIN, .channel = L6, .start = 12, .length = 12, .factor = 1., .name = "SLS FR" },
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#define FRONT_NODE 0
|
||||
#define REAR_NODE 1
|
||||
#ifdef SN_REAR
|
||||
|
||||
static can_pkt_t CAN_SIGNAL_MAP[NUM_TX_PKT] = {
|
||||
{
|
||||
.can_id = 0x0D2, .dlc = 7, .num_signals = 9, .period = 100, .signals = {
|
||||
{ .type = DIN, .channel = L9, .start = 0, .length = 1, .factor = 1., .name = "ExtTSOn" },
|
||||
{ .type = DIN, .channel = LA, .start = 1, .length = 1, .factor = 1., .name = "SDC M pre TSMS" },
|
||||
{ .type = DIN, .channel = LC, .start = 2, .length = 1, .factor = 1., .name = "SDC M post TSMS" },
|
||||
|
||||
{ .type = AIN, .channel = R0, .start = 8, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS RL" },
|
||||
{ .type = AIN, .channel = L8, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS RR" },
|
||||
|
||||
{ .type = AIN, .channel = R9, .start = 24, .length = 8, .factor = (256./ADQ), .name = "WT BAT" },
|
||||
{ .type = AIN, .channel = RB, .start = 32, .length = 8, .factor = (256./ADQ), .name = "WT DT" },
|
||||
{ .type = AIN, .channel = RD, .start = 40, .length = 8, .factor = (256./ADQ), .name = "WP BAT" },
|
||||
{ .type = AIN, .channel = RF, .start = 48, .length = 8, .factor = (256./ADQ), .name = "WP DT" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D4, .dlc = 8, .num_signals = 7, .period = 10, .signals = {
|
||||
{ .type = AIN, .channel = L1, .start = 0, .length = 8, .factor = ((25.6/.1)/ADQ), .name = "EBS APS 1" },
|
||||
{ .type = AIN, .channel = L2, .start = 8, .length = 8, .factor = ((25.6/.1)/ADQ), .name = "EBS APS 2" },
|
||||
{ .type = AIN, .channel = RA, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BP F" },
|
||||
{ .type = FIN, .channel = R8, .start = 24, .length = 8, .factor = 1., .name = "WSS RL" },
|
||||
{ .type = FIN, .channel = LB, .start = 32, .length = 8, .factor = 1., .name = "WSS RR" },
|
||||
{ .type = AIN, .channel = RC, .start = 40, .length = 12, .factor = 1., .name = "DS RL" },
|
||||
{ .type = AIN, .channel = L4, .start = 52, .length = 12, .factor = 1., .name = "DS RR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D6, .dlc = 0, .num_signals = -1, .period = 10, .signals = {}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D8, .dlc = 3, .num_signals = 2, .period = 1, .signals = {
|
||||
{ .type = AIN, .channel = RE, .start = 0, .length = 12, .factor = 1., .name = "SLS RL" },
|
||||
{ .type = AIN, .channel = L6, .start = 12, .length = 12, .factor = 1., .name = "SLS RR" },
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -1,160 +0,0 @@
|
||||
#ifndef MAPPINGS_H
|
||||
#define MAPPINGS_H
|
||||
|
||||
// CHOOSE ONE, comment the other or comment both and use -D SN_FRONT
|
||||
#define SN_FRONT
|
||||
#define SN_REAR
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef enum {
|
||||
L1 = 0,
|
||||
L2 = 1,
|
||||
L3 = 2,
|
||||
L4 = 3,
|
||||
L5 = 4,
|
||||
L6 = 5,
|
||||
L7 = 6,
|
||||
L8 = 7,
|
||||
R9 = 8,
|
||||
RA = 9,
|
||||
RB = 10,
|
||||
RC = 11,
|
||||
RD = 12,
|
||||
RE = 13,
|
||||
RF = 14,
|
||||
R0 = 15,
|
||||
} analog_pin_t;
|
||||
|
||||
typedef enum {
|
||||
L9 = 0,
|
||||
LA = 1,
|
||||
LC = 2,
|
||||
R5 = 3,
|
||||
R6 = 4,
|
||||
R7 = 5,
|
||||
} digital_pin_t;
|
||||
|
||||
typedef enum {
|
||||
LB = 0,
|
||||
R8 = 1,
|
||||
} freq_pin_t;
|
||||
|
||||
typedef enum {
|
||||
NONE = 0, // Not used
|
||||
AIN = 1, // Analog in
|
||||
DIN = 2, // Digital in
|
||||
FIN = 3, // Frequency in
|
||||
DOUT = 4, // Digital out
|
||||
POUT = 5, // PWM out
|
||||
} signal_type_t;
|
||||
|
||||
typedef struct {
|
||||
signal_type_t type;
|
||||
|
||||
// PERIPHERY INFO
|
||||
uint8_t channel; // ADC or PWM or Freq channel
|
||||
|
||||
// CAN INFO
|
||||
uint8_t start; // start bit
|
||||
uint8_t length; // in bits
|
||||
|
||||
// METADATA
|
||||
float factor; // (phys_range/can_scale)/adc_quants
|
||||
char name[16];
|
||||
} can_signal_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t can_id;
|
||||
uint8_t dlc;
|
||||
int8_t num_signals; // -1 => packet disabled
|
||||
uint16_t period; // ms
|
||||
can_signal_t signals[9];
|
||||
} can_pkt_t;
|
||||
|
||||
#define ADQ (1<<12)
|
||||
|
||||
#ifdef SN_FRONT
|
||||
|
||||
static can_pkt_t CAN_SIGNAL_MAP[4] {
|
||||
{
|
||||
.can_id = 0x0D1, .dlc = 3, .num_signals = 7, .period = 100, .signals = {
|
||||
{ .type = DIN, .channel = R5, .start = 0, .length = 1, .factor = 1., .name = "LS L" },
|
||||
{ .type = DIN, .channel = L9, .start = 1, .length = 1, .factor = 1., .name = "LS R" },
|
||||
{ .type = DIN, .channel = LA, .start = 2, .length = 1, .factor = 1., .name = "SDC M pre BOTS" },
|
||||
{ .type = DIN, .channel = LC, .start = 3, .length = 1, .factor = 1., .name = "SDC M post INS" },
|
||||
{ .type = DIN, .channel = R7, .start = 4, .length = 1, .factor = 1., .name = "SDC M post BSPD" },
|
||||
|
||||
{ .type = AIN, .channel = R0, .start = 8, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS FL" },
|
||||
{ .type = AIN, .channel = L8, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS FR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D3, .dlc = 7, .num_signals = 6, .period = 10, .signals = {
|
||||
{ .type = AIN, .channel = L1, .start = 0, .length = 8, .factor = (256./ADQ), .name = "APPS 1" },
|
||||
{ .type = AIN, .channel = L2, .start = 8, .length = 8, .factor = (256./ADQ), .name = "APPS 2" },
|
||||
{ .type = AIN, .channel = RA, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BP F" },
|
||||
{ .type = AIN, .channel = R9, .start = 24, .length = 12, .factor = 1., .name = "SAS" },
|
||||
{ .type = FIN, .channel = R8, .start = 40, .length = 8, .factor = 1., .name = "WSS FL" },
|
||||
{ .type = FIN, .channel = LB, .start = 48, .length = 8, .factor = 1., .name = "WSS FR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D5, .dlc = 3, .num_signals = 2, .period = 10, .signals = {
|
||||
{ .type = AIN, .channel = RC, .start = 0, .length = 12, .factor = 1., .name = "DS FL" },
|
||||
{ .type = AIN, .channel = L4, .start = 12, .length = 12, .factor = 1., .name = "DS FR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D7, .dlc = 3, .num_signals = 2, .period = 1, .signals = {
|
||||
{ .type = AIN, .channel = RE, .start = 0, .length = 12, .factor = 1., .name = "SLS FL" },
|
||||
{ .type = AIN, .channel = L6, .start = 12, .length = 12, .factor = 1., .name = "SLS FR" },
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef SN_REAR
|
||||
|
||||
static can_pkt_t CAN_SIGNAL_MAP[4] {
|
||||
{
|
||||
.can_id = 0x0D2, .dlc = 7, .num_signals = 9, .period = 100, .signals = {
|
||||
{ .type = DIN, .channel = L9, .start = 0, .length = 1, .factor = 1., .name = "ExtTSOn" },
|
||||
{ .type = DIN, .channel = LA, .start = 1, .length = 1, .factor = 1., .name = "SDC M pre TSMS" },
|
||||
{ .type = DIN, .channel = LC, .start = 2, .length = 1, .factor = 1., .name = "SDC M post TSMS" },
|
||||
|
||||
{ .type = AIN, .channel = R0, .start = 8, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS RL" },
|
||||
{ .type = AIN, .channel = L8, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BDTS RR" },
|
||||
|
||||
{ .type = AIN, .channel = R9, .start = 24, .length = 8, .factor = (256./ADQ), .name = "WT BAT" },
|
||||
{ .type = AIN, .channel = RB, .start = 32, .length = 8, .factor = (256./ADQ), .name = "WT DT" },
|
||||
{ .type = AIN, .channel = RD, .start = 40, .length = 8, .factor = (256./ADQ), .name = "WP BAT" },
|
||||
{ .type = AIN, .channel = RF, .start = 48, .length = 8, .factor = (256./ADQ), .name = "WP DT" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D4, .dlc = 8, .num_signals = 7, .period = 10, .signals = {
|
||||
{ .type = AIN, .channel = L1, .start = 0, .length = 8, .factor = ((25.6/.1)/ADQ), .name = "EBS APS 1" },
|
||||
{ .type = AIN, .channel = L2, .start = 8, .length = 8, .factor = ((25.6/.1)/ADQ), .name = "EBS APS 2" },
|
||||
{ .type = AIN, .channel = RA, .start = 16, .length = 8, .factor = ((512./2)/ADQ), .name = "BP F" },
|
||||
{ .type = FIN, .channel = R8, .start = 24, .length = 8, .factor = 1., .name = "WSS RL" },
|
||||
{ .type = FIN, .channel = LB, .start = 32, .length = 8, .factor = 1., .name = "WSS RR" },
|
||||
{ .type = AIN, .channel = RC, .start = 40, .length = 12, .factor = 1., .name = "DS RL" },
|
||||
{ .type = AIN, .channel = L4, .start = 52, .length = 12, .factor = 1., .name = "DS RR" },
|
||||
}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D6, .dlc = 0, .num_signals = -1, .period = 10, .signals = {}
|
||||
},
|
||||
{
|
||||
.can_id = 0x0D8, .dlc = 3, .num_signals = 2, .period = 1, .signals = {
|
||||
{ .type = AIN, .channel = RE, .start = 0, .length = 12, .factor = 1., .name = "SLS RL" },
|
||||
{ .type = AIN, .channel = L6, .start = 12, .length = 12, .factor = 1., .name = "SLS RR" },
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user