123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #include "bf16-ctrldevice.h"
- #include "miner.h"
- #define MAX_TOKENS_ALLOWED 10
- char *ctrl_device_name = "ctrl";
- static char *d_state_on = "ON";
- static char *d_state_off = "OFF";
- static char* D_STATE(int state)
- {
- return (state == 0) ? d_state_off : d_state_on;
- }
- char* get_ctrl_data(int channel, int state, int fn)
- {
- char *request = malloc(CTRL_BUFFER_SIZE);
- memset(request, 0, CTRL_BUFFER_SIZE);
- int index = (state == 0) ? 0 : 1;
- switch (fn) {
- case F_BUZZER:
- sprintf(request, "%s=%s\n", BUZZER, D_STATE(index));
- break;
- case F_LED1:
- sprintf(request, "%s=%s\n", LED_GREEN, D_STATE(index));
- break;
- case F_LED2:
- sprintf(request, "%s=%s\n", LED_RED, D_STATE(index));
- break;
- case F_BRST:
- (channel == 1) ?
- sprintf(request, "%s=%s\n", CH1_MSP_RST, D_STATE(index)) :
- sprintf(request, "%s=%s\n", CH2_MSP_RST, D_STATE(index));
- break;
- case F_RST:
- (channel == 1) ?
- sprintf(request, "%s=%s\n", CH1_SPI_RES, D_STATE(index)) :
- sprintf(request, "%s=%s\n", CH2_SPI_RES, D_STATE(index));
- break;
- case F_BDET:
- (channel == 1) ?
- sprintf(request, "%s=%s\n", CH1_BRD_DET, D_STATE(get_ch1_det())) :
- sprintf(request, "%s=%s\n", CH2_BRD_DET, D_STATE(get_ch2_det()));
- break;
- case F_STAT:
- default:
- request[0] = '\n';
- }
- return request;
- }
- static int D_VALUE(char *value)
- {
- if (strcasecmp(value, d_state_on) == 0)
- return 1;
- if (strcasecmp(value, d_state_off) == 0)
- return 0;
- return -1;
- }
- static int8_t D_FUNCTION(uint8_t value, char *cmd)
- {
- if (strcmp(cmd, BUZZER) == 0)
- return set_buzzer(value);
- else if (strcmp(cmd, LED_GREEN) == 0)
- return set_led_green(value);
- else if (strcmp(cmd, LED_RED) == 0)
- return set_led_red(value);
- else if (strcmp(cmd, CH1_MSP_RST) == 0)
- return set_ch1_rst(value);
- else if (strcmp(cmd, CH2_MSP_RST) == 0)
- return set_ch2_rst(value);
- else if (strcmp(cmd, CH1_SPI_RES) == 0)
- return set_ch1_spi(value);
- else if (strcmp(cmd, CH2_SPI_RES) == 0)
- return set_ch2_spi(value);
- else
- applog(LOG_ERR, "CTRL DEVICE, D_FUNCTION: unknown command: [%s]", cmd);
- return -1;
- }
- static int split_tokens(char* cmd, char token, char** tokens)
- {
- int len=0;
- char *src, *ptr;
- src = cmd;
- ptr = cmd;
- while ((*src != '\n') && (*src != '\r') && (*src != '\0') &&
- (len < MAX_TOKENS_ALLOWED)) {
- if (*src == token) {
- *src = 0;
- tokens[len++] = ptr;
- ptr = src + 1;
- }
- src++;
- }
- *src = 0;
- if (src != ptr)
- tokens[len++] = ptr;
- return len;
- }
- int8_t ctrl_init(device_t* attr, char *device, uint16_t size)
- {
- attr->device = device;
- attr->mode = 0;
- attr->speed = 0;
- attr->bits = 0;
- attr->size = size;
- attr->rx = malloc(size);
- attr->tx = malloc(size);
- brd_init();
- return 0;
- }
- int8_t ctrl_transfer(device_t *attr)
- {
- char* cmd = (char*) attr->tx;
- char* tokens[MAX_TOKENS_ALLOWED];
- int8_t ret = 0;
- int len = split_tokens(cmd, ';', tokens);
- cmd = (char*) attr->rx;
- if (len == 0) {
- len += snprintf(cmd + len, attr->size, "%s=%d;", HW_VER, get_hw_ver());
- len += snprintf(cmd + len, attr->size, "%s=%s;", BTN_FR, D_STATE(get_btn_fr()));
- len += snprintf(cmd + len, attr->size, "%s=%s;", BTN_DISCOVERY, D_STATE(get_btn_discovery()));
- len += snprintf(cmd + len, attr->size, "%s=%s;", CH1_DET, D_STATE(get_ch1_det()));
- len += snprintf(cmd + len, attr->size, "%s=%s\n",CH2_DET, D_STATE(get_ch2_det()));
- attr->datalen = len;
- } else {
- char* values[2];
- int i;
- int datalen = 0;
- for (i = 0; i < len; i++) {
- char *tok = tokens[i];
- int n = split_tokens(tok, '=', values);
- if (n == 2) {
- int state = D_VALUE(values[1]);
- if (state != -1) {
- applog(LOG_DEBUG, "BF16: CTRL: token applying: %s>%s", values[0], values[1]);
- if (strcasecmp(values[0], CH1_BRD_DET) == 0)
- datalen += snprintf(cmd + datalen, attr->size, "%s:%s\n", CH1_DET, D_STATE(get_ch1_det()));
- else if (strcasecmp(values[0], CH2_BRD_DET) == 0)
- datalen += snprintf(cmd + datalen, attr->size, "%s:%s\n", CH2_DET, D_STATE(get_ch2_det()));
- else
- ret = D_FUNCTION(state, values[0]);
- }
- }
- }
- if (datalen == 0) {
- datalen = 1;
- cmd[0] = '\n';
- } else
- attr->datalen = datalen;
- }
- return ret;
- }
- void ctrl_release(device_t *attr)
- {
- free(attr->rx);
- free(attr->tx);
- }
|