mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2025-02-17 19:19:16 +01:00
aciodrv: refactor to support multiple active drivers (with specified ports)
This commit is contained in:
parent
837affc66c
commit
49d0bc638b
@ -12,11 +12,14 @@
|
|||||||
/* Enable to dump all data to the logger */
|
/* Enable to dump all data to the logger */
|
||||||
//#define AC_IO_MSG_LOG
|
//#define AC_IO_MSG_LOG
|
||||||
|
|
||||||
static uint8_t aciodrv_device_msg_counter = 1;
|
struct aciodrv_device_ctx {
|
||||||
static uint8_t aciodrv_device_node_count;
|
HANDLE fd;
|
||||||
static char aviodrv_device_node_products[16][4];
|
char node_products[16][4]; // 16 devices max
|
||||||
|
uint8_t msg_counter;
|
||||||
|
uint8_t node_count;
|
||||||
|
};
|
||||||
|
|
||||||
static bool aciodrv_device_init(void)
|
static bool aciodrv_device_init(struct aciodrv_device_ctx* device)
|
||||||
{
|
{
|
||||||
uint8_t init_seq[1] = {AC_IO_SOF};
|
uint8_t init_seq[1] = {AC_IO_SOF};
|
||||||
uint8_t read_buff[1] = {0x00};
|
uint8_t read_buff[1] = {0x00};
|
||||||
@ -24,18 +27,18 @@ static bool aciodrv_device_init(void)
|
|||||||
/* init/reset the device by sending 0xAA until 0xAA is returned */
|
/* init/reset the device by sending 0xAA until 0xAA is returned */
|
||||||
int read = 0;
|
int read = 0;
|
||||||
do {
|
do {
|
||||||
if (aciodrv_port_write(init_seq, sizeof(init_seq)) <= 0) {
|
if (aciodrv_port_write(device->fd, init_seq, sizeof(init_seq)) <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
read = aciodrv_port_read(read_buff, sizeof(read_buff));
|
read = aciodrv_port_read(device->fd, read_buff, sizeof(read_buff));
|
||||||
} while ((read <= 0) || (read_buff[0] != init_seq[0]));
|
} while ((read <= 0) || (read_buff[0] != init_seq[0]));
|
||||||
|
|
||||||
if (read > 0) {
|
if (read > 0) {
|
||||||
log_warning("Obtained SOF, clearing out buffer now");
|
log_warning("Obtained SOF, clearing out buffer now");
|
||||||
/* empty buffer by reading all data */
|
/* empty buffer by reading all data */
|
||||||
while (read > 0) {
|
while (read > 0) {
|
||||||
read = aciodrv_port_read(init_seq, sizeof(init_seq));
|
read = aciodrv_port_read(device->fd, init_seq, sizeof(init_seq));
|
||||||
}
|
}
|
||||||
log_warning("Cleared buffer, init done");
|
log_warning("Cleared buffer, init done");
|
||||||
|
|
||||||
@ -57,7 +60,7 @@ aciodrv_device_log_buffer(const char *msg, const uint8_t *buffer, int length)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool aciodrv_device_send(const uint8_t *buffer, int length)
|
static bool aciodrv_device_send(struct aciodrv_device_ctx* device, const uint8_t *buffer, int length)
|
||||||
{
|
{
|
||||||
uint8_t send_buf[512];
|
uint8_t send_buf[512];
|
||||||
int send_buf_pos = 0;
|
int send_buf_pos = 0;
|
||||||
@ -98,7 +101,7 @@ static bool aciodrv_device_send(const uint8_t *buffer, int length)
|
|||||||
aciodrv_device_log_buffer("Send (2)", send_buf, send_buf_pos);
|
aciodrv_device_log_buffer("Send (2)", send_buf, send_buf_pos);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (aciodrv_port_write(send_buf, send_buf_pos) != send_buf_pos) {
|
if (aciodrv_port_write(device->fd, send_buf, send_buf_pos) != send_buf_pos) {
|
||||||
log_warning("Sending data with length %d failed", send_buf_pos);
|
log_warning("Sending data with length %d failed", send_buf_pos);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -106,7 +109,7 @@ static bool aciodrv_device_send(const uint8_t *buffer, int length)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aciodrv_device_receive(uint8_t *buffer, int size)
|
static int aciodrv_device_receive(struct aciodrv_device_ctx* device, uint8_t *buffer, int size)
|
||||||
{
|
{
|
||||||
uint8_t recv_buf[512];
|
uint8_t recv_buf[512];
|
||||||
int recv_size = 0;
|
int recv_size = 0;
|
||||||
@ -118,7 +121,7 @@ static int aciodrv_device_receive(uint8_t *buffer, int size)
|
|||||||
of 0xAAs before we get a valid message. */
|
of 0xAAs before we get a valid message. */
|
||||||
recv_buf[0] = AC_IO_SOF;
|
recv_buf[0] = AC_IO_SOF;
|
||||||
do {
|
do {
|
||||||
read = aciodrv_port_read(recv_buf, 1);
|
read = aciodrv_port_read(device->fd, recv_buf, 1);
|
||||||
} while (recv_buf[0] == AC_IO_SOF);
|
} while (recv_buf[0] == AC_IO_SOF);
|
||||||
|
|
||||||
if (read > 0) {
|
if (read > 0) {
|
||||||
@ -137,7 +140,7 @@ static int aciodrv_device_receive(uint8_t *buffer, int size)
|
|||||||
non-zero read. */
|
non-zero read. */
|
||||||
while (size > 0) {
|
while (size > 0) {
|
||||||
do {
|
do {
|
||||||
read = aciodrv_port_read(recv_buf + recv_size, 1);
|
read = aciodrv_port_read(device->fd, recv_buf + recv_size, 1);
|
||||||
} while (read == 0);
|
} while (read == 0);
|
||||||
|
|
||||||
if (read < 0) {
|
if (read < 0) {
|
||||||
@ -150,7 +153,8 @@ static int aciodrv_device_receive(uint8_t *buffer, int size)
|
|||||||
/* next byte is our real data
|
/* next byte is our real data
|
||||||
overwrite escape byte */
|
overwrite escape byte */
|
||||||
do {
|
do {
|
||||||
read = aciodrv_port_read(recv_buf + recv_size, 1);
|
read = aciodrv_port_read(
|
||||||
|
device->fd, recv_buf + recv_size, 1);
|
||||||
} while (read == 0);
|
} while (read == 0);
|
||||||
|
|
||||||
if (read < 0) {
|
if (read < 0) {
|
||||||
@ -195,7 +199,7 @@ static int aciodrv_device_receive(uint8_t *buffer, int size)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t aciodrv_device_enum_nodes(void)
|
static uint8_t aciodrv_device_enum_nodes(struct aciodrv_device_ctx* device)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -205,7 +209,9 @@ static uint8_t aciodrv_device_enum_nodes(void)
|
|||||||
msg.cmd.count = 0;
|
msg.cmd.count = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Enumerating nodes failed");
|
log_warning("Enumerating nodes failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -215,7 +221,7 @@ static uint8_t aciodrv_device_enum_nodes(void)
|
|||||||
return msg.cmd.count;
|
return msg.cmd.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool aciodrv_device_get_version(uint8_t node_id, char product[4])
|
static bool aciodrv_device_get_version(struct aciodrv_device_ctx* device, uint8_t node_id, char product[4])
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -224,6 +230,7 @@ static bool aciodrv_device_get_version(uint8_t node_id, char product[4])
|
|||||||
msg.cmd.nbytes = 0;
|
msg.cmd.nbytes = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
|
device,
|
||||||
&msg,
|
&msg,
|
||||||
offsetof(struct ac_io_message, cmd.raw) +
|
offsetof(struct ac_io_message, cmd.raw) +
|
||||||
sizeof(struct ac_io_version))) {
|
sizeof(struct ac_io_version))) {
|
||||||
@ -252,7 +259,7 @@ static bool aciodrv_device_get_version(uint8_t node_id, char product[4])
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool aciodrv_device_start_node(uint8_t node_id)
|
static bool aciodrv_device_start_node(struct aciodrv_device_ctx* device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -261,7 +268,9 @@ static bool aciodrv_device_start_node(uint8_t node_id)
|
|||||||
msg.cmd.nbytes = 0;
|
msg.cmd.nbytes = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Starting node %d failed", node_id);
|
log_warning("Starting node %d failed", node_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -270,55 +279,64 @@ static bool aciodrv_device_start_node(uint8_t node_id)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_device_open(const char *port, int baud)
|
struct aciodrv_device_ctx* aciodrv_device_open(const char *port_path, int baud)
|
||||||
{
|
{
|
||||||
if (!aciodrv_port_open(port, baud)) {
|
HANDLE port = aciodrv_port_open(port_path, baud);
|
||||||
|
if (!port) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct aciodrv_device_ctx* device = malloc(sizeof(struct aciodrv_device_ctx));
|
||||||
|
|
||||||
|
device->fd = port;
|
||||||
|
|
||||||
|
if (!aciodrv_device_init(device)) {
|
||||||
|
aciodrv_device_close(device);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
device->node_count = aciodrv_device_enum_nodes(device);
|
||||||
|
if (device->node_count == 0) {
|
||||||
|
aciodrv_device_close(device);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_device_init()) {
|
for (uint8_t i = 0; i < device->node_count; i++) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
aciodrv_device_node_count = aciodrv_device_enum_nodes();
|
|
||||||
if (aciodrv_device_node_count == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < aciodrv_device_node_count; i++) {
|
|
||||||
if (!aciodrv_device_get_version(
|
if (!aciodrv_device_get_version(
|
||||||
i + 1, aviodrv_device_node_products[i])) {
|
device, i + 1, device->node_products[i])) {
|
||||||
return false;
|
aciodrv_device_close(device);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t i = 0; i < aciodrv_device_node_count; i++) {
|
for (uint8_t i = 0; i < device->node_count; i++) {
|
||||||
if (!aciodrv_device_start_node(i + 1)) {
|
if (!aciodrv_device_start_node(device, i + 1)) {
|
||||||
return false;
|
aciodrv_device_close(device);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t aciodrv_device_get_node_count(void)
|
uint8_t aciodrv_device_get_node_count(struct aciodrv_device_ctx* device)
|
||||||
{
|
{
|
||||||
return aciodrv_device_node_count;
|
return device->node_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_device_get_node_product_ident(uint8_t node_id, char product[4])
|
bool aciodrv_device_get_node_product_ident(struct aciodrv_device_ctx* device, uint8_t node_id, char product[4])
|
||||||
{
|
{
|
||||||
if (aciodrv_device_node_count == 0 || node_id > aciodrv_device_node_count) {
|
if (device->node_count == 0 || node_id > device->node_count) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(product, aviodrv_device_node_products[node_id], 4);
|
memcpy(product, device->node_products[node_id], 4);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_send_and_recv(struct ac_io_message *msg, int resp_size)
|
bool aciodrv_send_and_recv(struct aciodrv_device_ctx* device, struct ac_io_message *msg, int resp_size)
|
||||||
{
|
{
|
||||||
msg->cmd.seq_no = aciodrv_device_msg_counter++;
|
msg->cmd.seq_no = device->msg_counter++;
|
||||||
int send_size = offsetof(struct ac_io_message, cmd.raw) + msg->cmd.nbytes;
|
int send_size = offsetof(struct ac_io_message, cmd.raw) + msg->cmd.nbytes;
|
||||||
|
|
||||||
#ifdef AC_IO_MSG_LOG
|
#ifdef AC_IO_MSG_LOG
|
||||||
@ -328,7 +346,7 @@ bool aciodrv_send_and_recv(struct ac_io_message *msg, int resp_size)
|
|||||||
msg->cmd.code,
|
msg->cmd.code,
|
||||||
send_size);
|
send_size);
|
||||||
#endif
|
#endif
|
||||||
if (aciodrv_device_send((uint8_t *) msg, send_size) <= 0) {
|
if (aciodrv_device_send(device, (uint8_t *) msg, send_size) <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,7 +355,7 @@ bool aciodrv_send_and_recv(struct ac_io_message *msg, int resp_size)
|
|||||||
#ifdef AC_IO_MSG_LOG
|
#ifdef AC_IO_MSG_LOG
|
||||||
log_info("Beginning recv: (%d b)", resp_size);
|
log_info("Beginning recv: (%d b)", resp_size);
|
||||||
#endif
|
#endif
|
||||||
if (aciodrv_device_receive((uint8_t *) msg, resp_size) <= 0) {
|
if (aciodrv_device_receive(device, (uint8_t *) msg, resp_size) <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +370,9 @@ bool aciodrv_send_and_recv(struct ac_io_message *msg, int resp_size)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void aciodrv_device_close(void)
|
void aciodrv_device_close(struct aciodrv_device_ctx* device)
|
||||||
{
|
{
|
||||||
aciodrv_port_close();
|
aciodrv_port_close(device->fd);
|
||||||
|
|
||||||
|
free(device);
|
||||||
}
|
}
|
||||||
|
@ -5,48 +5,56 @@
|
|||||||
|
|
||||||
#include "acio/acio.h"
|
#include "acio/acio.h"
|
||||||
|
|
||||||
|
#include "windows.h"
|
||||||
|
|
||||||
|
struct aciodrv_device_ctx;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open an ACIO device connected to a serial port.
|
* Open an ACIO device connected to a serial port.
|
||||||
*
|
*
|
||||||
* @param port Port the device is connected to (e.g. "COM1")
|
* @param port Port the device is connected to (e.g. "COM1")
|
||||||
* @param baud Baud rate for communication (e.g. 57600 for ICCA)
|
* @param baud Baud rate for communication (e.g. 57600 for ICCA)
|
||||||
* @return True if opening the port and resetting the device was successful,
|
* @return opened device context, NULL on error
|
||||||
* false on error.
|
|
||||||
*/
|
*/
|
||||||
bool aciodrv_device_open(const char *port, int baud);
|
struct aciodrv_device_ctx* aciodrv_device_open(const char *port_path, int baud);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the node count on the opened device.
|
* Get the node count on the opened device.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @return Total num of nodes enumerated on the ACIO device.
|
* @return Total num of nodes enumerated on the ACIO device.
|
||||||
*/
|
*/
|
||||||
uint8_t aciodrv_device_get_node_count(void);
|
uint8_t aciodrv_device_get_node_count(struct aciodrv_device_ctx* device);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the product identifier of an enumerated node.
|
* Get the product identifier of an enumerated node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node. Needs to be in range of the total node count.
|
* @param node_id Id of the node. Needs to be in range of the total node count.
|
||||||
* @param product Buffer to return the product id to.
|
* @param product Buffer to return the product id to.
|
||||||
* @return True on success, false on error. If True the variable product
|
* @return True on success, false on error. If True the variable product
|
||||||
* contains the identifier of the queried node.
|
* contains the identifier of the queried node.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_device_get_node_product_ident(uint8_t node_id, char product[4]);
|
bool aciodrv_device_get_node_product_ident(struct aciodrv_device_ctx* device, uint8_t node_id, char product[4]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a message to the ACIO bus and receive an answer.
|
* Send a message to the ACIO bus and receive an answer.
|
||||||
* Use this to implement the protocol for each type of device that can be
|
* Use this to implement the protocol for each type of device that can be
|
||||||
* part of the bus.
|
* part of the bus.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param msg Msg to send to the bus. Make sure that the buffer backing
|
* @param msg Msg to send to the bus. Make sure that the buffer backing
|
||||||
* this message is big enough to receive the response as well.
|
* this message is big enough to receive the response as well.
|
||||||
* @param resp_size Size of the expecting response.
|
* @param resp_size Size of the expecting response.
|
||||||
* @return True on success, false on error.
|
* @return True on success, false on error.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_send_and_recv(struct ac_io_message *msg, int resp_size);
|
bool aciodrv_send_and_recv(struct aciodrv_device_ctx* device, struct ac_io_message *msg, int resp_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the previously opened ACIO device.
|
* Close the previously opened ACIO device.
|
||||||
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
*/
|
*/
|
||||||
void aciodrv_device_close(void);
|
void aciodrv_device_close(struct aciodrv_device_ctx* device);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -6,7 +6,9 @@
|
|||||||
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
static bool aciodrv_icca_queue_loop_start(uint8_t node_id)
|
static bool aciodrv_icca_queue_loop_start(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -16,7 +18,9 @@ static bool aciodrv_icca_queue_loop_start(uint8_t node_id)
|
|||||||
msg.cmd.status = 0;
|
msg.cmd.status = 0;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Starting queue loop failed");
|
log_warning("Starting queue loop failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -27,9 +31,9 @@ static bool aciodrv_icca_queue_loop_start(uint8_t node_id)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_icca_init(uint8_t node_id)
|
bool aciodrv_icca_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
if (!aciodrv_icca_queue_loop_start(node_id + 1)) {
|
if (!aciodrv_icca_queue_loop_start(device, node_id + 1)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +41,10 @@ bool aciodrv_icca_init(uint8_t node_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_icca_set_state(
|
bool aciodrv_icca_set_state(
|
||||||
uint8_t node_id, int slot_state, struct ac_io_icca_state *state)
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
int slot_state,
|
||||||
|
struct ac_io_icca_state *state)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -49,7 +56,9 @@ bool aciodrv_icca_set_state(
|
|||||||
msg.cmd.raw[1] = slot_state;
|
msg.cmd.raw[1] = slot_state;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + msg.cmd.raw[0])) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + msg.cmd.raw[0])) {
|
||||||
log_warning("Setting state of node %d failed", node_id + 1);
|
log_warning("Setting state of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -61,7 +70,10 @@ bool aciodrv_icca_set_state(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_icca_get_state(uint8_t node_id, struct ac_io_icca_state *state)
|
bool aciodrv_icca_get_state(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct ac_io_icca_state *state)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -72,7 +84,9 @@ bool aciodrv_icca_get_state(uint8_t node_id, struct ac_io_icca_state *state)
|
|||||||
msg.cmd.count = sizeof(struct ac_io_icca_state);
|
msg.cmd.count = sizeof(struct ac_io_icca_state);
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + msg.cmd.count)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + msg.cmd.count)) {
|
||||||
log_warning("Getting state of node %d failed", node_id + 1);
|
log_warning("Getting state of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -84,7 +98,10 @@ bool aciodrv_icca_get_state(uint8_t node_id, struct ac_io_icca_state *state)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_icca_read_card(uint8_t node_id, struct ac_io_icca_state *state)
|
bool aciodrv_icca_read_card(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct ac_io_icca_state *state)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -95,7 +112,9 @@ bool aciodrv_icca_read_card(uint8_t node_id, struct ac_io_icca_state *state)
|
|||||||
msg.cmd.count = sizeof(struct ac_io_icca_state);
|
msg.cmd.count = sizeof(struct ac_io_icca_state);
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + msg.cmd.count)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + msg.cmd.count)) {
|
||||||
log_warning("Reading card of node %d failed", node_id + 1);
|
log_warning("Reading card of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -6,17 +6,19 @@
|
|||||||
/**
|
/**
|
||||||
* Initialize an ICCA node.
|
* Initialize an ICCA node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to initialize (0 based).
|
* @param node_id Id of the node to initialize (0 based).
|
||||||
* @return True if successful, false on error.
|
* @return True if successful, false on error.
|
||||||
* @note This module is supposed to be used in combination with the common
|
* @note This module is supposed to be used in combination with the common
|
||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_icca_init(uint8_t node_id);
|
bool aciodrv_icca_init(struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the state of on ICCA node.
|
* Set the state of on ICCA node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to set the state for (0 based).
|
* @param node_id Id of the node to set the state for (0 based).
|
||||||
* @param slot_state State of the slot (refer to corresponding enum).
|
* @param slot_state State of the slot (refer to corresponding enum).
|
||||||
* @param state Pointer to a state struct to return the current state to
|
* @param state Pointer to a state struct to return the current state to
|
||||||
@ -27,11 +29,14 @@ bool aciodrv_icca_init(uint8_t node_id);
|
|||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_icca_set_state(
|
bool aciodrv_icca_set_state(
|
||||||
uint8_t node_id, int slot_state, struct ac_io_icca_state *state);
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id, int slot_state,
|
||||||
|
struct ac_io_icca_state *state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current state of an ICCA node.
|
* Get the current state of an ICCA node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param state Pointer to a state struct to return the current state to
|
* @param state Pointer to a state struct to return the current state to
|
||||||
* (optional, NULL for none).
|
* (optional, NULL for none).
|
||||||
@ -40,7 +45,10 @@ bool aciodrv_icca_set_state(
|
|||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_icca_get_state(uint8_t node_id, struct ac_io_icca_state *state);
|
bool aciodrv_icca_get_state(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct ac_io_icca_state *state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trigger a card read action on the ICCA reader. Make sure to call this
|
* Trigger a card read action on the ICCA reader. Make sure to call this
|
||||||
@ -48,6 +56,7 @@ bool aciodrv_icca_get_state(uint8_t node_id, struct ac_io_icca_state *state);
|
|||||||
* to get the most recent card data. Make sure to re-get the state after
|
* to get the most recent card data. Make sure to re-get the state after
|
||||||
* a read call. The state returned here might not be up to date for some reason.
|
* a read call. The state returned here might not be up to date for some reason.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param state Pointer to a state struct to return the current state to
|
* @param state Pointer to a state struct to return the current state to
|
||||||
* (optional, NULL for none).
|
* (optional, NULL for none).
|
||||||
@ -56,6 +65,9 @@ bool aciodrv_icca_get_state(uint8_t node_id, struct ac_io_icca_state *state);
|
|||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_icca_read_card(uint8_t node_id, struct ac_io_icca_state *state);
|
bool aciodrv_icca_read_card(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id,
|
||||||
|
struct ac_io_icca_state *state);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -7,7 +7,9 @@
|
|||||||
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
static bool aciodrv_kfca_watchdog_start(uint8_t node_id)
|
static bool aciodrv_kfca_watchdog_start(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id)
|
||||||
{
|
{
|
||||||
// exit early and don't actually call watchdog
|
// exit early and don't actually call watchdog
|
||||||
// the watchdog call actually returns different sized packets depending on
|
// the watchdog call actually returns different sized packets depending on
|
||||||
@ -26,8 +28,9 @@ static bool aciodrv_kfca_watchdog_start(uint8_t node_id)
|
|||||||
msg.cmd.raw[0] = 23;
|
msg.cmd.raw[0] = 23;
|
||||||
msg.cmd.raw[1] = 112;
|
msg.cmd.raw[1] = 112;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(&msg, offsetof(struct ac_io_message, cmd.raw) +
|
if (!aciodrv_send_and_recv(
|
||||||
2)) { log_warning("Starting watchdog failed"); return false;
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 2)) {
|
||||||
|
log_warning("Starting watchdog failed"); return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_warning("Started watchdog of node %d, status: %d",
|
log_warning("Started watchdog of node %d, status: %d",
|
||||||
@ -38,6 +41,7 @@ static bool aciodrv_kfca_watchdog_start(uint8_t node_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_kfca_amp(
|
bool aciodrv_kfca_amp(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
uint8_t primary,
|
uint8_t primary,
|
||||||
uint8_t headphone,
|
uint8_t headphone,
|
||||||
@ -56,7 +60,9 @@ bool aciodrv_kfca_amp(
|
|||||||
msg.cmd.raw[3] = subwoofer;
|
msg.cmd.raw[3] = subwoofer;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Setting AMP failed");
|
log_warning("Setting AMP failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -66,13 +72,15 @@ bool aciodrv_kfca_amp(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_kfca_init(uint8_t node_id)
|
bool aciodrv_kfca_init(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id)
|
||||||
{
|
{
|
||||||
if (!aciodrv_kfca_watchdog_start(node_id)) {
|
if (!aciodrv_kfca_watchdog_start(device, node_id)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_kfca_amp(node_id, 0, 0, 0, 0)) {
|
if (!aciodrv_kfca_amp(device, node_id, 0, 0, 0, 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +88,7 @@ bool aciodrv_kfca_init(uint8_t node_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool aciodrv_kfca_poll(
|
bool aciodrv_kfca_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
const struct ac_io_kfca_poll_out *pout,
|
const struct ac_io_kfca_poll_out *pout,
|
||||||
struct ac_io_kfca_poll_in *pin)
|
struct ac_io_kfca_poll_in *pin)
|
||||||
@ -93,7 +102,9 @@ bool aciodrv_kfca_poll(
|
|||||||
msg.cmd.kfca_poll_out = *pout;
|
msg.cmd.kfca_poll_out = *pout;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
||||||
log_warning("Polling of node %d failed", node_id + 1);
|
log_warning("Polling of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -6,17 +6,19 @@
|
|||||||
/**
|
/**
|
||||||
* Initialize an KFCA node.
|
* Initialize an KFCA node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to initialize (0 based).
|
* @param node_id Id of the node to initialize (0 based).
|
||||||
* @return True if successful, false on error.
|
* @return True if successful, false on error.
|
||||||
* @note This module is supposed to be used in combination with the common
|
* @note This module is supposed to be used in combination with the common
|
||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_kfca_init(uint8_t node_id);
|
bool aciodrv_kfca_init(struct aciodrv_device_ctx *device, uint8_t node_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll the KFCA io board
|
* Poll the KFCA io board
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param state Pointer to a state struct to return the current state to
|
* @param state Pointer to a state struct to return the current state to
|
||||||
* (optional, NULL for none).
|
* (optional, NULL for none).
|
||||||
@ -26,6 +28,7 @@ bool aciodrv_kfca_init(uint8_t node_id);
|
|||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool aciodrv_kfca_poll(
|
bool aciodrv_kfca_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
const struct ac_io_kfca_poll_out *pout,
|
const struct ac_io_kfca_poll_out *pout,
|
||||||
struct ac_io_kfca_poll_in *pin);
|
struct ac_io_kfca_poll_in *pin);
|
||||||
@ -33,6 +36,7 @@ bool aciodrv_kfca_poll(
|
|||||||
/**
|
/**
|
||||||
* Set the KFCA digital amp level
|
* Set the KFCA digital amp level
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param primary primary volume (96-0)
|
* @param primary primary volume (96-0)
|
||||||
* @param headphone headphone volume (96-0)
|
* @param headphone headphone volume (96-0)
|
||||||
@ -42,6 +46,7 @@ bool aciodrv_kfca_poll(
|
|||||||
* @note Note 96 (or 100?) is lowest volume level, 0 is highest
|
* @note Note 96 (or 100?) is lowest volume level, 0 is highest
|
||||||
*/
|
*/
|
||||||
bool aciodrv_kfca_amp(
|
bool aciodrv_kfca_amp(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
uint8_t primary,
|
uint8_t primary,
|
||||||
uint8_t headphone,
|
uint8_t headphone,
|
||||||
|
@ -7,17 +7,15 @@
|
|||||||
|
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
static HANDLE aciodrv_port_fd;
|
HANDLE aciodrv_port_open(const char *port_path, int baud)
|
||||||
|
|
||||||
bool aciodrv_port_open(const char *port, int baud)
|
|
||||||
{
|
{
|
||||||
COMMTIMEOUTS ct;
|
COMMTIMEOUTS ct;
|
||||||
DCB dcb;
|
DCB dcb;
|
||||||
|
|
||||||
log_info("Opening ACIO on %s at %d baud", port, baud);
|
log_info("Opening ACIO on %s at %d baud", port_path, baud);
|
||||||
|
|
||||||
aciodrv_port_fd = CreateFile(
|
HANDLE port_fd = CreateFile(
|
||||||
port,
|
port_path,
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
@ -25,26 +23,26 @@ bool aciodrv_port_open(const char *port, int baud)
|
|||||||
FILE_FLAG_WRITE_THROUGH | FILE_ATTRIBUTE_NORMAL,
|
FILE_FLAG_WRITE_THROUGH | FILE_ATTRIBUTE_NORMAL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (aciodrv_port_fd == INVALID_HANDLE_VALUE) {
|
if (port_fd == INVALID_HANDLE_VALUE) {
|
||||||
log_warning("Failed to open %s", port);
|
log_warning("Failed to open %s", port_path);
|
||||||
|
|
||||||
goto early_fail;
|
goto early_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SetCommMask(aciodrv_port_fd, EV_RXCHAR)) {
|
if (!SetCommMask(port_fd, EV_RXCHAR)) {
|
||||||
log_warning("SetCommMask failed");
|
log_warning("SetCommMask failed");
|
||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SetupComm(aciodrv_port_fd, 0x1000, 0x1000)) {
|
if (!SetupComm(port_fd, 0x1000, 0x1000)) {
|
||||||
log_warning("SetupComm failed");
|
log_warning("SetupComm failed");
|
||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PurgeComm(
|
if (!PurgeComm(
|
||||||
aciodrv_port_fd,
|
port_fd,
|
||||||
PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)) {
|
PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)) {
|
||||||
log_warning("PurgeComm failed");
|
log_warning("PurgeComm failed");
|
||||||
|
|
||||||
@ -57,7 +55,7 @@ bool aciodrv_port_open(const char *port, int baud)
|
|||||||
ct.ReadTotalTimeoutMultiplier = 0;
|
ct.ReadTotalTimeoutMultiplier = 0;
|
||||||
ct.WriteTotalTimeoutMultiplier = 0;
|
ct.WriteTotalTimeoutMultiplier = 0;
|
||||||
|
|
||||||
if (!SetCommTimeouts(aciodrv_port_fd, &ct)) {
|
if (!SetCommTimeouts(port_fd, &ct)) {
|
||||||
log_warning("SetCommTimeouts failed");
|
log_warning("SetCommTimeouts failed");
|
||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -65,7 +63,7 @@ bool aciodrv_port_open(const char *port, int baud)
|
|||||||
|
|
||||||
dcb.DCBlength = sizeof(dcb);
|
dcb.DCBlength = sizeof(dcb);
|
||||||
|
|
||||||
if (!GetCommState(aciodrv_port_fd, &dcb)) {
|
if (!GetCommState(port_fd, &dcb)) {
|
||||||
log_warning("GetCommState failed");
|
log_warning("GetCommState failed");
|
||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -90,45 +88,44 @@ bool aciodrv_port_open(const char *port, int baud)
|
|||||||
dcb.XonLim = 100;
|
dcb.XonLim = 100;
|
||||||
dcb.XoffLim = 100;
|
dcb.XoffLim = 100;
|
||||||
|
|
||||||
if (!SetCommState(aciodrv_port_fd, &dcb)) {
|
if (!SetCommState(port_fd, &dcb)) {
|
||||||
log_warning("SetCommState failed");
|
log_warning("SetCommState failed");
|
||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EscapeCommFunction(aciodrv_port_fd, SETDTR)) {
|
if (!EscapeCommFunction(port_fd, SETDTR)) {
|
||||||
log_warning("SETDTR failed: err = %lu", GetLastError());
|
log_warning("SETDTR failed: err = %lu", GetLastError());
|
||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("Opened ACIO device on %s", port);
|
log_info("Opened ACIO device on %s", port_path);
|
||||||
|
|
||||||
return true;
|
return port_fd;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
CloseHandle(aciodrv_port_fd);
|
CloseHandle(port_fd);
|
||||||
|
|
||||||
early_fail:
|
early_fail:
|
||||||
aciodrv_port_fd = NULL;
|
return NULL;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int aciodrv_port_read(void *bytes, int nbytes)
|
int aciodrv_port_read(HANDLE port_fd, void *bytes, int nbytes)
|
||||||
{
|
{
|
||||||
DWORD nread;
|
DWORD nread;
|
||||||
|
|
||||||
if (aciodrv_port_fd == NULL) {
|
if (port_fd == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ClearCommError(aciodrv_port_fd, NULL, NULL)) {
|
if (!ClearCommError(port_fd, NULL, NULL)) {
|
||||||
log_warning("ClearCommError failed");
|
log_warning("ClearCommError failed");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ReadFile(aciodrv_port_fd, bytes, nbytes, &nread, NULL)) {
|
if (!ReadFile(port_fd, bytes, nbytes, &nread, NULL)) {
|
||||||
log_warning("ReadFile failed: err = %lu", GetLastError());
|
log_warning("ReadFile failed: err = %lu", GetLastError());
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -137,15 +134,15 @@ int aciodrv_port_read(void *bytes, int nbytes)
|
|||||||
return nread;
|
return nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
int aciodrv_port_write(const void *bytes, int nbytes)
|
int aciodrv_port_write(HANDLE port_fd, const void *bytes, int nbytes)
|
||||||
{
|
{
|
||||||
DWORD nwrit;
|
DWORD nwrit;
|
||||||
|
|
||||||
if (aciodrv_port_fd == NULL) {
|
if (port_fd == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WriteFile(aciodrv_port_fd, bytes, nbytes, &nwrit, NULL)) {
|
if (!WriteFile(port_fd, bytes, nbytes, &nwrit, NULL)) {
|
||||||
log_warning("WriteFile failed: err = %lu", GetLastError());
|
log_warning("WriteFile failed: err = %lu", GetLastError());
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -154,9 +151,9 @@ int aciodrv_port_write(const void *bytes, int nbytes)
|
|||||||
return nwrit;
|
return nwrit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void aciodrv_port_close(void)
|
void aciodrv_port_close(HANDLE port_fd)
|
||||||
{
|
{
|
||||||
if (aciodrv_port_fd != NULL) {
|
if (port_fd != NULL) {
|
||||||
CloseHandle(aciodrv_port_fd);
|
CloseHandle(port_fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,39 +4,45 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a serial port for communication with a ACIO device.
|
* Open a serial port for communication with a ACIO device.
|
||||||
*
|
*
|
||||||
* @param port Port the device is connected to (e.g. "COM1")
|
* @param port Port the device is connected to (e.g. "COM1")
|
||||||
* @param baud Baud rate for communication (e.g. 57600 for ICCA)
|
* @param baud Baud rate for communication (e.g. 57600 for ICCA)
|
||||||
* @return True if opening the com port was successful, false on error.
|
* @return HANDLE of the port, NULL on error
|
||||||
* @note This will open and setup the com port, only.
|
* @note This will open and setup the com port, only.
|
||||||
*/
|
*/
|
||||||
bool aciodrv_port_open(const char *port, int baud);
|
HANDLE aciodrv_port_open(const char *port_path, int baud);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read data from the opened com port.
|
* Read data from the opened com port.
|
||||||
*
|
*
|
||||||
|
* @param port_fd HANDLE of opened serial port
|
||||||
* @param bytes Pointer to an allocated buffer to read the data into.
|
* @param bytes Pointer to an allocated buffer to read the data into.
|
||||||
* @param nbytes Number of bytes to read. Has to be less or equal the allocated
|
* @param nbytes Number of bytes to read. Has to be less or equal the allocated
|
||||||
* buffer size.
|
* buffer size.
|
||||||
* @return Number of bytes read on success or -1 on error.
|
* @return Number of bytes read on success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int aciodrv_port_read(void *bytes, int nbytes);
|
int aciodrv_port_read(HANDLE port_fd, void *bytes, int nbytes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write data to the opened com port.
|
* Write data to the opened com port.
|
||||||
*
|
*
|
||||||
|
* @param port_fd HANDLE of opened serial port
|
||||||
* @param bytes Pointer to an allocated buffer with data to write.
|
* @param bytes Pointer to an allocated buffer with data to write.
|
||||||
* @param nbytes Number of bytes to write. Has to be equal or less the size
|
* @param nbytes Number of bytes to write. Has to be equal or less the size
|
||||||
* of the allocated buffer.
|
* of the allocated buffer.
|
||||||
* @return Number of bytes written on success or -1 on error.
|
* @return Number of bytes written on success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int aciodrv_port_write(const void *bytes, int nbytes);
|
int aciodrv_port_write(HANDLE port_fd, const void *bytes, int nbytes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the previously opened com port.
|
* Close the previously opened com port.
|
||||||
|
*
|
||||||
|
* @param port_fd HANDLE of opened serial port
|
||||||
*/
|
*/
|
||||||
void aciodrv_port_close(void);
|
void aciodrv_port_close(HANDLE port_fd);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -134,6 +134,7 @@ static HRESULT ac_io_emu_write(struct ac_io_emu *emu, struct irp *irp)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this supplies a single SOF byte per byte read
|
||||||
ac_io_in_supply(&emu->in, NULL, 0);
|
ac_io_in_supply(&emu->in, NULL, 0);
|
||||||
ac_io_out_consume_message(&emu->out);
|
ac_io_out_consume_message(&emu->out);
|
||||||
}
|
}
|
||||||
|
@ -8,22 +8,24 @@
|
|||||||
|
|
||||||
#include "bio2drv/bi2a-sdvx.h"
|
#include "bio2drv/bi2a-sdvx.h"
|
||||||
|
|
||||||
bool aciotest_bi2a_sdvx_handler_init(uint8_t node_id, void **ctx)
|
bool aciotest_bi2a_sdvx_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx)
|
||||||
{
|
{
|
||||||
*ctx = malloc(sizeof(uint32_t));
|
*ctx = malloc(sizeof(uint32_t));
|
||||||
*((uint32_t *) *ctx) = 0;
|
*((uint32_t *) *ctx) = 0;
|
||||||
|
|
||||||
return bio2drv_bi2a_sdvx_init(node_id);
|
return bio2drv_bi2a_sdvx_init(device, node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciotest_bi2a_sdvx_handler_update(uint8_t node_id, void *ctx)
|
bool aciotest_bi2a_sdvx_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
||||||
{
|
{
|
||||||
struct bi2a_sdvx_state_in pin;
|
struct bi2a_sdvx_state_in pin;
|
||||||
struct bi2a_sdvx_state_out pout;
|
struct bi2a_sdvx_state_out pout;
|
||||||
|
|
||||||
memset(&pout, 0, sizeof(pout));
|
memset(&pout, 0, sizeof(pout));
|
||||||
|
|
||||||
if (!bio2drv_bi2a_sdvx_poll(node_id, &pout, &pin)) {
|
if (!bio2drv_bi2a_sdvx_poll(device, node_id, &pout, &pin)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,11 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
bool aciotest_bi2a_sdvx_handler_init(uint8_t node_id, void **ctx);
|
#include "aciodrv/device.h"
|
||||||
bool aciotest_bi2a_sdvx_handler_update(uint8_t node_id, void *ctx);
|
|
||||||
|
bool aciotest_bi2a_sdvx_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
||||||
|
bool aciotest_bi2a_sdvx_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef ACIOTEST_HANDLER_H
|
#ifndef ACIOTEST_HANDLER_H
|
||||||
#define ACIOTEST_HANDLER_H
|
#define ACIOTEST_HANDLER_H
|
||||||
|
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
static const uint8_t aciotest_handler_max = 16;
|
static const uint8_t aciotest_handler_max = 16;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -8,8 +10,10 @@ static const uint8_t aciotest_handler_max = 16;
|
|||||||
*/
|
*/
|
||||||
struct aciotest_handler_node_handler {
|
struct aciotest_handler_node_handler {
|
||||||
void *ctx;
|
void *ctx;
|
||||||
bool (*init)(uint8_t node_id, void **ctx);
|
bool (*init)(
|
||||||
bool (*update)(uint8_t node_id, void *ctx);
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
||||||
|
bool (*update)(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -5,29 +5,31 @@
|
|||||||
|
|
||||||
#include "aciodrv/icca.h"
|
#include "aciodrv/icca.h"
|
||||||
|
|
||||||
bool aciotest_icca_handler_init(uint8_t node_id, void **ctx)
|
bool aciotest_icca_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx)
|
||||||
{
|
{
|
||||||
*ctx = malloc(sizeof(uint32_t));
|
*ctx = malloc(sizeof(uint32_t));
|
||||||
*((uint32_t *) *ctx) = 0;
|
*((uint32_t *) *ctx) = 0;
|
||||||
|
|
||||||
return aciodrv_icca_init(node_id);
|
return aciodrv_icca_init(device, node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciotest_icca_handler_update(uint8_t node_id, void *ctx)
|
bool aciotest_icca_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
||||||
{
|
{
|
||||||
if (*((uint32_t *) ctx) == 0) {
|
if (*((uint32_t *) ctx) == 0) {
|
||||||
*((uint32_t *) ctx) = 1;
|
*((uint32_t *) ctx) = 1;
|
||||||
|
|
||||||
/* eject cards that were left in the reader */
|
/* eject cards that were left in the reader */
|
||||||
if (!aciodrv_icca_set_state(
|
if (!aciodrv_icca_set_state(
|
||||||
node_id, AC_IO_ICCA_SLOT_STATE_EJECT, NULL)) {
|
device, node_id, AC_IO_ICCA_SLOT_STATE_EJECT, NULL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ac_io_icca_state state;
|
struct ac_io_icca_state state;
|
||||||
|
|
||||||
if (!aciodrv_icca_get_state(node_id, &state)) {
|
if (!aciodrv_icca_get_state(device, node_id, &state)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,7 +63,7 @@ bool aciotest_icca_handler_update(uint8_t node_id, void *ctx)
|
|||||||
/* eject card with "empty" key */
|
/* eject card with "empty" key */
|
||||||
if (state.key_state & AC_IO_ICCA_KEYPAD_MASK_EMPTY) {
|
if (state.key_state & AC_IO_ICCA_KEYPAD_MASK_EMPTY) {
|
||||||
if (!aciodrv_icca_set_state(
|
if (!aciodrv_icca_set_state(
|
||||||
node_id, AC_IO_ICCA_SLOT_STATE_EJECT, NULL)) {
|
device, node_id, AC_IO_ICCA_SLOT_STATE_EJECT, NULL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,7 +72,7 @@ bool aciotest_icca_handler_update(uint8_t node_id, void *ctx)
|
|||||||
if (!(state.sensor_state & AC_IO_ICCA_SENSOR_MASK_BACK_ON) &&
|
if (!(state.sensor_state & AC_IO_ICCA_SENSOR_MASK_BACK_ON) &&
|
||||||
!(state.sensor_state & AC_IO_ICCA_SENSOR_MASK_FRONT_ON)) {
|
!(state.sensor_state & AC_IO_ICCA_SENSOR_MASK_FRONT_ON)) {
|
||||||
if (!aciodrv_icca_set_state(
|
if (!aciodrv_icca_set_state(
|
||||||
node_id, AC_IO_ICCA_SLOT_STATE_OPEN, NULL)) {
|
device, node_id, AC_IO_ICCA_SLOT_STATE_OPEN, NULL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,11 +81,11 @@ bool aciotest_icca_handler_update(uint8_t node_id, void *ctx)
|
|||||||
if ((state.sensor_state & AC_IO_ICCA_SENSOR_MASK_BACK_ON) &&
|
if ((state.sensor_state & AC_IO_ICCA_SENSOR_MASK_BACK_ON) &&
|
||||||
(state.sensor_state & AC_IO_ICCA_SENSOR_MASK_FRONT_ON)) {
|
(state.sensor_state & AC_IO_ICCA_SENSOR_MASK_FRONT_ON)) {
|
||||||
if (!aciodrv_icca_set_state(
|
if (!aciodrv_icca_set_state(
|
||||||
node_id, AC_IO_ICCA_SLOT_STATE_CLOSE, NULL)) {
|
device, node_id, AC_IO_ICCA_SLOT_STATE_CLOSE, NULL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_icca_read_card(node_id, NULL)) {
|
if (!aciodrv_icca_read_card(device, node_id, NULL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,11 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
bool aciotest_icca_handler_init(uint8_t node_id, void **ctx);
|
#include "aciodrv/device.h"
|
||||||
bool aciotest_icca_handler_update(uint8_t node_id, void *ctx);
|
|
||||||
|
bool aciotest_icca_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
||||||
|
bool aciotest_icca_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -8,15 +8,17 @@
|
|||||||
|
|
||||||
#include "aciodrv/kfca.h"
|
#include "aciodrv/kfca.h"
|
||||||
|
|
||||||
bool aciotest_kfca_handler_init(uint8_t node_id, void **ctx)
|
bool aciotest_kfca_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx)
|
||||||
{
|
{
|
||||||
*ctx = malloc(sizeof(uint32_t));
|
*ctx = malloc(sizeof(uint32_t));
|
||||||
*((uint32_t *) *ctx) = 0;
|
*((uint32_t *) *ctx) = 0;
|
||||||
|
|
||||||
return aciodrv_kfca_init(node_id);
|
return aciodrv_kfca_init(device, node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool aciotest_kfca_handler_update(uint8_t node_id, void *ctx)
|
bool aciotest_kfca_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx)
|
||||||
{
|
{
|
||||||
struct ac_io_kfca_poll_in pin;
|
struct ac_io_kfca_poll_in pin;
|
||||||
struct ac_io_kfca_poll_out pout;
|
struct ac_io_kfca_poll_out pout;
|
||||||
@ -28,7 +30,7 @@ bool aciotest_kfca_handler_update(uint8_t node_id, void *ctx)
|
|||||||
pout.gpio |= 1 << gpio_test_pin;
|
pout.gpio |= 1 << gpio_test_pin;
|
||||||
pout.gpio = ac_io_u32(pout.gpio);
|
pout.gpio = ac_io_u32(pout.gpio);
|
||||||
|
|
||||||
if (!aciodrv_kfca_poll(node_id, &pout, &pin)) {
|
if (!aciodrv_kfca_poll(device, node_id, &pout, &pin)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,11 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
bool aciotest_kfca_handler_init(uint8_t node_id, void **ctx);
|
#include "aciodrv/device.h"
|
||||||
bool aciotest_kfca_handler_update(uint8_t node_id, void *ctx);
|
|
||||||
|
bool aciotest_kfca_handler_init(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void **ctx);
|
||||||
|
bool aciotest_kfca_handler_update(
|
||||||
|
struct aciodrv_device_ctx *device, uint8_t node_id, void *ctx);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -70,14 +70,16 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
log_to_writer(log_writer_stdout, NULL);
|
log_to_writer(log_writer_stdout, NULL);
|
||||||
|
|
||||||
if (!aciodrv_device_open(argv[1], atoi(argv[2]))) {
|
|
||||||
|
struct aciodrv_device_ctx *device = aciodrv_device_open(argv[1], atoi(argv[2]));
|
||||||
|
if (!device) {
|
||||||
printf("Opening acio device failed\n");
|
printf("Opening acio device failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Opening acio device successful\n");
|
printf("Opening acio device successful\n");
|
||||||
|
|
||||||
uint8_t node_count = aciodrv_device_get_node_count();
|
uint8_t node_count = aciodrv_device_get_node_count(device);
|
||||||
printf("Enumerated %d nodes\n", node_count);
|
printf("Enumerated %d nodes\n", node_count);
|
||||||
|
|
||||||
struct aciotest_handler_node_handler handler[aciotest_handler_max];
|
struct aciotest_handler_node_handler handler[aciotest_handler_max];
|
||||||
@ -88,7 +90,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (uint8_t i = 0; i < node_count; i++) {
|
for (uint8_t i = 0; i < node_count; i++) {
|
||||||
char product[4];
|
char product[4];
|
||||||
aciodrv_device_get_node_product_ident(i, product);
|
aciodrv_device_get_node_product_ident(device, i, product);
|
||||||
printf(
|
printf(
|
||||||
"> %d: %c%c%c%c\n",
|
"> %d: %c%c%c%c\n",
|
||||||
i + 1,
|
i + 1,
|
||||||
@ -110,7 +112,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (uint8_t i = 0; i < aciotest_handler_max; i++) {
|
for (uint8_t i = 0; i < aciotest_handler_max; i++) {
|
||||||
if (handler[i].init != NULL) {
|
if (handler[i].init != NULL) {
|
||||||
if (!handler[i].init(i, &handler[i].ctx)) {
|
if (!handler[i].init(device, i, &handler[i].ctx)) {
|
||||||
printf("ERROR: Initializing node %d failed\n", i);
|
printf("ERROR: Initializing node %d failed\n", i);
|
||||||
handler[i].update = NULL;
|
handler[i].update = NULL;
|
||||||
}
|
}
|
||||||
@ -129,7 +131,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (uint8_t i = 0; i < aciotest_handler_max; i++) {
|
for (uint8_t i = 0; i < aciotest_handler_max; i++) {
|
||||||
if (handler[i].update != NULL) {
|
if (handler[i].update != NULL) {
|
||||||
if (!handler[i].update(i, handler[i].ctx)) {
|
if (!handler[i].update(device, i, handler[i].ctx)) {
|
||||||
printf("ERROR: Updating node %d, removed from loop\n", i);
|
printf("ERROR: Updating node %d, removed from loop\n", i);
|
||||||
handler[i].update = NULL;
|
handler[i].update = NULL;
|
||||||
Sleep(5000);
|
Sleep(5000);
|
||||||
|
@ -14,7 +14,9 @@
|
|||||||
// in all inputs and outputs (over sub IO) other than 14 keys to not work.
|
// in all inputs and outputs (over sub IO) other than 14 keys to not work.
|
||||||
static const uint8_t _BIO2DR_BI2A_IIDX_INIT_DATA = 0x2D;
|
static const uint8_t _BIO2DR_BI2A_IIDX_INIT_DATA = 0x2D;
|
||||||
|
|
||||||
static bool bio2drv_bi2a_iidx_init_io(uint8_t node_id)
|
static bool bio2drv_bi2a_iidx_init_io(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -24,7 +26,9 @@ static bool bio2drv_bi2a_iidx_init_io(uint8_t node_id)
|
|||||||
msg.cmd.param = _BIO2DR_BI2A_IIDX_INIT_DATA;
|
msg.cmd.param = _BIO2DR_BI2A_IIDX_INIT_DATA;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Init node failed");
|
log_warning("Init node failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -34,7 +38,9 @@ static bool bio2drv_bi2a_iidx_init_io(uint8_t node_id)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bio2drv_bi2a_iidx_watchdog_start(uint8_t node_id)
|
static bool bio2drv_bi2a_iidx_watchdog_start(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id)
|
||||||
{
|
{
|
||||||
// exit early and don't actually call watchdog
|
// exit early and don't actually call watchdog
|
||||||
// the watchdog call actually returns different sized packets depending on
|
// the watchdog call actually returns different sized packets depending on
|
||||||
@ -54,7 +60,7 @@ static bool bio2drv_bi2a_iidx_watchdog_start(uint8_t node_id)
|
|||||||
msg.cmd.raw[1] = 112;
|
msg.cmd.raw[1] = 112;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 2
|
device, &msg, offsetof(struct ac_io_message, cmd.raw) + 2
|
||||||
)) {
|
)) {
|
||||||
log_warning("Starting watchdog failed"); return false;
|
log_warning("Starting watchdog failed"); return false;
|
||||||
}
|
}
|
||||||
@ -66,13 +72,13 @@ static bool bio2drv_bi2a_iidx_watchdog_start(uint8_t node_id)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bio2drv_bi2a_iidx_init(uint8_t node_id)
|
bool bio2drv_bi2a_iidx_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
if (!bio2drv_bi2a_iidx_init_io(node_id)) {
|
if (!bio2drv_bi2a_iidx_init_io(device, node_id)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bio2drv_bi2a_iidx_watchdog_start(node_id)) {
|
if (!bio2drv_bi2a_iidx_watchdog_start(device, node_id)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +86,7 @@ bool bio2drv_bi2a_iidx_init(uint8_t node_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool bio2drv_bi2a_iidx_poll(
|
bool bio2drv_bi2a_iidx_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
const struct bi2a_iidx_state_out *pout,
|
const struct bi2a_iidx_state_out *pout,
|
||||||
struct bi2a_iidx_state_in *pin)
|
struct bi2a_iidx_state_in *pin)
|
||||||
@ -93,7 +100,9 @@ bool bio2drv_bi2a_iidx_poll(
|
|||||||
*(struct bi2a_iidx_state_out *) msg.cmd.raw = *pout;
|
*(struct bi2a_iidx_state_out *) msg.cmd.raw = *pout;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
||||||
log_warning("Polling of node %d failed", node_id + 1);
|
log_warning("Polling of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,28 @@
|
|||||||
#ifndef BIO2DRV_BI2A_IIDX_H
|
#ifndef BIO2DRV_BI2A_IIDX_H
|
||||||
#define BIO2DRV_BI2A_IIDX_H
|
#define BIO2DRV_BI2A_IIDX_H
|
||||||
|
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
#include "bio2/bi2a-iidx.h"
|
#include "bio2/bi2a-iidx.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a BI2A node.
|
* Initialize a BI2A node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to initialize (0 based).
|
* @param node_id Id of the node to initialize (0 based).
|
||||||
* @return True if successful, false on error.
|
* @return True if successful, false on error.
|
||||||
* @note This module is supposed to be used in combination with the common
|
* @note This module is supposed to be used in combination with the common
|
||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_iidx_init(uint8_t node_id);
|
bool bio2drv_bi2a_iidx_init(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll the BI2A board
|
* Poll the BI2A board
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param state Pointer to a state struct to return the current state to
|
* @param state Pointer to a state struct to return the current state to
|
||||||
* (optional, NULL for none).
|
* (optional, NULL for none).
|
||||||
@ -26,6 +32,7 @@ bool bio2drv_bi2a_iidx_init(uint8_t node_id);
|
|||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_iidx_poll(
|
bool bio2drv_bi2a_iidx_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
const struct bi2a_iidx_state_out *pout,
|
const struct bi2a_iidx_state_out *pout,
|
||||||
struct bi2a_iidx_state_in *pin);
|
struct bi2a_iidx_state_in *pin);
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
static const uint8_t _BIO2DR_BI2A_SDVX_INIT_DATA = 0x3B;
|
static const uint8_t _BIO2DR_BI2A_SDVX_INIT_DATA = 0x3B;
|
||||||
|
|
||||||
// this is probably InitIO
|
// this is probably InitIO
|
||||||
static bool bio2drv_bi2a_sdvx_init_io(uint8_t node_id)
|
static bool bio2drv_bi2a_sdvx_init_io(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
struct ac_io_message msg;
|
struct ac_io_message msg;
|
||||||
|
|
||||||
@ -22,7 +22,9 @@ static bool bio2drv_bi2a_sdvx_init_io(uint8_t node_id)
|
|||||||
msg.cmd.param = _BIO2DR_BI2A_SDVX_INIT_DATA;
|
msg.cmd.param = _BIO2DR_BI2A_SDVX_INIT_DATA;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Init node failed");
|
log_warning("Init node failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -32,7 +34,7 @@ static bool bio2drv_bi2a_sdvx_init_io(uint8_t node_id)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bio2drv_bi2a_sdvx_watchdog_start(uint8_t node_id)
|
static bool bio2drv_bi2a_sdvx_watchdog_start(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
// exit early and don't actually call watchdog
|
// exit early and don't actually call watchdog
|
||||||
// the watchdog call actually returns different sized packets depending on
|
// the watchdog call actually returns different sized packets depending on
|
||||||
@ -65,6 +67,7 @@ static bool bio2drv_bi2a_sdvx_watchdog_start(uint8_t node_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool bio2drv_bi2a_sdvx_amp(
|
bool bio2drv_bi2a_sdvx_amp(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
uint8_t unused_1,
|
uint8_t unused_1,
|
||||||
uint8_t unused_2,
|
uint8_t unused_2,
|
||||||
@ -86,7 +89,9 @@ bool bio2drv_bi2a_sdvx_amp(
|
|||||||
msg.cmd.raw[3] = right;
|
msg.cmd.raw[3] = right;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + 1)) {
|
||||||
log_warning("Setting AMP failed");
|
log_warning("Setting AMP failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -96,17 +101,17 @@ bool bio2drv_bi2a_sdvx_amp(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bio2drv_bi2a_sdvx_init(uint8_t node_id)
|
bool bio2drv_bi2a_sdvx_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||||
{
|
{
|
||||||
if (!bio2drv_bi2a_sdvx_init_io(node_id)) {
|
if (!bio2drv_bi2a_sdvx_init_io(device, node_id)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bio2drv_bi2a_sdvx_watchdog_start(node_id)) {
|
if (!bio2drv_bi2a_sdvx_watchdog_start(device, node_id)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bio2drv_bi2a_sdvx_amp(node_id, 0, 0, 0, 0)) {
|
if (!bio2drv_bi2a_sdvx_amp(device, node_id, 0, 0, 0, 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,6 +119,7 @@ bool bio2drv_bi2a_sdvx_init(uint8_t node_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool bio2drv_bi2a_sdvx_poll(
|
bool bio2drv_bi2a_sdvx_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
const struct bi2a_sdvx_state_out *pout,
|
const struct bi2a_sdvx_state_out *pout,
|
||||||
struct bi2a_sdvx_state_in *pin)
|
struct bi2a_sdvx_state_in *pin)
|
||||||
@ -127,7 +133,9 @@ bool bio2drv_bi2a_sdvx_poll(
|
|||||||
*(struct bi2a_sdvx_state_out *) msg.cmd.raw = *pout;
|
*(struct bi2a_sdvx_state_out *) msg.cmd.raw = *pout;
|
||||||
|
|
||||||
if (!aciodrv_send_and_recv(
|
if (!aciodrv_send_and_recv(
|
||||||
&msg, offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
device,
|
||||||
|
&msg,
|
||||||
|
offsetof(struct ac_io_message, cmd.raw) + sizeof(*pin))) {
|
||||||
log_warning("Polling of node %d failed", node_id + 1);
|
log_warning("Polling of node %d failed", node_id + 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,28 @@
|
|||||||
#ifndef BIO2DRV_BI2A_H
|
#ifndef BIO2DRV_BI2A_SDVX_H
|
||||||
#define BIO2DRV_BI2A_H
|
#define BIO2DRV_BI2A_SDVX_H
|
||||||
|
|
||||||
|
#include "aciodrv/device.h"
|
||||||
|
|
||||||
#include "bio2/bi2a-sdvx.h"
|
#include "bio2/bi2a-sdvx.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a BI2A node.
|
* Initialize a BI2A node.
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to initialize (0 based).
|
* @param node_id Id of the node to initialize (0 based).
|
||||||
* @return True if successful, false on error.
|
* @return True if successful, false on error.
|
||||||
* @note This module is supposed to be used in combination with the common
|
* @note This module is supposed to be used in combination with the common
|
||||||
* device driver foundation.
|
* device driver foundation.
|
||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_sdvx_init(uint8_t node_id);
|
bool bio2drv_bi2a_sdvx_init(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
|
uint8_t node_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll the board
|
* Poll the board
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param state Pointer to a state struct to return the current state to
|
* @param state Pointer to a state struct to return the current state to
|
||||||
* (optional, NULL for none).
|
* (optional, NULL for none).
|
||||||
@ -26,6 +32,7 @@ bool bio2drv_bi2a_sdvx_init(uint8_t node_id);
|
|||||||
* @see driver.h
|
* @see driver.h
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_sdvx_poll(
|
bool bio2drv_bi2a_sdvx_poll(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
const struct bi2a_sdvx_state_out *pout,
|
const struct bi2a_sdvx_state_out *pout,
|
||||||
struct bi2a_sdvx_state_in *pin);
|
struct bi2a_sdvx_state_in *pin);
|
||||||
@ -33,6 +40,7 @@ bool bio2drv_bi2a_sdvx_poll(
|
|||||||
/**
|
/**
|
||||||
* Set the BIO2 BI2A SDVX digital amp level
|
* Set the BIO2 BI2A SDVX digital amp level
|
||||||
*
|
*
|
||||||
|
* @param device Context of opened device
|
||||||
* @param node_id Id of the node to query (0 based).
|
* @param node_id Id of the node to query (0 based).
|
||||||
* @param primary primary volume (96-0)
|
* @param primary primary volume (96-0)
|
||||||
* @param headphone headphone volume (96-0)
|
* @param headphone headphone volume (96-0)
|
||||||
@ -42,6 +50,7 @@ bool bio2drv_bi2a_sdvx_poll(
|
|||||||
* @note Note 96 is lowest volume level, 0 is highest
|
* @note Note 96 is lowest volume level, 0 is highest
|
||||||
*/
|
*/
|
||||||
bool bio2drv_bi2a_sdvx_amp(
|
bool bio2drv_bi2a_sdvx_amp(
|
||||||
|
struct aciodrv_device_ctx *device,
|
||||||
uint8_t node_id,
|
uint8_t node_id,
|
||||||
uint8_t unused_1,
|
uint8_t unused_1,
|
||||||
uint8_t unused_2,
|
uint8_t unused_2,
|
||||||
|
@ -34,6 +34,8 @@ static const uint8_t eam_io_keypad_mappings[16] = {EAM_IO_KEYPAD_DECIMAL,
|
|||||||
|
|
||||||
static struct ac_io_icca_state eam_io_icca_state[2];
|
static struct ac_io_icca_state eam_io_icca_state[2];
|
||||||
|
|
||||||
|
static struct aciodrv_device_ctx *acio_device_ctx;
|
||||||
|
|
||||||
void eam_io_set_loggers(
|
void eam_io_set_loggers(
|
||||||
log_formatter_t misc,
|
log_formatter_t misc,
|
||||||
log_formatter_t info,
|
log_formatter_t info,
|
||||||
@ -46,13 +48,14 @@ void eam_io_set_loggers(
|
|||||||
bool eam_io_init(
|
bool eam_io_init(
|
||||||
thread_create_t create, thread_join_t join, thread_destroy_t destroy)
|
thread_create_t create, thread_join_t join, thread_destroy_t destroy)
|
||||||
{
|
{
|
||||||
if (!aciodrv_device_open("COM1", 57600)) {
|
acio_device_ctx = aciodrv_device_open("COM1", 57600);
|
||||||
|
if (acio_device_ctx == NULL) {
|
||||||
log_warning("Opening acio device on COM1 failed");
|
log_warning("Opening acio device on COM1 failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 2; i++) {
|
for (uint8_t i = 0; i < 2; i++) {
|
||||||
if (!aciodrv_icca_init(i)) {
|
if (!aciodrv_icca_init(acio_device_ctx, i)) {
|
||||||
log_warning("Initializing icca %d failed", i);
|
log_warning("Initializing icca %d failed", i);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -63,7 +66,7 @@ bool eam_io_init(
|
|||||||
|
|
||||||
void eam_io_fini(void)
|
void eam_io_fini(void)
|
||||||
{
|
{
|
||||||
aciodrv_device_close();
|
aciodrv_device_close(acio_device_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t eam_io_get_keypad_state(uint8_t unit_no)
|
uint16_t eam_io_get_keypad_state(uint8_t unit_no)
|
||||||
@ -112,19 +115,20 @@ bool eam_io_card_slot_cmd(uint8_t unit_no, uint8_t cmd)
|
|||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case EAM_IO_CARD_SLOT_CMD_CLOSE:
|
case EAM_IO_CARD_SLOT_CMD_CLOSE:
|
||||||
return aciodrv_icca_set_state(
|
return aciodrv_icca_set_state(
|
||||||
unit_no, AC_IO_ICCA_SLOT_STATE_CLOSE, NULL);
|
acio_device_ctx, unit_no, AC_IO_ICCA_SLOT_STATE_CLOSE, NULL);
|
||||||
|
|
||||||
case EAM_IO_CARD_SLOT_CMD_OPEN:
|
case EAM_IO_CARD_SLOT_CMD_OPEN:
|
||||||
return aciodrv_icca_set_state(
|
return aciodrv_icca_set_state(
|
||||||
unit_no, AC_IO_ICCA_SLOT_STATE_OPEN, NULL);
|
acio_device_ctx, unit_no, AC_IO_ICCA_SLOT_STATE_OPEN, NULL);
|
||||||
|
|
||||||
case EAM_IO_CARD_SLOT_CMD_EJECT:
|
case EAM_IO_CARD_SLOT_CMD_EJECT:
|
||||||
return aciodrv_icca_set_state(
|
return aciodrv_icca_set_state(
|
||||||
unit_no, AC_IO_ICCA_SLOT_STATE_EJECT, NULL);
|
acio_device_ctx, unit_no, AC_IO_ICCA_SLOT_STATE_EJECT, NULL);
|
||||||
|
|
||||||
case EAM_IO_CARD_SLOT_CMD_READ:
|
case EAM_IO_CARD_SLOT_CMD_READ:
|
||||||
return aciodrv_icca_read_card(unit_no, NULL) &&
|
return aciodrv_icca_read_card(acio_device_ctx, unit_no, NULL) &&
|
||||||
aciodrv_icca_get_state(unit_no, &eam_io_icca_state[unit_no]);
|
aciodrv_icca_get_state(
|
||||||
|
acio_device_ctx, unit_no, &eam_io_icca_state[unit_no]);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -135,7 +139,8 @@ bool eam_io_card_slot_cmd(uint8_t unit_no, uint8_t cmd)
|
|||||||
|
|
||||||
bool eam_io_poll(uint8_t unit_no)
|
bool eam_io_poll(uint8_t unit_no)
|
||||||
{
|
{
|
||||||
return aciodrv_icca_get_state(unit_no, &eam_io_icca_state[unit_no]);
|
return aciodrv_icca_get_state(
|
||||||
|
acio_device_ctx, unit_no, &eam_io_icca_state[unit_no]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct eam_io_config_api *eam_io_get_config_api(void)
|
const struct eam_io_config_api *eam_io_get_config_api(void)
|
||||||
|
@ -38,6 +38,8 @@ static struct bi2a_iidx_state_in pin_cur;
|
|||||||
static struct bi2a_iidx_state_out pout_staging;
|
static struct bi2a_iidx_state_out pout_staging;
|
||||||
static struct bi2a_iidx_state_out pout_ready;
|
static struct bi2a_iidx_state_out pout_ready;
|
||||||
|
|
||||||
|
static struct aciodrv_device_ctx *bio2_device_ctx;
|
||||||
|
|
||||||
static bool _bio2_iidx_io_poll(
|
static bool _bio2_iidx_io_poll(
|
||||||
const struct bi2a_iidx_state_out *pout, struct bi2a_iidx_state_in *pin)
|
const struct bi2a_iidx_state_out *pout, struct bi2a_iidx_state_in *pin)
|
||||||
{
|
{
|
||||||
@ -47,7 +49,7 @@ static bool _bio2_iidx_io_poll(
|
|||||||
|
|
||||||
processing_io = true;
|
processing_io = true;
|
||||||
|
|
||||||
if (!bio2drv_bi2a_iidx_poll(bio2_node_id, pout, pin)) {
|
if (!bio2drv_bi2a_iidx_poll(bio2_device_ctx, bio2_node_id, pout, pin)) {
|
||||||
processing_io = false;
|
processing_io = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -114,14 +116,15 @@ bool iidx_io_init(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_device_open(selected_port, config_bio2.baud)) {
|
bio2_device_ctx = aciodrv_device_open(selected_port, config_bio2.baud);
|
||||||
|
if (bio2_device_ctx == NULL) {
|
||||||
log_info("Opening BIO2 device on [%s] failed", selected_port);
|
log_info("Opening BIO2 device on [%s] failed", selected_port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("Opening BIO2 device on [%s] successful", selected_port);
|
log_info("Opening BIO2 device on [%s] successful", selected_port);
|
||||||
|
|
||||||
uint8_t node_count = aciodrv_device_get_node_count();
|
uint8_t node_count = aciodrv_device_get_node_count(bio2_device_ctx);
|
||||||
log_info("Enumerated %d nodes", node_count);
|
log_info("Enumerated %d nodes", node_count);
|
||||||
|
|
||||||
bio2_node_id = -1;
|
bio2_node_id = -1;
|
||||||
@ -129,7 +132,7 @@ bool iidx_io_init(
|
|||||||
for (uint8_t i = 0; i < node_count; i++) {
|
for (uint8_t i = 0; i < node_count; i++) {
|
||||||
char product[4];
|
char product[4];
|
||||||
|
|
||||||
aciodrv_device_get_node_product_ident(i, product);
|
aciodrv_device_get_node_product_ident(bio2_device_ctx, i, product);
|
||||||
|
|
||||||
log_info(
|
log_info(
|
||||||
"> %d: %c%c%c%c\n",
|
"> %d: %c%c%c%c\n",
|
||||||
@ -150,7 +153,7 @@ bool iidx_io_init(
|
|||||||
if (bio2_node_id != -1) {
|
if (bio2_node_id != -1) {
|
||||||
log_warning("Using BI2A on node: %d", bio2_node_id);
|
log_warning("Using BI2A on node: %d", bio2_node_id);
|
||||||
|
|
||||||
if (!bio2drv_bi2a_iidx_init(bio2_node_id)) {
|
if (!bio2drv_bi2a_iidx_init(bio2_device_ctx, bio2_node_id)) {
|
||||||
log_warning("Unable to start BI2A on node: %d", bio2_node_id);
|
log_warning("Unable to start BI2A on node: %d", bio2_node_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,8 @@ uint8_t wing_staging[12];
|
|||||||
struct bi2a_sdvx_state_out pout_staging;
|
struct bi2a_sdvx_state_out pout_staging;
|
||||||
struct bi2a_sdvx_state_out pout_ready;
|
struct bi2a_sdvx_state_out pout_ready;
|
||||||
|
|
||||||
|
static struct aciodrv_device_ctx *bio2_device_ctx;
|
||||||
|
|
||||||
void sdvx_io_set_loggers(
|
void sdvx_io_set_loggers(
|
||||||
log_formatter_t misc,
|
log_formatter_t misc,
|
||||||
log_formatter_t info,
|
log_formatter_t info,
|
||||||
@ -99,21 +101,22 @@ bool sdvx_io_init(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_device_open(selected_port, config_bio2.baud)) {
|
bio2_device_ctx = aciodrv_device_open(selected_port, config_bio2.baud);
|
||||||
|
if (bio2_device_ctx == NULL) {
|
||||||
log_info("Opening BIO2 device on [%s] failed", selected_port);
|
log_info("Opening BIO2 device on [%s] failed", selected_port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("Opening BIO2 device on [%s] successful", selected_port);
|
log_info("Opening BIO2 device on [%s] successful", selected_port);
|
||||||
|
|
||||||
uint8_t node_count = aciodrv_device_get_node_count();
|
uint8_t node_count = aciodrv_device_get_node_count(bio2_device_ctx);
|
||||||
log_info("Enumerated %d nodes", node_count);
|
log_info("Enumerated %d nodes", node_count);
|
||||||
|
|
||||||
bio2_node_id = -1;
|
bio2_node_id = -1;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < node_count; i++) {
|
for (uint8_t i = 0; i < node_count; i++) {
|
||||||
char product[4];
|
char product[4];
|
||||||
aciodrv_device_get_node_product_ident(i, product);
|
aciodrv_device_get_node_product_ident(bio2_device_ctx, i, product);
|
||||||
log_info(
|
log_info(
|
||||||
"> %d: %c%c%c%c\n",
|
"> %d: %c%c%c%c\n",
|
||||||
i,
|
i,
|
||||||
@ -133,7 +136,7 @@ bool sdvx_io_init(
|
|||||||
if (bio2_node_id != -1) {
|
if (bio2_node_id != -1) {
|
||||||
log_warning("Using BI2A on node: %d", bio2_node_id);
|
log_warning("Using BI2A on node: %d", bio2_node_id);
|
||||||
|
|
||||||
if (!bio2drv_bi2a_sdvx_init(bio2_node_id)) {
|
if (!bio2drv_bi2a_sdvx_init(bio2_device_ctx, bio2_node_id)) {
|
||||||
log_warning("Unable to start BI2A on node: %d", bio2_node_id);
|
log_warning("Unable to start BI2A on node: %d", bio2_node_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -240,7 +243,7 @@ bool _bio2_sdvx_io_poll(
|
|||||||
|
|
||||||
processing_io = true;
|
processing_io = true;
|
||||||
|
|
||||||
if (!bio2drv_bi2a_sdvx_poll(bio2_node_id, pout, pin)) {
|
if (!bio2drv_bi2a_sdvx_poll(bio2_device_ctx, bio2_node_id, pout, pin)) {
|
||||||
processing_io = false;
|
processing_io = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -319,7 +322,7 @@ bool sdvx_io_set_amp_volume(
|
|||||||
|
|
||||||
// yes, the BIO2 doesn't allow control of the amps individually
|
// yes, the BIO2 doesn't allow control of the amps individually
|
||||||
// so let's just set it so that people's ear's don't blow out
|
// so let's just set it so that people's ear's don't blow out
|
||||||
if (!bio2drv_bi2a_sdvx_amp(bio2_node_id, 0, 0, primary, primary)) {
|
if (!bio2drv_bi2a_sdvx_amp(bio2_device_ctx, bio2_node_id, 0, 0, primary, primary)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,8 @@ static int16_t kfca_node_id;
|
|||||||
struct ac_io_kfca_poll_out pout_staging;
|
struct ac_io_kfca_poll_out pout_staging;
|
||||||
struct ac_io_kfca_poll_out pout_ready;
|
struct ac_io_kfca_poll_out pout_ready;
|
||||||
|
|
||||||
|
static struct aciodrv_device_ctx *acio_device_ctx;
|
||||||
|
|
||||||
void sdvx_io_set_loggers(
|
void sdvx_io_set_loggers(
|
||||||
log_formatter_t misc,
|
log_formatter_t misc,
|
||||||
log_formatter_t info,
|
log_formatter_t info,
|
||||||
@ -78,21 +80,22 @@ bool sdvx_io_init(
|
|||||||
|
|
||||||
cconfig_finit(config);
|
cconfig_finit(config);
|
||||||
|
|
||||||
if (!aciodrv_device_open(config_kfca.port, config_kfca.baud)) {
|
acio_device_ctx = aciodrv_device_open(config_kfca.port, config_kfca.baud);
|
||||||
|
if (acio_device_ctx == NULL) {
|
||||||
log_info("Opening acio device on [%s] failed", config_kfca.port);
|
log_info("Opening acio device on [%s] failed", config_kfca.port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("Opening acio device successful");
|
log_info("Opening acio device successful");
|
||||||
|
|
||||||
uint8_t node_count = aciodrv_device_get_node_count();
|
uint8_t node_count = aciodrv_device_get_node_count(acio_device_ctx);
|
||||||
log_info("Enumerated %d nodes", node_count);
|
log_info("Enumerated %d nodes", node_count);
|
||||||
|
|
||||||
kfca_node_id = -1;
|
kfca_node_id = -1;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < node_count; i++) {
|
for (uint8_t i = 0; i < node_count; i++) {
|
||||||
char product[4];
|
char product[4];
|
||||||
aciodrv_device_get_node_product_ident(i, product);
|
aciodrv_device_get_node_product_ident(acio_device_ctx, i, product);
|
||||||
log_info(
|
log_info(
|
||||||
"> %d: %c%c%c%c\n",
|
"> %d: %c%c%c%c\n",
|
||||||
i,
|
i,
|
||||||
@ -112,7 +115,7 @@ bool sdvx_io_init(
|
|||||||
if (kfca_node_id != -1) {
|
if (kfca_node_id != -1) {
|
||||||
log_warning("Using KFCA on node: %d", kfca_node_id);
|
log_warning("Using KFCA on node: %d", kfca_node_id);
|
||||||
|
|
||||||
if (!aciodrv_kfca_init(kfca_node_id)) {
|
if (!aciodrv_kfca_init(acio_device_ctx, kfca_node_id)) {
|
||||||
log_warning("Unable to start KFCA on node: %d", kfca_node_id);
|
log_warning("Unable to start KFCA on node: %d", kfca_node_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -163,7 +166,7 @@ bool sdvx_io_read_input(void)
|
|||||||
}
|
}
|
||||||
processing_io = true;
|
processing_io = true;
|
||||||
|
|
||||||
if (!aciodrv_kfca_poll(kfca_node_id, &pout_ready, &pin)) {
|
if (!aciodrv_kfca_poll(acio_device_ctx, kfca_node_id, &pout_ready, &pin)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +220,10 @@ bool sdvx_io_set_amp_volume(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aciodrv_kfca_amp(kfca_node_id, primary, 96, headphone, subwoofer)) {
|
if (!aciodrv_kfca_amp(
|
||||||
|
acio_device_ctx,
|
||||||
|
kfca_node_id,
|
||||||
|
primary, 96, headphone, subwoofer)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user