245 lines
6.6 KiB
C
245 lines
6.6 KiB
C
/*
|
||
* 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_ */
|