DeterministicESPAsyncWebServer v6.28.0
Zero-allocation, bounded-execution async HTTP server for ESP32
Loading...
Searching...
No Matches
snp.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file snp.cpp
6 * @brief GE Fanuc SNP serial frame codec (see snp.h).
7 */
8
9#include "services/snp/snp.h"
10
11#if DETWS_ENABLE_SNP
12
13#include <string.h>
14
15uint8_t detws_snp_bcc(const uint8_t *bytes, size_t len)
16{
17 uint8_t sum = 0;
18 for (size_t i = 0; i < len; i++)
19 sum = (uint8_t)(sum + bytes[i]);
20 return sum;
21}
22
23size_t detws_snp_build(uint8_t control, const uint8_t *data, size_t data_len, uint8_t *out, size_t cap)
24{
25 if (!out || (data_len && !data) || data_len > 255)
26 return 0;
27 size_t n = 2 + data_len + 1; // control + length + data + BCC
28 if (n > cap)
29 return 0;
30 out[0] = control;
31 out[1] = (uint8_t)data_len;
32 if (data_len)
33 memcpy(out + 2, data, data_len);
34 out[2 + data_len] = detws_snp_bcc(out, 2 + data_len); // BCC over control..last data
35 return n;
36}
37
38bool detws_snp_parse(const uint8_t *frame, size_t len, SnpFrame *out)
39{
40 if (!frame || !out || len < 3) // control + length + BCC
41 return false;
42 uint8_t data_len = frame[1];
43 size_t expect = 2 + (size_t)data_len + 1;
44 if (len < expect)
45 return false;
46 if (detws_snp_bcc(frame, 2 + data_len) != frame[2 + data_len])
47 return false;
48 out->control = frame[0];
49 out->data = data_len ? (frame + 2) : nullptr;
50 out->data_len = data_len;
51 return true;
52}
53
54#endif // DETWS_ENABLE_SNP
GE Fanuc SNP (Series Ninety Protocol) serial frame codec (DETWS_ENABLE_SNP).