Browse Source

bflsc add volt stats

nfactor-troky
Kano 12 years ago
parent
commit
bd4d04b260
  1. 68
      driver-bflsc.c
  2. 2
      usbutils.c
  3. 1
      usbutils.h

68
driver-bflsc.c

@ -68,7 +68,7 @@ struct bflsc_dev { @@ -68,7 +68,7 @@ struct bflsc_dev {
// Stats
float temp1;
float temp2;
float vcc1; // TODO? get V also
float vcc1;
float vcc2;
float vmain;
float temp1_max;
@ -866,7 +866,7 @@ static void get_bflsc_statline_before(char *buf, struct cgpu_info *bflsc) @@ -866,7 +866,7 @@ static void get_bflsc_statline_before(char *buf, struct cgpu_info *bflsc)
}
rd_unlock(&(sc_info->stat_lock));
tailsprintf(buf, "max%5.1fC%4.2fV | ", temp, vcc1);
tailsprintf(buf, " max%3.0fC %4.2fV | ", temp, vcc1);
}
static bool getok(struct cgpu_info *bflsc, enum usb_cmds cmd, int *err, int *amount)
@ -987,13 +987,16 @@ static void bflsc_flash_led(struct cgpu_info *bflsc, int dev) @@ -987,13 +987,16 @@ static void bflsc_flash_led(struct cgpu_info *bflsc, int dev)
static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev)
{
struct bflsc_info *sc_info = (struct bflsc_info *)(bflsc->device_file);
char buf[BFLSC_BUFSIZ+1];
char temp_buf[BFLSC_BUFSIZ+1];
char volt_buf[BFLSC_BUFSIZ+1];
char *tmp;
int err, amount;
char *firstname, **fields, *lf;
char xlink[17];
int count;
bool res;
float temp, temp1, temp2;
float vcc1, vcc2, vmain;
// Device is gone
if (bflsc->usbinfo.nodev)
@ -1026,7 +1029,29 @@ static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev) @@ -1026,7 +1029,29 @@ static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev)
return false;
}
err = usb_ftdi_read_nl(bflsc, buf, sizeof(buf)-1, &amount, C_GETTEMPERATURE);
err = usb_ftdi_read_nl(bflsc, temp_buf, sizeof(temp_buf)-1, &amount, C_GETTEMPERATURE);
if (err < 0 || amount < 1) {
mutex_unlock(&(bflsc->device_mutex));
if (err < 0) {
applog(LOG_ERR, "%s%i: Error: Get%s temp return invalid/timed out (%d:%d)",
bflsc->drv->name, bflsc->device_id, xlink, amount, err);
} else {
applog(LOG_ERR, "%s%i: Error: Get%s temp returned nothing (%d:%d)",
bflsc->drv->name, bflsc->device_id, xlink, amount, err);
}
return false;
}
// N.B. we only get the voltages if the temp succeeds - temp is the important one
err = write_to_dev(bflsc, dev, BFLSC_VOLTAGE, BFLSC_VOLTAGE_LEN, &amount, C_REQUESTVOLTS);
if (err < 0 || amount != BFLSC_VOLTAGE_LEN) {
mutex_unlock(&(bflsc->device_mutex));
applog(LOG_ERR, "%s%i: Error: Request%s volts invalid/timed out (%d:%d)",
bflsc->drv->name, bflsc->device_id, xlink, amount, err);
return false;
}
err = usb_ftdi_read_nl(bflsc, volt_buf, sizeof(volt_buf)-1, &amount, C_GETTEMPERATURE);
if (err < 0 || amount < 1) {
mutex_unlock(&(bflsc->device_mutex));
if (err < 0) {
@ -1041,12 +1066,14 @@ static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev) @@ -1041,12 +1066,14 @@ static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev)
mutex_unlock(&(bflsc->device_mutex));
res = breakdown(ALLCOLON, buf, &count, &firstname, &fields, &lf);
res = breakdown(ALLCOLON, temp_buf, &count, &firstname, &fields, &lf);
if (lf)
*lf = '\0';
if (!res || count != 2 || !lf) {
applog(LOG_WARNING, "%s%i: Invalid%s temp reply: '%s%s'",
bflsc->drv->name, bflsc->device_id, xlink, buf, lf ? LFSTR : BLANK);
tmp = str_text(temp_buf);
applog(LOG_WARNING, "%s%i: Invalid%s temp reply: '%s'",
bflsc->drv->name, bflsc->device_id, xlink, tmp);
free(tmp);
freebreakdown(&count, &firstname, &fields);
dev_error(bflsc, REASON_DEV_COMMS_ERROR);
return false;
@ -1055,6 +1082,33 @@ static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev) @@ -1055,6 +1082,33 @@ static bool bflsc_get_temp(struct cgpu_info *bflsc, int dev)
temp = temp1 = (float)atoi(fields[0]);
temp2 = (float)atoi(fields[1]);
res = breakdown(NOCOLON, volt_buf, &count, &firstname, &fields, &lf);
if (lf)
*lf = '\0';
if (!res || count != 3 || !lf) {
tmp = str_text(volt_buf);
applog(LOG_WARNING, "%s%i: Invalid%s volt reply: '%s'",
bflsc->drv->name, bflsc->device_id, xlink, tmp);
free(tmp);
freebreakdown(&count, &firstname, &fields);
dev_error(bflsc, REASON_DEV_COMMS_ERROR);
return false;
}
vcc1 = (float)atoi(fields[0]) / 1000.0;
vcc2 = (float)atoi(fields[1]) / 1000.0;
vmain = (float)atoi(fields[2]) / 1000.0;
if (vcc1 > 0 || vcc2 > 0 || vmain > 0) {
wr_lock(&(sc_info->stat_lock));
if (vcc1 > 0)
sc_info->sc_devs[dev].vcc1 = vcc1;
if (vcc2 > 0)
sc_info->sc_devs[dev].vcc2 = vcc2;
if (vmain > 0)
sc_info->sc_devs[dev].vmain = vmain;
wr_unlock(&(sc_info->stat_lock));
}
if (temp1 > 0 || temp2 > 0) {
wr_lock(&(sc_info->stat_lock));
sc_info->sc_devs[dev].temp1 = temp1;

2
usbutils.c

@ -296,6 +296,7 @@ static const char *C_QUEJOB_S = "QueJob"; @@ -296,6 +296,7 @@ static const char *C_QUEJOB_S = "QueJob";
static const char *C_QUEJOBSTATUS_S = "QueJobStatus";
static const char *C_QUEFLUSH_S = "QueFlush";
static const char *C_QUEFLUSHREPLY_S = "QueFlushReply";
static const char *C_REQUESTVOLTS_S = "RequestVolts";
#ifdef EOL
#undef EOL
@ -763,6 +764,7 @@ static void cgusb_check_init() @@ -763,6 +764,7 @@ static void cgusb_check_init()
usb_commands[C_QUEJOBSTATUS] = C_QUEJOBSTATUS_S;
usb_commands[C_QUEFLUSH] = C_QUEFLUSH_S;
usb_commands[C_QUEFLUSHREPLY] = C_QUEFLUSHREPLY_S;
usb_commands[C_REQUESTVOLTS] = C_REQUESTVOLTS_S;
stats_initialised = true;
}

1
usbutils.h

@ -133,6 +133,7 @@ enum usb_cmds { @@ -133,6 +133,7 @@ enum usb_cmds {
C_QUEJOBSTATUS,
C_QUEFLUSH,
C_QUEFLUSHREPLY,
C_REQUESTVOLTS,
C_MAX
};

Loading…
Cancel
Save