/ 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  }