STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
solenoid.cpp
Go to the documentation of this file.
1// solenoid_controls.cpp
2// Implementation of solenoid control functions using MCP23S17
3
4#include "solenoid.h"
5
6namespace solenoids {
7
8// ===================== INTERNALS =====================
9static MCP23S17* PYRO_1_MCP = nullptr;
10
11struct Channel {
12 const char* name;
13 uint8_t pin;
14};
15static Channel channels[] = {
16 {"OVP", 15}, {"FVP", 14}, {"OUP", 13}, {"FUP", 12},
17 {"ODP", 11}, {"FDP", 10}, {"PVF", 9}, {"PVO", 8},
18};
19static constexpr size_t NUM_CHANNELS = sizeof(channels) / sizeof(channels[0]);
20static uint8_t g_shadow[NUM_CHANNELS] = {0};
21
22// Helper
23static inline void setIdx(size_t idx, bool open) {
24 const uint8_t level =
25 (SOLENOID_ACTIVE_HIGH ? (open ? 1 : 0) : (open ? 0 : 1));
26 PYRO_1_MCP->write1(channels[idx].pin, level);
27 g_shadow[idx] = open ? 1 : 0;
28}
29
30// ===================== CORE FUNCTIONS =====================
31void init(SPIClass& spi, int sclk, int miso, int mosi, int cs_pin,
32 uint8_t mcp_hw_addr) {
33 spi.begin(sclk, miso, mosi, -1);
34 PYRO_1_MCP = new MCP23S17(cs_pin, mcp_hw_addr, &spi);
35 PYRO_1_MCP->begin();
36
37 for (size_t i = 0; i < NUM_CHANNELS; i++) {
38 PYRO_1_MCP->pinMode1(channels[i].pin, OUTPUT);
39 setIdx(i, false);
40 }
41}
42
43void open(SolenoidID id) {
44 setIdx((size_t)id, true);
45}
46void close(SolenoidID id) {
47 setIdx((size_t)id, false);
48}
50 return g_shadow[(size_t)id] != 0;
51}
52
53void safeAllOff() {
54 for (size_t i = 0; i < NUM_CHANNELS; i++)
55 setIdx(i, false);
56}
57
58void pulseBlocking(SolenoidID id, uint32_t ms) {
59 open(id);
60 delay(ms);
61 close(id);
62}
63
64// ===================== HIGH-LEVEL OPERATIONS =====================
65void openAll() {
66 for (size_t i = 0; i < NUM_CHANNELS; i++)
67 setIdx(i, true);
68}
69
70void closeAll() {
71 for (size_t i = 0; i < NUM_CHANNELS; i++)
72 setIdx(i, false);
73}
74
75void fillTanks() {
76 closeAll();
77 open(OVP);
78 open(FVP);
79}
80
81void basePress() {
82 // Placeholder for future pressure feedback logic
83}
84
85void pressKero() {
86 closeAll();
87 open(FUP);
88 // TODO: wait for pressure sensor read
89 close(FUP);
90 open(FVP);
91 // TODO: feedback loop
92 close(FVP);
93}
94
95void pressLOX() {
96 closeAll();
97 open(OUP);
98 // TODO: pressure read until 1000 PSI
99 close(OUP);
100 open(OVP);
101 // TODO: pressure read until 1000 PSI
102 close(OVP);
103}
104
106 closeAll();
107 open(FUP);
108 open(OUP);
109 // TODO: wait until both tanks reach 1000 PSI
110 close(FUP);
111 close(OUP);
112 open(FVP);
113 open(OVP);
114 closeAll();
115}
116
118 basePress();
119 pressKeroLOX();
120 basePress();
121}
122
124 closeAll();
125 open(FVP);
126 open(OVP);
127 // TODO: wait until both tanks = 0 PSI
128}
129
130void openMains() {
131 closeAll();
132 open(PVF);
133 open(PVO);
134}
135
136void ventTanks() {
137 ventKeroLOX();
138 delay(25);
139 closeAll();
140}
141
142void ventAll() {
143 ventKeroLOX();
144 pressKeroLOX();
145 ventKeroLOX();
146 delay(25);
147 closeAll();
148}
149
150void Abort() {
151 ventKeroLOX();
152 pressKeroLOX();
153 ventKeroLOX();
154 delay(25);
155 closeAll();
156}
157
158} // namespace solenoids
#define OUTPUT
Definition Arduino.h:22
void delay(int ms)
void closeAll()
Definition solenoid.cpp:70
void ventKeroLOX()
Definition solenoid.cpp:123
void close(SolenoidID id)
Definition solenoid.cpp:46
void pressKero()
Definition solenoid.cpp:85
void Abort()
Definition solenoid.cpp:150
void Pressurization()
Definition solenoid.cpp:117
void pressLOX()
Definition solenoid.cpp:95
void fillTanks()
Definition solenoid.cpp:75
void ventAll()
Definition solenoid.cpp:142
void openAll()
Definition solenoid.cpp:65
void pressKeroLOX()
Definition solenoid.cpp:105
void open(SolenoidID id)
Definition solenoid.cpp:43
static uint8_t g_shadow[NUM_CHANNELS]
Definition solenoid.cpp:20
static constexpr size_t NUM_CHANNELS
Definition solenoid.cpp:19
constexpr bool SOLENOID_ACTIVE_HIGH
Definition solenoid.h:16
void safeAllOff()
Definition solenoid.cpp:53
void pulseBlocking(SolenoidID id, uint32_t ms)
Definition solenoid.cpp:58
bool isOpen(SolenoidID id)
Definition solenoid.cpp:49
void init(SPIClass &spi, int sclk, int miso, int mosi, int cs_pin, uint8_t mcp_hw_addr)
Definition solenoid.cpp:31
static Channel channels[]
Definition solenoid.cpp:15
void basePress()
Definition solenoid.cpp:81
void openMains()
Definition solenoid.cpp:130
static MCP23S17 * PYRO_1_MCP
Definition solenoid.cpp:9
void ventTanks()
Definition solenoid.cpp:136
static void setIdx(size_t idx, bool open)
Definition solenoid.cpp:23
const char * name
Definition solenoid.cpp:12