/* * Copyright (c) 2020 Siddharth Chandrasekaran * * SPDX-License-Identifier: Apache-2.0 */ #ifndef _OSDP_H_ #define _OSDP_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif #define OSDP_CMD_TEXT_MAX_LEN 32 #define OSDP_CMD_KEYSET_KEY_MAX_LEN 32 #define OSDP_EVENT_MAX_DATALEN 64 /** * @brief Command sent from CP to Control digital output of PD. * * @param output_no 0 = First Output, 1 = Second Output, etc. * @param control_code One of the following: * 0 - NOP – do not alter this output * 1 - set the permanent state to OFF, abort timed operation (if any) * 2 - set the permanent state to ON, abort timed operation (if any) * 3 - set the permanent state to OFF, allow timed operation to complete * 4 - set the permanent state to ON, allow timed operation to complete * 5 - set the temporary state to ON, resume perm state on timeout * 6 - set the temporary state to OFF, resume permanent state on timeout * @param timer_count Time in units of 100 ms */ struct osdp_cmd_output { uint8_t output_no; uint8_t control_code; uint16_t timer_count; }; /** * @brief LED Colors as specified in OSDP for the on_color/off_color parameters. */ enum osdp_led_color_e { OSDP_LED_COLOR_NONE, OSDP_LED_COLOR_RED, OSDP_LED_COLOR_GREEN, OSDP_LED_COLOR_AMBER, OSDP_LED_COLOR_BLUE, OSDP_LED_COLOR_SENTINEL }; /** * @brief LED params sub-structure. Part of LED command. See struct osdp_cmd_led * * @param control_code One of the following: * Temporary Control Code: * 0 - NOP - do not alter this LED's temporary settings * 1 - Cancel any temporary operation and display this LED's permanent state * immediately * 2 - Set the temporary state as given and start timer immediately * Permanent Control Code: * 0 - NOP - do not alter this LED's permanent settings * 1 - Set the permanent state as given * @param on_count The ON duration of the flash, in units of 100 ms * @param off_count The OFF duration of the flash, in units of 100 ms * @param on_color Color to set during the ON timer (enum osdp_led_color_e) * @param off_color Color to set during the OFF timer (enum osdp_led_color_e) * @param timer_count Time in units of 100 ms (only for temporary mode) */ struct osdp_cmd_led_params { uint8_t control_code; uint8_t on_count; uint8_t off_count; uint8_t on_color; uint8_t off_color; uint16_t timer_count; }; /** * @brief Sent from CP to PD to control the behaviour of it's on-board LEDs * * @param reader 0 = First Reader, 1 = Second Reader, etc. * @param led_number 0 = first LED, 1 = second LED, etc. * @param temporary ephemeral LED status descriptor * @param permanent permanent LED status descriptor */ struct osdp_cmd_led { uint8_t reader; uint8_t led_number; struct osdp_cmd_led_params temporary; struct osdp_cmd_led_params permanent; }; /** * @brief Sent from CP to control the behaviour of a buzzer in the PD. * * @param reader 0 = First Reader, 1 = Second Reader, etc. * @param control_code 0: no tone, 1: off, 2: default tone, 3+ is TBD. * @param on_count The ON duration of the flash, in units of 100 ms * @param off_count The OFF duration of the flash, in units of 100 ms * @param rep_count The number of times to repeat the ON/OFF cycle; 0: forever */ struct osdp_cmd_buzzer { uint8_t reader; uint8_t control_code; uint8_t on_count; uint8_t off_count; uint8_t rep_count; }; /** * @brief Command to manipulate any display units that the PD supports. * * @param reader 0 = First Reader, 1 = Second Reader, etc. * @param control_code One of the following: * 1 - permanent text, no wrap * 2 - permanent text, with wrap * 3 - temp text, no wrap * 4 - temp text, with wrap * @param temp_time duration to display temporary text, in seconds * @param offset_row row to display the first character (1 indexed) * @param offset_col column to display the first character (1 indexed) * @param length Number of characters in the string * @param data The string to display */ struct osdp_cmd_text { uint8_t reader; uint8_t control_code; uint8_t temp_time; uint8_t offset_row; uint8_t offset_col; uint8_t length; uint8_t data[OSDP_CMD_TEXT_MAX_LEN]; }; /** * @brief Sent in response to a COMSET command. Set communication parameters to * PD. Must be stored in PD non-volatile memory. * * @param address Unit ID to which this PD will respond after the change takes * effect. * @param baud_rate baud rate value 9600/38400/115200 */ struct osdp_cmd_comset { uint8_t address; uint32_t baud_rate; }; /** * @brief This command transfers an encryption key from the CP to a PD. * * @param type Type of keys: * - 0x01 – Secure Channel Base Key * @param length Number of bytes of key data - (Key Length in bits + 7) / 8 * @param data Key data */ struct osdp_cmd_keyset { uint8_t type; uint8_t length; uint8_t data[OSDP_CMD_KEYSET_KEY_MAX_LEN]; }; /** * @brief OSDP application exposed commands */ enum osdp_cmd_e { OSDP_CMD_OUTPUT = 1, OSDP_CMD_LED, OSDP_CMD_BUZZER, OSDP_CMD_TEXT, OSDP_CMD_KEYSET, OSDP_CMD_COMSET, OSDP_CMD_SENTINEL }; /** * @brief OSDP Command Structure. This is a wrapper for all individual OSDP * commands. * * @param id used to select specific commands in union. Type: enum osdp_cmd_e * @param led LED command structure * @param buzzer buzzer command structure * @param text text command structure * @param output output command structure * @param comset comset command structure * @param keyset keyset command structure */ struct osdp_cmd { sys_snode_t node; enum osdp_cmd_e id; union { struct osdp_cmd_led led; struct osdp_cmd_buzzer buzzer; struct osdp_cmd_text text; struct osdp_cmd_output output; struct osdp_cmd_comset comset; struct osdp_cmd_keyset keyset; }; }; /** * @brief Various card formats that a PD can support. This is sent to CP * when a PD must report a card read. */ enum osdp_event_cardread_format_e { OSDP_CARD_FMT_RAW_UNSPECIFIED, OSDP_CARD_FMT_RAW_WIEGAND, OSDP_CARD_FMT_ASCII, OSDP_CARD_FMT_SENTINEL }; /** * @brief OSDP event cardread * * @param reader_no In context of readers attached to current PD, this number * indicated this number. This is not supported by LibOSDP. * @param format Format of the card being read. * see `enum osdp_event_cardread_format_e` * @param direction Card read direction of PD 0 - Forward; 1 - Backward * @param length Length of card data in bytes or bits depending on `format` * (see note). * @param data Card data of `length` bytes or bits bits depending on `format` * (see note). * * @note When `format` is set to OSDP_CARD_FMT_RAW_UNSPECIFIED or * OSDP_CARD_FMT_RAW_WIEGAND, the length is expressed in bits. OTOH, when it is * set to OSDP_CARD_FMT_ASCII, the length is in bytes. The number of bytes to * read from the `data` field must be interpreted accordingly. */ struct osdp_event_cardread { int reader_no; enum osdp_event_cardread_format_e format; int direction; int length; uint8_t data[OSDP_EVENT_MAX_DATALEN]; }; /** * @brief OSDP Event Keypad * * @param reader_no In context of readers attached to current PD, this number * indicated this number. This is not supported by LibOSDP. * @param length Length of keypress data in bytes * @param data keypress data of `length` bytes */ struct osdp_event_keypress { int reader_no; int length; uint8_t data[OSDP_EVENT_MAX_DATALEN]; }; /** * @brief OSDP PD Events */ enum osdp_event_type { OSDP_EVENT_CARDREAD, OSDP_EVENT_KEYPRESS, OSDP_EVENT_SENTINEL }; /** * @brief OSDP Event structure. * * @param type used to select specific event in union. See: enum osdp_event_type * @param keypress keypress event structure * @param cardread cardread event structure */ struct osdp_event { sys_snode_t node; enum osdp_event_type type; union { struct osdp_event_keypress keypress; struct osdp_event_cardread cardread; }; }; /** * @brief Callback for PD command notifications. After it has been registered * with `osdp_pd_set_command_callback`, this method is invoked when the PD * receives a command from the CP. * * @param arg pointer that will was passed to the arg param of * `osdp_pd_set_command_callback`. * @param cmd pointer to the received command. * * @retval 0 if LibOSDP must send a `osdp_ACK` response * @retval -ve if LibOSDP must send a `osdp_NAK` response * @retval +ve and modify the passed `struct osdp_cmd *cmd` if LibOSDP must send * a specific response. This is useful for sending manufacturer specific * reply ``osdp_MFGREP``. */ typedef int (*pd_command_callback_t)(void *arg, struct osdp_cmd *cmd); /** * @brief Callback for CP event notifications. After it has been registered with * `osdp_cp_set_event_callback`, this method is invoked when the CP receives an * event from the PD. * * @param arg Opaque pointer provided by the application during callback * registration. * @param pd the offset (0-indexed) of this PD in kconfig `OSDP_PD_ADDRESS_LIST` * @param ev pointer to osdp_event struct (filled by libosdp). * * @retval 0 on handling the event successfully. * @retval -ve on errors. */ typedef int (*cp_event_callback_t)(void *arg, int pd, struct osdp_event *ev); #ifdef CONFIG_OSDP_MODE_PD /** * @brief Set callback method for PD command notification. This callback is * invoked when the PD receives a command from the CP. * * @param cb The callback function's pointer * @param arg A pointer that will be passed as the first argument of `cb` */ void osdp_pd_set_command_callback(pd_command_callback_t cb, void *arg); /** * @brief API to notify PD events to CP. These events are sent to the CP as an * alternate response to a POLL command. * * @param event pointer to event struct. Must be filled by application. * * @retval 0 on success * @retval -1 on failure */ int osdp_pd_notify_event(const struct osdp_event *event); #else /* CONFIG_OSDP_MODE_PD */ /** * @brief Generic command enqueue API. * * @param pd the offset (0-indexed) of this PD in kconfig `OSDP_PD_ADDRESS_LIST` * @param cmd command pointer. Must be filled by application. * * @retval 0 on success * @retval -1 on failure * * @note This method only adds the command on to a particular PD's command * queue. The command itself can fail due to various reasons. */ int osdp_cp_send_command(int pd, struct osdp_cmd *cmd); /** * @brief Set callback method for CP event notification. This callback is * invoked when the CP receives an event from the PD. * * @param cb The callback function's pointer * @param arg A pointer that will be passed as the first argument of `cb` */ void osdp_cp_set_event_callback(cp_event_callback_t cb, void *arg); #endif /* CONFIG_OSDP_MODE_PD */ #ifdef CONFIG_OSDP_SC_ENABLED uint32_t osdp_get_sc_status_mask(void); #endif #ifdef __cplusplus } #endif #endif /* _OSDP_H_ */