| /* |
| * Copyright (c) 2020 Siddharth Chandrasekaran <siddharth@embedjournal.com> |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef _OSDP_H_ |
| #define _OSDP_H_ |
| |
| #include <zephyr.h> |
| #include <stdint.h> |
| |
| #include <sys/slist.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define OSDP_CMD_TEXT_MAX_LEN 32 |
| #define OSDP_CMD_KEYSET_KEY_MAX_LEN 32 |
| |
| /** |
| * @brief Various card formats that a PD can support. This is sent to CP |
| * when a PD must report a card read. |
| */ |
| enum osdp_card_formats_e { |
| OSDP_CARD_FMT_RAW_UNSPECIFIED, |
| OSDP_CARD_FMT_RAW_WIEGAND, |
| OSDP_CARD_FMT_ASCII, |
| OSDP_CARD_FMT_SENTINEL |
| }; |
| |
| /** |
| * @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 manuplate 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; |
| }; |
| }; |
| |
| #ifdef CONFIG_OSDP_MODE_PD |
| |
| /** |
| * @param cmd pointer to a command structure that was received by the driver. |
| * |
| * @retval 0 on success. |
| * @retval -1 on failure. |
| */ |
| int osdp_pd_get_cmd(struct osdp_cmd *cmd); |
| |
| #else /* CONFIG_OSDP_MODE_PD */ |
| |
| int osdp_cp_set_callback_key_press( |
| int (*cb)(int address, uint8_t key)); |
| int osdp_cp_set_callback_card_read( |
| int (*cb)(int address, int format, uint8_t *data, int len)); |
| int osdp_cp_send_command(int pd, struct osdp_cmd *cmd); |
| |
| #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_ */ |