operacake: create struct for operacake state

This commit is contained in:
Mike Walters
2021-07-30 01:28:08 +01:00
parent d84ff8262f
commit 7fd3db9b2b
3 changed files with 42 additions and 20 deletions

View File

@ -71,17 +71,15 @@
#define OPERACAKE_ADDRESS_DEFAULT 0x18
#define OPERACAKE_ADDRESS_INVALID 0xFF
#define OPERACAKE_MAX_BOARDS 8
i2c_bus_t* const oc_bus = &i2c0;
uint8_t operacake_boards[8] = {
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
OPERACAKE_ADDRESS_INVALID,
struct operacake_state {
bool present;
};
struct operacake_state operacake_boards[OPERACAKE_MAX_BOARDS];
bool allow_gpio_mode = true;
/* read single register */
@ -105,21 +103,38 @@ void operacake_write_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg, uin
}
uint8_t operacake_init(bool allow_gpio) {
uint8_t reg, addr, j = 0;
/* Find connected operacakes */
for(addr=0; addr<8; addr++) {
for (int addr = 0; addr < 8; addr++) {
operacake_write_reg(oc_bus, addr, OPERACAKE_REG_OUTPUT,
OPERACAKE_DEFAULT_OUTPUT);
operacake_write_reg(oc_bus, addr, OPERACAKE_REG_CONFIG,
OPERACAKE_CONFIG_ALL_OUTPUT);
reg = operacake_read_reg(oc_bus, addr, OPERACAKE_REG_CONFIG);
if(reg==OPERACAKE_CONFIG_ALL_OUTPUT)
operacake_boards[j++] = addr;
uint8_t reg = operacake_read_reg(oc_bus, addr, OPERACAKE_REG_CONFIG);
operacake_boards[addr].present = (reg == OPERACAKE_CONFIG_ALL_OUTPUT);
}
allow_gpio_mode = allow_gpio;
return 0;
}
bool operacake_is_board_present(uint8_t address) {
if (address >= OPERACAKE_MAX_BOARDS)
return false;
return operacake_boards[address].present;
}
void operacake_get_boards(uint8_t *addresses) {
int count = 0;
for (int i = 0; i < OPERACAKE_MAX_BOARDS; i++) {
addresses[i] = OPERACAKE_ADDRESS_INVALID;
}
for (int i = 0; i < OPERACAKE_MAX_BOARDS; i++) {
if (operacake_is_board_present(i))
addresses[count++] = i;
}
}
uint8_t port_to_pins(uint8_t port) {
switch(port) {
case OPERACAKE_PA1:
@ -220,8 +235,14 @@ uint8_t operacake_set_range(uint32_t freq_mhz) {
if(i == current_range) {
return 1;
}
operacake_set_ports(operacake_boards[0], ranges[i].portA, ranges[i].portB);
for (i = 0; i < OPERACAKE_MAX_BOARDS; i++) {
if (operacake_is_board_present(i)) {
operacake_set_ports(i, ranges[i].portA, ranges[i].portB);
break;
}
}
current_range = i;
return 0;
}

View File

@ -42,10 +42,9 @@ extern "C"
#define MAX_OPERACAKE_RANGES 8
/* Up to 8 Operacake boards can be used with one HackRF */
extern uint8_t operacake_boards[8];
uint8_t operacake_init(bool allow_gpio);
bool operacake_is_board_present(uint8_t address);
void operacake_get_boards(uint8_t *addresses);
uint8_t operacake_set_ports(uint8_t address, uint8_t PA, uint8_t PB);
uint8_t operacake_add_range(uint16_t freq_min, uint16_t freq_max, uint8_t port);
uint8_t operacake_set_range(uint32_t freq_mhz);

View File

@ -29,7 +29,9 @@ usb_request_status_t usb_vendor_request_operacake_get_boards(
usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage)
{
if (stage == USB_TRANSFER_STAGE_SETUP) {
usb_transfer_schedule_block(endpoint->in, operacake_boards, 8, NULL, NULL);
uint8_t addresses[8];
operacake_get_boards(addresses);
usb_transfer_schedule_block(endpoint->in, addresses, 8, NULL, NULL);
usb_transfer_schedule_ack(endpoint->out);
}
return USB_REQUEST_STATUS_OK;