11#if DETWS_ENABLE_CCLINK
15uint8_t detws_cclink_sum(
const uint8_t *bytes,
size_t len)
18 for (
size_t i = 0; i < len; i++)
19 sum = (uint8_t)(sum + bytes[i]);
23size_t detws_cclink_build(uint8_t station, uint8_t command,
const uint8_t *bits,
size_t bit_len,
const uint8_t *words,
24 size_t word_len, uint8_t *out,
size_t cap)
26 if (!out || (bit_len && !bits) || (word_len && !words) || station > 63)
28 size_t n = 2 + bit_len + word_len + 1;
36 memcpy(out + i, bits, bit_len);
41 memcpy(out + i, words, word_len);
44 out[i] = detws_cclink_sum(out, i);
49bool detws_cclink_parse(
const uint8_t *frame,
size_t len, CcLinkFrame *out)
51 if (!frame || !out || len < 3)
53 size_t body = len - 1;
54 if (detws_cclink_sum(frame, body) != frame[body])
56 out->station = frame[0];
57 out->command = frame[1];
58 out->payload = (body > 2) ? (frame + 2) :
nullptr;
59 out->payload_len = body - 2;
63bool detws_cclink_get_bit(
const uint8_t *bits,
size_t bit_len,
size_t index)
65 if (!bits || index / 8 >= bit_len)
67 return (bits[index / 8] >> (index % 8)) & 1u;
70void detws_cclink_set_bit(uint8_t *bits,
size_t bit_len,
size_t index,
bool value)
72 if (!bits || index / 8 >= bit_len)
74 uint8_t mask = (uint8_t)(1u << (index % 8));
76 bits[index / 8] |= mask;
78 bits[index / 8] &= (uint8_t)~mask;
81uint16_t detws_cclink_get_word(
const uint8_t *words,
size_t word_len,
size_t index)
83 size_t off = index * 2;
84 if (!words || off + 1 >= word_len)
86 return (uint16_t)(words[off] | (words[off + 1] << 8));
CC-Link (CLPA) cyclic fieldbus frame codec (DETWS_ENABLE_CCLINK).