141 lines
3.5 KiB
C
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 20
|
|
|
|
|
|
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_ */
|