X-Git-Url: https://git.ao2.it/visomat-utils.git/blobdiff_plain/ec6cf524733f65ff40ac2e086e96e0dfd38e1dda..91d0c4148bdb1fca33062b80b669e3c9e00c8030:/src/visomat-data-downloader.c diff --git a/src/visomat-data-downloader.c b/src/visomat-data-downloader.c index 0eca9c1..a91ee43 100644 --- a/src/visomat-data-downloader.c +++ b/src/visomat-data-downloader.c @@ -63,6 +63,7 @@ struct datetime { }; struct pressure { + unsigned int flag; /* XXX Maybe this means arrhythmia? */ unsigned int systolic; unsigned int diastolic; unsigned int pulses; @@ -102,16 +103,24 @@ static void print_record_csv_compat(struct datetime *d, struct pressure *p) pulse_pressure = p->systolic - p->diastolic; printf("%u;", pulse_pressure); + if (p->flag) + printf("x"); + +#if 0 + /* The original software does not seem to be doing that */ if (p->pulses > 100) printf("tachycardia"); else if (p->pulses < 60) printf("bradycardia"); +#endif printf("\n"); } /* TODO separate better decoding data from printing it */ -static int decode_eeprom(unsigned char *buffer, unsigned int len) +static int decode_eeprom(unsigned char *buffer, + unsigned int len, + unsigned int user_mask) { int ret; unsigned int n; @@ -137,7 +146,6 @@ static int decode_eeprom(unsigned char *buffer, unsigned int len) /* i tracks the bytes consumed */ i += 1; - ret = sscanf((char *)(buffer + i), "%1u%02u", &user_id, &num_records); if (ret != 2) @@ -146,8 +154,6 @@ static int decode_eeprom(unsigned char *buffer, unsigned int len) /* user_id and num_records take 3 bytes */ i += 3; - printf("# User: %d\n", user_id); - for (j = 0; j < num_records; j++) { ret = extract_datetime(buffer + i, &d); if (ret < 0) @@ -157,17 +163,23 @@ static int decode_eeprom(unsigned char *buffer, unsigned int len) i += 10; ret = sscanf((char *)(buffer + i), - "%04u%03u%03u", + "%1u%03u%03u%03u", + &p.flag, &p.systolic, &p.diastolic, &p.pulses); - if (ret != 3) + if (ret != 4) return -EINVAL; /* pressure data is 10 bytes */ i += 10; - print_record_csv_compat(&d, &p); + /* TODO: split out the printing part */ + if (user_id & user_mask) { + if (j == 0) + printf("# User: %d\n", user_id); + print_record_csv_compat(&d, &p); + } } } } @@ -258,7 +270,7 @@ static int get_response(libusb_device_handle *dev, /* Candidates for a future public API, if a shared library will ever be made */ #define visomat_device libusb_device_handle -static int visomat_dump_eeprom(visomat_device *dev) +static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask) { /* Assuming an EEPROM of 1 KiB */ unsigned char buffer[1024] = { 0 }; @@ -272,7 +284,7 @@ static int visomat_dump_eeprom(visomat_device *dev) if (ret < 0) return ret; - ret = decode_eeprom(buffer, ret); + ret = decode_eeprom(buffer, ret, user_mask); if (ret < 0) return ret; @@ -315,14 +327,14 @@ int main(void) } libusb_set_configuration(dev, 1); - libusb_claim_interface(dev, 1); libusb_detach_kernel_driver(dev, 1); + libusb_claim_interface(dev, 1); ret = visomat_get_datetime(dev); if (ret < 0) goto out; - ret = visomat_dump_eeprom(dev); + ret = visomat_dump_eeprom(dev, 0x01 | 0x02); out: libusb_close(dev);