/ bf16-ctrldevice.c
bf16-ctrldevice.c
1 #include "bf16-ctrldevice.h" 2 #include "miner.h" 3 4 #define MAX_TOKENS_ALLOWED 10 5 6 char *ctrl_device_name = "ctrl"; 7 8 static char *d_state_on = "ON"; 9 static char *d_state_off = "OFF"; 10 11 static char* D_STATE(int state) 12 { 13 return (state == 0) ? d_state_off : d_state_on; 14 } 15 16 char* get_ctrl_data(int channel, int state, int fn) 17 { 18 char *request = malloc(CTRL_BUFFER_SIZE); 19 memset(request, 0, CTRL_BUFFER_SIZE); 20 int index = (state == 0) ? 0 : 1; 21 22 switch (fn) { 23 case F_BUZZER: 24 sprintf(request, "%s=%s\n", BUZZER, D_STATE(index)); 25 break; 26 case F_LED1: 27 sprintf(request, "%s=%s\n", LED_GREEN, D_STATE(index)); 28 break; 29 case F_LED2: 30 sprintf(request, "%s=%s\n", LED_RED, D_STATE(index)); 31 break; 32 case F_BRST: 33 (channel == 1) ? 34 sprintf(request, "%s=%s\n", CH1_MSP_RST, D_STATE(index)) : 35 sprintf(request, "%s=%s\n", CH2_MSP_RST, D_STATE(index)); 36 break; 37 case F_RST: 38 (channel == 1) ? 39 sprintf(request, "%s=%s\n", CH1_SPI_RES, D_STATE(index)) : 40 sprintf(request, "%s=%s\n", CH2_SPI_RES, D_STATE(index)); 41 break; 42 case F_BDET: 43 (channel == 1) ? 44 sprintf(request, "%s=%s\n", CH1_BRD_DET, D_STATE(get_ch1_det())) : 45 sprintf(request, "%s=%s\n", CH2_BRD_DET, D_STATE(get_ch2_det())); 46 break; 47 case F_STAT: 48 default: 49 request[0] = '\n'; 50 } 51 52 return request; 53 } 54 55 static int D_VALUE(char *value) 56 { 57 if (strcasecmp(value, d_state_on) == 0) 58 return 1; 59 60 if (strcasecmp(value, d_state_off) == 0) 61 return 0; 62 63 return -1; 64 } 65 66 static int8_t D_FUNCTION(uint8_t value, char *cmd) 67 { 68 if (strcmp(cmd, BUZZER) == 0) 69 return set_buzzer(value); 70 else if (strcmp(cmd, LED_GREEN) == 0) 71 return set_led_green(value); 72 else if (strcmp(cmd, LED_RED) == 0) 73 return set_led_red(value); 74 else if (strcmp(cmd, CH1_MSP_RST) == 0) 75 return set_ch1_rst(value); 76 else if (strcmp(cmd, CH2_MSP_RST) == 0) 77 return set_ch2_rst(value); 78 else if (strcmp(cmd, CH1_SPI_RES) == 0) 79 return set_ch1_spi(value); 80 else if (strcmp(cmd, CH2_SPI_RES) == 0) 81 return set_ch2_spi(value); 82 else 83 applog(LOG_ERR, "CTRL DEVICE, D_FUNCTION: unknown command: [%s]", cmd); 84 85 return -1; 86 } 87 88 static int split_tokens(char* cmd, char token, char** tokens) 89 { 90 int len=0; 91 char *src, *ptr; 92 93 src = cmd; 94 ptr = cmd; 95 while ((*src != '\n') && (*src != '\r') && (*src != '\0') && 96 (len < MAX_TOKENS_ALLOWED)) { 97 if (*src == token) { 98 *src = 0; 99 tokens[len++] = ptr; 100 ptr = src + 1; 101 } 102 src++; 103 } 104 105 *src = 0; 106 if (src != ptr) 107 tokens[len++] = ptr; 108 109 return len; 110 } 111 112 int8_t ctrl_init(device_t* attr, char *device, uint16_t size) 113 { 114 attr->device = device; 115 attr->mode = 0; 116 attr->speed = 0; 117 attr->bits = 0; 118 attr->size = size; 119 attr->rx = malloc(size); 120 attr->tx = malloc(size); 121 122 brd_init(); 123 124 return 0; 125 } 126 127 int8_t ctrl_transfer(device_t *attr) 128 { 129 char* cmd = (char*) attr->tx; 130 char* tokens[MAX_TOKENS_ALLOWED]; 131 int8_t ret = 0; 132 133 int len = split_tokens(cmd, ';', tokens); 134 cmd = (char*) attr->rx; 135 136 if (len == 0) { 137 len += snprintf(cmd + len, attr->size, "%s=%d;", HW_VER, get_hw_ver()); 138 len += snprintf(cmd + len, attr->size, "%s=%s;", BTN_FR, D_STATE(get_btn_fr())); 139 len += snprintf(cmd + len, attr->size, "%s=%s;", BTN_DISCOVERY, D_STATE(get_btn_discovery())); 140 len += snprintf(cmd + len, attr->size, "%s=%s;", CH1_DET, D_STATE(get_ch1_det())); 141 len += snprintf(cmd + len, attr->size, "%s=%s\n",CH2_DET, D_STATE(get_ch2_det())); 142 attr->datalen = len; 143 } else { 144 char* values[2]; 145 int i; 146 int datalen = 0; 147 148 for (i = 0; i < len; i++) { 149 char *tok = tokens[i]; 150 int n = split_tokens(tok, '=', values); 151 152 if (n == 2) { 153 int state = D_VALUE(values[1]); 154 155 if (state != -1) { 156 applog(LOG_DEBUG, "BF16: CTRL: token applying: %s>%s", values[0], values[1]); 157 158 if (strcasecmp(values[0], CH1_BRD_DET) == 0) 159 datalen += snprintf(cmd + datalen, attr->size, "%s:%s\n", CH1_DET, D_STATE(get_ch1_det())); 160 else if (strcasecmp(values[0], CH2_BRD_DET) == 0) 161 datalen += snprintf(cmd + datalen, attr->size, "%s:%s\n", CH2_DET, D_STATE(get_ch2_det())); 162 else 163 ret = D_FUNCTION(state, values[0]); 164 } 165 } 166 } 167 168 if (datalen == 0) { 169 datalen = 1; 170 cmd[0] = '\n'; 171 } else 172 attr->datalen = datalen; 173 } 174 175 return ret; 176 } 177 178 void ctrl_release(device_t *attr) 179 { 180 free(attr->rx); 181 free(attr->tx); 182 }