// // Created by MightyPork on 2017/11/21. // #ifndef GEX_MESSAGES_H #define GEX_MESSAGES_H #include "sched_queue.h" #include "task_sched.h" #include "TinyFrame.h" extern TinyFrame *comm; /** * Initialize TinyFrame and set up listeners */ void comm_init(void); /** * Supported message types (TF_TYPE) */ enum TF_Types_ { // General, low level MSG_SUCCESS = 0x00, //!< Generic success response; used by default in all responses; payload is transaction-specific MSG_PING = 0x01, //!< Ping request (or response), used to test connection MSG_ERROR = 0x02, //!< Generic failure response (when a request fails to execute) MSG_BULK_READ_OFFER = 0x03, //!< Offer of data to read. Payload: u32 total len MSG_BULK_READ_POLL = 0x04, //!< Request to read a previously announced chunk. MSG_BULK_WRITE_OFFER = 0x05, //!< Offer to receive data in a write transaction. Payload: u32 max size, u32 max chunk MSG_BULK_DATA = 0x06, //!< Writing a chunk, or sending a chunk to master. MSG_BULK_END = 0x07, //!< Bulk transfer is done, no more data to read or write. Recipient shall check total len and discard it on mismatch. There could be a checksum ... MSG_BULK_ABORT = 0x08, //!< Discard the ongoing transfer // Unit messages MSG_UNIT_REQUEST = 0x10, //!< Command addressed to a particular unit MSG_UNIT_REPORT = 0x11, //!< Spontaneous report from a unit // System messages MSG_LIST_UNITS = 0x20, //!< Get all unit call-signs and names }; /** * Respond to a TF message using printf-like formatting. * Works synchronously, must be called on a job queue. * * @param type - response type byte * @param frame_id - ID of the original msg * @param format - printf format * @param ... - replacements */ void __attribute__((format(printf,3,4))) tf_respond_snprintf(TF_TYPE type, TF_ID frame_id, const char *format, ...); /** * Respond to a TF message with a buffer of fixed length and custom type. * Works synchronously, must be called on a job queue. * * @param type - response type byte * @param frame_id - ID of the original msg * @param buf - byte buffer * @param len - buffer size */ void tf_respond_buf(TF_TYPE type, TF_ID frame_id, const uint8_t *buf, uint32_t len); /** * Respond to a TF message with empty body and MSG_SUCCESS type. * Works synchronously, must be called on a job queue. * * @param frame_id - ID of the original msg */ static inline void tf_respond_ok(TF_ID frame_id) { tf_respond_buf(MSG_SUCCESS, frame_id, NULL, 0); } /** * Same like tf_respond_buf(), but used for sending spontaneous reports. * Works synchronously, must be called on a job queue / timer task etc. * * @param type - response type byte * @param buf - byte buffer * @param len - buffer size */ void tf_send_buf(TF_TYPE type, const uint8_t *buf, uint32_t len); /** * Same like tf_respond_buf(), but the buffer length is measured with strlen. * Used to sending ASCII string responses. * Works synchronously, must be called on a job queue. * * @param type - response type byte * @param frame_id - ID of the original msg * @param str - character buffer, zero terminated */ static inline void tf_respond_str(TF_TYPE type, TF_ID frame_id, const char *str) { tf_respond_buf(type, frame_id, (const uint8_t *) str, (uint32_t) strlen(str)); } /** * Schedule sending an ASCII string error response. * Schedules a low priority job. * * @param frame_id - ID of the original msg * @param str - character buffer, zero terminated */ void sched_respond_err(TF_ID frame_id, const char *str); /** * Variant of sched_respond_err() for reporting bad received command code * * @param msg_id - ID of the original msg */ void sched_respond_bad_cmd(TF_ID frame_id); /** * Variant of sched_respond_err() for reporting malformed commands (e.g. too short payload) * * @param msg_id - ID of the original msg */ void sched_respond_malformed_cmd(TF_ID frame_id); /** * Schedule sending an empty response with MSG_SUCCESS type. * Schedules a low priority job. * * @param frame_id - ID of the original msg */ void sched_respond_suc(TF_ID frame_id); /** * Schedule sending a one-byte response with MSG_SUCCESS type. * Schedules a high priority job. * * @param frame_id - ID of the original msg * @param d - data */ void sched_respond_u8(TF_ID frame_id, uint8_t d); /** * Schedule sending a two-byte response with MSG_SUCCESS type. * Schedules a high priority job. * * @param frame_id - ID of the original msg * @param d - data */ void sched_respond_u16(TF_ID frame_id, uint16_t d); /** * Schedule sending a 4-byte response with MSG_SUCCESS type. * Schedules a high priority job. * * @param frame_id - ID of the original msg * @param d - data */ void sched_respond_u32(TF_ID frame_id, uint32_t d); #endif //GEX_MESSAGES_H