Skip to content

Commit

Permalink
added in-between gate states
Browse files Browse the repository at this point in the history
  • Loading branch information
catink123 committed Jan 17, 2024
1 parent 0c26af2 commit b4ed56c
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 38 deletions.
109 changes: 81 additions & 28 deletions src/arduino_program/gate_control/gate_control.ino
Original file line number Diff line number Diff line change
Expand Up @@ -6,57 +6,110 @@ static const char* CHANGE_STATE = "change_state";
static const char* QUERY_STATE = "query_state";
static const char* QUERY_STATE_RESULT = "query_state_result";

static const char* ERROR_MESSAGE = "{\"type\": \"error\", \"payload\": \"unknown_command\"}";

static const char* STATE_RAISED = "raised";
static const char* STATE_RAISING = "raising";
static const char* STATE_LOWERED = "lowered";
static const char* STATE_LOWERING = "lowering";

static const unsigned int LED_PIN = 13;
static const unsigned int GATE_DELAY = 10;

const int capacity = 100;
StaticJsonDocument<capacity> doc;
bool state = false;

void send_state() {
enum gate_state {
raised, raising,
lowered, lowering
};

gate_state state = lowered;

void send_current_state() {
DynamicJsonDocument dyn_doc(100);
dyn_doc[TYPE] = QUERY_STATE_RESULT;
dyn_doc[PAYLOAD] = state;

const char* state_str = nullptr;
if (state == raised) state_str = STATE_RAISED;
if (state == raising) state_str = STATE_RAISING;
if (state == lowered) state_str = STATE_LOWERED;
if (state == lowering) state_str = STATE_LOWERING;

dyn_doc[PAYLOAD] = state_str;

String msg;
serializeJson(dyn_doc, msg);

Serial.write(msg.c_str());
}

void change_state(bool new_state, bool persist_change = true) {
void change_state(gate_state new_state, bool persist_change = true) {
if (persist_change) {
state = new_state;
send_state();
}

if (new_state) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
send_current_state();
}
}

void setup() {
Serial.begin(115200);
Serial.setTimeout(50);
pinMode(13, OUTPUT);
change_state(false);

pinMode(LED_PIN, OUTPUT);

change_state(lowered);
}

void raise_gate() {
change_state(raising);

unsigned char progress = 0;
while (progress < 255) {
analogWrite(LED_PIN, progress);
progress++;
delay(GATE_DELAY);
}

// flush/ignore any incoming messages
Serial.readString();

change_state(raised);
}

void lower_gate() {
change_state(lowering);

unsigned char progress = 255;
while (progress > 0) {
analogWrite(LED_PIN, progress);
progress--;
delay(GATE_DELAY);
}

// flush/ignore any incoming messages
Serial.readString();

change_state(lowered);
}

void loop() {
if (Serial.available() > 0) {
String msg = Serial.readString();

deserializeJson(doc, msg);

if (doc[TYPE] == CHANGE_STATE) {
if (doc[PAYLOAD] == true) {
change_state(true);
} else if (doc[PAYLOAD] == false) {
change_state(false);
}
} else if (doc[TYPE] == QUERY_STATE) {
send_state();
} else {
Serial.write("{\"type\": \"error\", \"payload\": \"unknown_command\"}");
if (Serial.available() == 0) {
return;
}

String msg = Serial.readString();

deserializeJson(doc, msg);

if (doc[TYPE] == CHANGE_STATE) {
if (doc[PAYLOAD] == true) {
if (state != raised) raise_gate();
} else if (doc[PAYLOAD] == false) {
if (state != lowered) lower_gate();
}
} else if (doc[TYPE] == QUERY_STATE) {
send_current_state();
} else {
Serial.write(ERROR_MESSAGE);
}
}
14 changes: 10 additions & 4 deletions src/client/control/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
transition-duration: .5s;
}

.state.unknown {
.state.indeterminate {
background: rgb(255, 255, 82);
}

Expand Down Expand Up @@ -102,7 +102,7 @@ <h1>Control Page</h1>
<div class="state-container">
<p>Gate state: </p>
<div class="state-block">
<span class="state unknown"></span>
<span class="state indeterminate"></span>
<p>Unknown</p>
</div>
</div>
Expand All @@ -117,12 +117,18 @@ <h1>Control Page</h1>
let msg = JSON.parse(e.data);
if (msg.type == "text") alert(`Text from Server: ${msg.payload}`);
if (msg.type == "query_state_result") {
if (msg.payload == true) {
if (msg.payload === "raised") {
stateSpan.className = "state raised";
stateText.innerText = "Raised";
} else if (msg.payload == false) {
} else if (msg.payload === "lowered") {
stateSpan.className = "state lowered";
stateText.innerText = "Lowered";
} else if (msg.payload === "raising") {
stateSpan.className = "state indeterminate";
stateText.innerText = "Raising...";
} else if (msg.payload === "lowering") {
stateSpan.className = "state indeterminate";
stateText.innerText = "Lowering...";
}
}
if (msg.type == "availability") alert(`Availability: ${msg.payload}`);
Expand Down
18 changes: 12 additions & 6 deletions src/client/view/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
transition-duration: .5s;
}

.state.unknown {
.state.indeterminate {
background: rgb(255, 255, 82);
}

Expand Down Expand Up @@ -65,7 +65,7 @@
<h1>Gate State</h1>

<div class="state-block">
<span class="state unknown"></span>
<span class="state indeterminate"></span>
<p>Unknown</p>
</div>
</div>
Expand All @@ -77,14 +77,20 @@ <h1>Gate State</h1>

ws.addEventListener('message', e => {
let msg = JSON.parse(e.data);
if (msg.type == "text") alert(`Text from Server: ${msg.payload}`);
if (msg.type == "query_state_result") {
if (msg.payload == true) {
if (msg.type === "text") alert(`Text from Server: ${msg.payload}`);
if (msg.type === "query_state_result") {
if (msg.payload === "raised") {
stateSpan.className = "state raised";
stateText.innerText = "Raised";
} else if (msg.payload == false) {
} else if (msg.payload === "lowered") {
stateSpan.className = "state lowered";
stateText.innerText = "Lowered";
} else if (msg.payload === "raising") {
stateSpan.className = "state indeterminate";
stateText.innerText = "Raising...";
} else if (msg.payload === "lowering") {
stateSpan.className = "state indeterminate";
stateText.innerText = "Lowering...";
}
}
if (msg.type == "availability") alert(`Availability: ${msg.payload}`);
Expand Down

0 comments on commit b4ed56c

Please sign in to comment.