33#ifndef PROTOCORE_SIMATIC_H
34#define PROTOCORE_SIMATIC_H
44#define SIMATIC_STX 0x02
45#define SIMATIC_DLE 0x10
46#define SIMATIC_ETX 0x03
47#define SIMATIC_NAK 0x15
60uint8_t pc_3964r_bcc(
const uint8_t *data,
size_t len);
69size_t pc_3964r_build_block(uint8_t *buf,
size_t cap,
const uint8_t *data,
size_t len,
bool with_bcc);
80bool pc_3964r_parse_block(
const uint8_t *buf,
size_t len,
bool with_bcc, uint8_t *out,
size_t out_cap,
size_t *out_len);
87enum class Simatic3964State : uint8_t
96typedef void (*Simatic3964TxFn)(
void *user, uint8_t byte);
98typedef void (*Simatic3964RxFn)(
void *user,
const uint8_t *data,
size_t len);
106 Simatic3964State state;
118 uint8_t block_retries;
119 uint8_t conn_retries;
120 uint32_t deadline_ms;
126#define SIMATIC_MAX_BLOCK_RETRY 6
127#define SIMATIC_MAX_CONN_RETRY 6
130void pc_3964r_init(Simatic3964Ctx *ctx,
bool high_priority,
bool with_bcc, Simatic3964TxFn tx, Simatic3964RxFn rx,
137bool pc_3964r_send(Simatic3964Ctx *ctx,
const uint8_t *data,
size_t len, uint32_t now_ms);
140void pc_3964r_rx_byte(Simatic3964Ctx *ctx, uint8_t b, uint32_t now_ms);
143void pc_3964r_tick(Simatic3964Ctx *ctx, uint32_t now_ms);
146bool pc_3964r_idle(
const Simatic3964Ctx *ctx);
153enum class Rk512Cmd : uint8_t
161enum class Rk512Area : uint8_t
187size_t pc_rk512_build_send(uint8_t *buf,
size_t cap, Rk512Area area, uint8_t dbnr, uint16_t addr,
const uint16_t *words,
194size_t pc_rk512_build_fetch(uint8_t *buf,
size_t cap, Rk512Area area, uint8_t dbnr, uint16_t addr, uint16_t wcount);
200size_t pc_rk512_build_reaction(uint8_t *buf,
size_t cap, uint16_t status);
203bool pc_rk512_parse_header(
const uint8_t *buf,
size_t len, Rk512Header *out);
210bool pc_rk512_parse_reaction(
const uint8_t *buf,
size_t len, uint16_t *status,
const uint8_t **data,
size_t *dlen);
User-facing configuration for ProtoCore.
#define PC_SIMATIC_BLOCK_MAX
3964R block-body buffer size (built/received bytes: DLE-stuffed payload + DLE ETX + BCC).