make bufs static
This commit is contained in:
53
src/aio.c
53
src/aio.c
@@ -9,6 +9,8 @@ static constexpr uint16_t usb_timeout = 250;
|
||||
static constexpr uint8_t buf_size = 32; // needs 32 bc of overflow issue on these aios?
|
||||
static constexpr uint8_t max_curve_points = 7;
|
||||
|
||||
static uint8_t req[buf_size], resp[buf_size];
|
||||
|
||||
static struct aio_params_t params = {
|
||||
.fans = {
|
||||
.setpoint = 43.5f,
|
||||
@@ -21,18 +23,6 @@ static struct aio_params_t params = {
|
||||
},
|
||||
}};
|
||||
|
||||
// posts cmd to the aio, puts n bytes of response inside resp buffer
|
||||
#define POST_AND_GET_RESP(cmd, n) \
|
||||
uint8_t req = cmd; \
|
||||
uint8_t resp[buf_size]; \
|
||||
aio_post(dev, &req, 1, resp, n)
|
||||
|
||||
// posts 2 bytes of cmd to aio, puts n bytes of response inside resp buffer
|
||||
#define POST_AND_GET_RESP2(cmd1, cmd2, n) \
|
||||
uint8_t req[2] = {cmd1, cmd2}; \
|
||||
uint8_t resp[buf_size]; \
|
||||
aio_post(dev, req, 2, resp, n)
|
||||
|
||||
// set the duty of both fans at once
|
||||
#define SET_FANS_DUTY(dev, duty) \
|
||||
const uint8_t d = {duty}; \
|
||||
@@ -58,7 +48,7 @@ static void aio_usb_release(libusb_device_handle *dev) {
|
||||
libusb_release_interface(dev, 0);
|
||||
}
|
||||
|
||||
static int aio_post(libusb_device_handle *dev, uint8_t *req, const int req_len, uint8_t *resp, const int resp_len) {
|
||||
static int aio_post(libusb_device_handle *dev, const int req_len, const int resp_len) {
|
||||
// applog(LOG_DBG, "writing to aio, %02x", req[0]);
|
||||
int ret = 0;
|
||||
ret += libusb_bulk_transfer(dev, 0x01, req, req_len, nullptr, usb_timeout);
|
||||
@@ -68,7 +58,8 @@ static int aio_post(libusb_device_handle *dev, uint8_t *req, const int req_len,
|
||||
|
||||
static float aio_get_water_temp(libusb_device_handle *dev) {
|
||||
static float last_read = 36.6f; // sane init value so it doenst ramp the fan up
|
||||
POST_AND_GET_RESP(0xa9, 6);
|
||||
req[0] = 0xa9;
|
||||
aio_post(dev, 1, 6);
|
||||
const float temp = (float)resp[3] + (float)resp[4] / 10.0f;
|
||||
|
||||
if (temp > 10.0f && temp < 65.0f) {
|
||||
@@ -81,18 +72,22 @@ static float aio_get_water_temp(libusb_device_handle *dev) {
|
||||
}
|
||||
|
||||
static uint16_t aio_get_pump_speed(libusb_device_handle *dev) {
|
||||
POST_AND_GET_RESP(0x31, 5);
|
||||
req[0] = 0x31;
|
||||
aio_post(dev, 1, 5);
|
||||
return (uint16_t)(resp[3] << 8 | resp[4]);
|
||||
}
|
||||
|
||||
static enum aio_pump_mode_t aio_get_pump_mode(libusb_device_handle *dev) {
|
||||
POST_AND_GET_RESP(0x33, 4);
|
||||
req[0] = 0x33;
|
||||
aio_post(dev, 1, 4);
|
||||
return (enum aio_pump_mode_t)resp[3];
|
||||
}
|
||||
|
||||
static void aio_get_fan_speed(libusb_device_handle *dev, uint16_t *speeds) {
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
POST_AND_GET_RESP2(0x41, i, 6);
|
||||
req[0] = 0x41;
|
||||
req[1] = i;
|
||||
aio_post(dev, 2, 6);
|
||||
speeds[i] = (uint8_t)(resp[4] << 8 | resp[5]);
|
||||
}
|
||||
}
|
||||
@@ -101,21 +96,21 @@ static void aio_set_fan_duty(libusb_device_handle *dev, const uint8_t *duty) {
|
||||
static uint8_t last_duty = 255;
|
||||
if (duty[0] == last_duty)
|
||||
return;
|
||||
uint8_t req[3] = {0x42, 0, 0};
|
||||
uint8_t resp[buf_size];
|
||||
req[0] = 0x42;
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
req[1] = i;
|
||||
req[2] = MIN(MAX(duty[i], 0), 100);
|
||||
if (params.fans.fan_stop && req[2] <= params.fans.min_duty)
|
||||
req[2] = 0;
|
||||
const int ret = aio_post(dev, req, sizeof(req), resp, buf_size);
|
||||
const int ret = aio_post(dev, sizeof(req), buf_size);
|
||||
if (ret == 0)
|
||||
last_duty = req[2];
|
||||
}
|
||||
}
|
||||
|
||||
static char *aio_get_firmware_version(libusb_device_handle *dev, char *buf) {
|
||||
POST_AND_GET_RESP(0xaa, buf_size);
|
||||
req[0] = 0xaa;
|
||||
aio_post(dev, 1, buf_size);
|
||||
sprintf(buf, "%d.%d.%d.%d", resp[3], resp[4], resp[5], resp[6]);
|
||||
return buf;
|
||||
}
|
||||
@@ -125,7 +120,9 @@ static void aio_set_pump_mode(libusb_device_handle *dev, const enum aio_pump_mod
|
||||
if (mode == last_mode)
|
||||
return;
|
||||
applog(LOG_DBG, "setting pump to %u", mode);
|
||||
POST_AND_GET_RESP2(0x32, (uint8_t)mode, 6);
|
||||
req[0] = 0x32;
|
||||
req[1] = (uint8_t)mode;
|
||||
aio_post(dev, 2, 6);
|
||||
last_mode = mode;
|
||||
}
|
||||
|
||||
@@ -134,7 +131,7 @@ static void aio_set_color(libusb_device_handle *dev, const enum aio_color_mode_t
|
||||
return;
|
||||
|
||||
constexpr uint8_t modes[] = {0x52, 0x55, 0x55, 0x58};
|
||||
uint8_t req[buf_size], resp[buf_size];
|
||||
|
||||
|
||||
req[0] = 0x56;
|
||||
req[1] = color_count;
|
||||
@@ -145,7 +142,7 @@ static void aio_set_color(libusb_device_handle *dev, const enum aio_color_mode_t
|
||||
memcpy(&req[5], colors, 3); // copy the same color to the 2nd pos in the table
|
||||
req[1] = 2;
|
||||
}
|
||||
aio_post(dev, req, 2 + req[1] * 3, resp, buf_size);
|
||||
aio_post(dev, 2 + req[1] * 3, buf_size);
|
||||
|
||||
// send speed, skip if fixed color
|
||||
if (mode != AIO_COLOR_FIXED) {
|
||||
@@ -153,13 +150,13 @@ static void aio_set_color(libusb_device_handle *dev, const enum aio_color_mode_t
|
||||
constexpr uint8_t speed_pulse[] = {0x50, 0x37, 0x1E};
|
||||
req[0] = 0x53;
|
||||
req[1] = mode == AIO_COLOR_SHIFT ? speed_shift[speed] : speed_pulse[speed];
|
||||
aio_post(dev, req, 2, resp, buf_size);
|
||||
aio_post(dev,2, buf_size);
|
||||
}
|
||||
|
||||
// actually set the aio to desired mode
|
||||
req[0] = modes[mode];
|
||||
req[1] = 0x01;
|
||||
aio_post(dev, req, 2, resp, buf_size);
|
||||
aio_post(dev, 2, buf_size);
|
||||
}
|
||||
|
||||
static void aio_set_fan_curve(libusb_device_handle *dev, const struct curve_point_t *curve, const uint8_t count) {
|
||||
@@ -175,7 +172,7 @@ static void aio_set_fan_curve(libusb_device_handle *dev, const struct curve_poin
|
||||
for (int i = 0; i < max_curve_points; i++)
|
||||
padded[i] = (i < count) ? curve[i] : curve[count - 1];
|
||||
|
||||
uint8_t req[16], resp[32];
|
||||
// uint8_t req[16], resp[32];
|
||||
req[0] = 0x40;
|
||||
|
||||
// setup request
|
||||
@@ -187,7 +184,7 @@ static void aio_set_fan_curve(libusb_device_handle *dev, const struct curve_poin
|
||||
// set curve for both fans
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
req[1] = i;
|
||||
aio_post(dev, req, sizeof(req), resp, sizeof(resp));
|
||||
aio_post(dev, sizeof(req), sizeof(resp));
|
||||
}
|
||||
applog(LOG_INF, "set up AIO fan curve");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user