Files
feeder_mk2/code/Core/Inc/photon_protocol.h
2025-12-19 17:49:10 +07:00

141 lines
3.5 KiB
C

/*
* photon_protocol.h
*
* Created on: 19 Dec 2025
* Author: janik
*/
#ifndef INC_PHOTON_PROTOCOL_H_
#define INC_PHOTON_PROTOCOL_H_
#define UUID_LENGTH 12 // 12 8bit values
#define PHOTON_NETWORK_CONTROLLER_ADDRESS 0x00
#define PHOTON_NETWORK_BROADCAST_ADDRESS 0xFF
#define VENDOR_SPECIFIC_OPTIONS_LENGTH 16
typedef enum {
STATUS_OK = 0x00,
STATUS_WRONG_FEEDER_ID = 0x01,
STATUS_COULDNT_REACH = 0x02,
STATUS_UNINITIALIZED_FEEDER = 0x03,
STATUS_FEEDING_IN_PROGRESS = 0x04,
STATUS_FAIL = 0x05,
STATUS_TIMEOUT = 0xFE,
STATUS_UNKNOWN_ERROR = 0xFF
} FeederStatus;
typedef enum {
// Unicast Commands
GET_FEEDER_ID = 0x01,
INITIALIZE_FEEDER = 0x02,
GET_VERSION = 0x03,
MOVE_FEED_FORWARD = 0x04,
MOVE_FEED_BACKWARD = 0x05,
MOVE_FEED_STATUS = 0x06,
VENDOR_OPTIONS = 0xbf,
// Broadcast Commands
GET_FEEDER_ADDRESS = 0xc0,
IDENTIFY_FEEDER = 0xc1,
PROGRAM_FEEDER_FLOOR = 0xc2,
UNINITIALIZED_FEEDERS_RESPOND = 0xc3
// EXTENDED_COMMAND = 0xff, Unused, reserved for future use
} FeederCommand;
/* ---------- Packet Header ---------- */
typedef struct __attribute__((packed)) {
uint8_t toAddress;
uint8_t fromAddress;
uint8_t packetId;
uint8_t payloadLength;
uint8_t crc;
} PhotonPacketHeader;
/* ---------- Command Payloads ---------- */
typedef struct __attribute__((packed)) {
uint8_t distance;
} MoveCommand;
typedef struct __attribute__((packed)) {
uint8_t uuid[UUID_LENGTH];
} GetFeederAddressCommand;
typedef struct __attribute__((packed)) {
uint8_t uuid[UUID_LENGTH];
} InitializeFeederCommand;
typedef struct __attribute__((packed)) {
uint8_t options[VENDOR_SPECIFIC_OPTIONS_LENGTH];
} VendorOptionsCommand;
typedef struct __attribute__((packed)) {
uint8_t uuid[UUID_LENGTH];
uint8_t address;
} ProgramFeederFloorAddressCommand;
typedef struct __attribute__((packed)) {
uint8_t uuid[UUID_LENGTH];
} IdentifyFeederCommand;
/* ---------- Full Command Packet ---------- */
typedef struct __attribute__((packed)) {
PhotonPacketHeader header;
uint8_t commandId;
union {
MoveCommand move;
GetFeederAddressCommand getFeederAddress;
InitializeFeederCommand initializeFeeder;
VendorOptionsCommand vendorOptions;
ProgramFeederFloorAddressCommand programFeederFloorAddress;
IdentifyFeederCommand identifyFeeder;
} payload;
} PhotonCommand;
/* ---------- Response Payloads ---------- */
typedef struct __attribute__((packed)) {
uint8_t uuid[UUID_LENGTH];
} GetFeederIdResponse;
typedef struct __attribute__((packed)) {
uint8_t uuid[UUID_LENGTH];
} InitializeFeederResponse;
typedef struct __attribute__((packed)) {
uint8_t version;
} GetProtocolVersionResponse;
typedef struct __attribute__((packed)) {
uint16_t expectedFeedTime;
} FeedDistanceResponse;
typedef struct __attribute__((packed)) {
uint8_t options[VENDOR_SPECIFIC_OPTIONS_LENGTH];
} VendorOptionsResponse;
/* ---------- Full Response Packet ---------- */
typedef struct __attribute__((packed)) {
PhotonPacketHeader header;
uint8_t status;
union {
GetFeederIdResponse getFeederId;
InitializeFeederResponse initializeFeeder;
GetProtocolVersionResponse protocolVersion;
FeedDistanceResponse expectedTimeToFeed;
VendorOptionsResponse vendorOptions;
} payload;
} PhotonResponse;
#endif /* INC_PHOTON_PROTOCOL_H_ */