ProtoCore v0.0.2
Deterministic, zero-heap network stack for embedded targets
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
10
11#if PC_ENABLE_SNP
12
13#include <string.h>
14
15uint8_t pc_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 {
20 sum = (uint8_t)(sum + bytes[i]);
21 }
22 return sum;
23}
24
25size_t pc_snp_build(uint8_t control, const uint8_t *data, size_t data_len, uint8_t *out, size_t cap)
26{
27 if (!out || (data_len && !data) || data_len > 255)
28 {
29 return 0;
30 }
31 size_t n = 2 + data_len + 1; // control + length + data + BCC
32 if (n > cap)
33 {
34 return 0;
35 }
36 out[0] = control;
37 out[1] = (uint8_t)data_len;
38 if (data_len)
39 {
40 memcpy(out + 2, data, data_len);
41 }
42 out[2 + data_len] = pc_snp_bcc(out, 2 + data_len); // BCC over control..last data
43 return n;
44}
45
46bool pc_snp_parse(const uint8_t *frame, size_t len, SnpFrame *out)
47{
48 if (!frame || !out || len < 3) // control + length + BCC
49 {
50 return false;
51 }
52 uint8_t data_len = frame[1];
53 size_t expect = 2 + (size_t)data_len + 1;
54 if (len < expect)
55 {
56 return false;
57 }
58 if (pc_snp_bcc(frame, 2 + data_len) != frame[2 + data_len])
59 {
60 return false;
61 }
62 out->control = frame[0];
63 out->data = data_len ? (frame + 2) : nullptr;
64 out->data_len = data_len;
65 return true;
66}
67
68#endif // PC_ENABLE_SNP
GE Fanuc SNP (Series Ninety Protocol) serial frame codec (PC_ENABLE_SNP).