STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
connector_adc_map.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5
6#include "STAR_ADS126X.h"
7#include "sense_board_pins.h"
8
10 uint8_t connector; // e.g. 1 = J1, 2 = J2
11 uint8_t pin; // e.g. 1 = Jx-1, 2 = Jx-2
12 uint8_t adc; // e.g. ADS126X_AIN0 = 0b0000
13 uint8_t adc_index; // 1 = primary ADC, 2 = secondary ADC, etc.
14};
15
19};
20
21struct AdcLayout {
23 std::size_t size;
24
25 constexpr AdcSelection get(uint8_t connector, uint8_t pin) const {
26 for (std::size_t i = 0; i < size; ++i) {
27 const auto& e = table[i];
28 if (e.connector == connector && e.pin == pin)
29 return {e.adc, e.adc_index}; // raw integer channel + adc index
30 }
31 return {-1, -1}; // invalid
32 }
33};
34
36
37// PT Board
39 // connector, pin, adc channel, adc index
40 {1, 1, ADS126X_AIN0, 1}, {2, 1, ADS126X_AIN1, 1}, {3, 1, ADS126X_AIN7, 1},
41 {4, 1, ADS126X_AIN5, 1}, {5, 1, ADS126X_AIN9, 1}, {6, 1, ADS126X_AIN2, 1},
42 {7, 1, ADS126X_AIN3, 1}, {8, 1, ADS126X_AIN4, 1}, {9, 1, ADS126X_AIN6, 1},
43 {10, 1, ADS126X_AIN8, 1},
44};
45
46inline constexpr AdcLayout PT_Board_Adc = {
48 sizeof(PT_Board_AdcEntries) / sizeof(PT_Board_AdcEntries[0]),
49};
50
51// LC Board
53 // connector, pin, adc channel, adc index
54 {1, 1, ADS126X_AIN0, 1}, {1, 2, ADS126X_AIN1, 1}, {2, 1, ADS126X_AIN4, 1},
55 {2, 2, ADS126X_AIN5, 1}, {3, 1, ADS126X_AIN8, 1}, {3, 2, ADS126X_AIN9, 1},
56 {6, 1, ADS126X_AIN2, 1}, {6, 2, ADS126X_AIN3, 1}, {7, 1, ADS126X_AIN6, 1},
57 {7, 2, ADS126X_AIN7, 1},
58
59 {4, 1, ADS126X_AIN2, 2}, {4, 2, ADS126X_AIN3, 2}, {5, 1, ADS126X_AIN6, 2},
60 {5, 2, ADS126X_AIN7, 2}, {8, 1, ADS126X_AIN0, 2}, {8, 2, ADS126X_AIN1, 2},
61 {9, 1, ADS126X_AIN4, 2}, {9, 2, ADS126X_AIN5, 2}, {10, 1, ADS126X_AIN8, 2},
62 {10, 2, ADS126X_AIN9, 2},
63};
64
65inline constexpr AdcLayout LC_Board_Adc = {
67 sizeof(LC_Board_AdcEntries) / sizeof(LC_Board_AdcEntries[0]),
68};
69
70// TC Board
72 // connector, pin, adc channel, adc index
73 {1, 1, ADS126X_AIN0, 1}, {2, 1, ADS126X_AIN2, 1}, {3, 1, ADS126X_AIN4, 1},
74 {4, 1, ADS126X_AIN6, 1}, {5, 1, ADS126X_AIN8, 1}, {6, 1, ADS126X_AIN1, 1},
75 {7, 1, ADS126X_AIN3, 1}, {8, 1, ADS126X_AIN5, 1}, {9, 1, ADS126X_AIN7, 1},
76 {10, 1, ADS126X_AIN9, 1},
77};
78
79inline constexpr AdcLayout TC_Board_Adc = {
81 sizeof(TC_Board_AdcEntries) / sizeof(TC_Board_AdcEntries[0]),
82};
83
84// RTD Board
86 // connector, pin, adc channel, adc index
87 {1, 1, ADS126X_AIN2, 1}, {1, 2, ADS126X_AIN3, 1},
88 {1, 101, ADS126X_AIN1, 1}, // IDAC1, corresponding to the pin 1
89 {1, 102, ADS126X_AIN4, 1}, // IDAC2, corresponding to the pin 2
90
91 {2, 1, ADS126X_AIN6, 1}, {2, 2, ADS126X_AIN7, 1},
92 {2, 101, ADS126X_AIN5, 1}, // IDAC1
93 {2, 102, ADS126X_AIN8, 1}, // IDAC2
94
95 {3, 1, ADS126X_AIN2, 2}, {3, 2, ADS126X_AIN3, 2},
96 {3, 101, ADS126X_AIN1, 2}, // IDAC1
97 {3, 102, ADS126X_AIN4, 2}, // IDAC2
98
99 {4, 1, ADS126X_AIN6, 2}, {4, 2, ADS126X_AIN7, 2},
100 {4, 101, ADS126X_AIN5, 2}, // IDAC1
101 {4, 102, ADS126X_AIN8, 2}, // IDAC2
102};
103
104inline constexpr AdcLayout RTD_Board_Adc = {
106 sizeof(RTD_Board_AdcEntries) / sizeof(RTD_Board_AdcEntries[0]),
107};
108
109// Set to a default value, if it was forgotten
110#ifndef PINS_ACTIVE_LAYOUT
111#define PINS_ACTIVE_LAYOUT PT_Board
112#endif
113
114// Some ChatGPT bullshit to let us reuse the "PINS_ACTIVE_LAYOUT" macro
115#define ADC_LAYOUT_CAT_IMPL(a, b) a##b
116#define ADC_LAYOUT_CAT(a, b) ADC_LAYOUT_CAT_IMPL(a, b)
117#define ADC_LAYOUT_FROM_PINS(layout_sym) ADC_LAYOUT_CAT(layout_sym, _Adc)
118inline constexpr const AdcLayout& AdcMap =
120
121// Function to get adc channel (-1 if invalid)
122constexpr int getAdcChannel(uint8_t connector, uint8_t pin) {
123 // To avoid someone trying to get the IDAC intended pins on the
124 // RTD board as ADC channels that should be read
125 if (pin > 100) {
126 return -1;
127 }
128
129 return AdcMap.get(connector, pin).channel;
130}
131
132// Function to get adc channel for idac intended pins (-1 if invalid)
133constexpr int getIdacChannel(uint8_t connector, uint8_t pin) {
134 // Look there are reasons we did this but they are hard to explain
135 // We set the pin number for the IDAC channels to be + 100 since it was the
136 // cleanest way
137 return AdcMap.get(connector, pin + 100).channel;
138}
139
140// Function to get adc index (1-based, -1 if invalid)
141constexpr int getAdcIndex(uint8_t connector, uint8_t pin) {
142 return AdcMap.get(connector, pin).adc_index;
143}
144
145} // namespace sense_board_pins
#define ADS126X_AIN4
#define ADS126X_AIN0
#define ADS126X_AIN8
#define ADS126X_AIN2
#define ADS126X_AIN6
#define ADS126X_AIN1
#define ADS126X_AIN9
#define ADS126X_AIN7
#define ADS126X_AIN5
#define ADS126X_AIN3
#define ADC_LAYOUT_FROM_PINS(layout_sym)
#define PINS_ACTIVE_LAYOUT
Definition main.cpp:13
constexpr const AdcLayout & AdcMap
constexpr ConnectorAdcMapEntry PT_Board_AdcEntries[]
constexpr AdcLayout LC_Board_Adc
constexpr AdcLayout TC_Board_Adc
constexpr int getAdcIndex(uint8_t connector, uint8_t pin)
constexpr ConnectorAdcMapEntry TC_Board_AdcEntries[]
constexpr ConnectorAdcMapEntry LC_Board_AdcEntries[]
constexpr AdcLayout PT_Board_Adc
constexpr int getIdacChannel(uint8_t connector, uint8_t pin)
constexpr int getAdcChannel(uint8_t connector, uint8_t pin)
constexpr AdcLayout RTD_Board_Adc
constexpr ConnectorAdcMapEntry RTD_Board_AdcEntries[]
const ConnectorAdcMapEntry * table
std::size_t size
constexpr AdcSelection get(uint8_t connector, uint8_t pin) const