From 818bfc90124b3813f1a5c31ba622602513fef66c Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 9 Mar 2021 16:08:52 +0000 Subject: [PATCH 01/61] getting started on uploading relion prime --- app/reducers/devices.js | 2 +- lib/core/device.js | 10 +++++++++- lib/drivers/bayer/bayerContour.js | 10 +++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 6e26c06b61..989752a872 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -38,7 +38,7 @@ const devices = { instructions: 'Plug in meter with cable and make sure the meter is switched on', name: 'ReliOn Prime', key: 'relionprime', - source: {type: 'device', driverId: 'CareSens'}, + source: {type: 'device', driverId: 'ReliOnPrime'}, enabled: {mac: true, win: true, linux: true} }, relion: { diff --git a/lib/core/device.js b/lib/core/device.js index 5b8d4b74c3..d4e6b61271 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -87,6 +87,7 @@ device.deviceDrivers = { BluetoothLE: bluetoothLEDriver, CareSens: careSensDriver, ReliOn: careSensDriver, + ReliOnPrime: bayerContour, }; device.deviceComms = { @@ -110,6 +111,7 @@ device.deviceComms = { BluetoothLE: bleDevice, CareSens: hidDevice, ReliOn: serialDevice, + ReliOnPrime: serialDevice, }; device.driverManifests = { @@ -261,7 +263,6 @@ device.driverManifests = { mode: 'HID', usb: [ { vendorId: 4292, productId: 35378 }, // CareSens cable - { vendorId: 3835, productId: 17 }, // ReliOn Prime ], }, ReliOn: { @@ -272,6 +273,13 @@ device.driverManifests = { { vendorId: 1027, productId: 24577, driver: 'ftdi' }, // FT232R ], }, + ReliOnPrime: { + mode: 'serial', + bitrate: 19200, + usb: [ + { vendorId: 3835, productId: 17 }, // ReliOn Prime + ], + }, }; _.forEach(_.keys(device.deviceComms), (driverId) => { diff --git a/lib/drivers/bayer/bayerContour.js b/lib/drivers/bayer/bayerContour.js index 75f674752d..991d9340cb 100644 --- a/lib/drivers/bayer/bayerContour.js +++ b/lib/drivers/bayer/bayerContour.js @@ -251,9 +251,9 @@ module.exports = (config) => { }); } - if (bytes.includes(ASCII_CONTROL.EOT) - || bytes.includes(ASCII_CONTROL.ACK) - || bytes.includes(ASCII_CONTROL.ENQ)) { + if (// bytes[0] === ASCII_CONTROL.EOT + bytes[0] === ASCII_CONTROL.ACK + || bytes[0] === ASCII_CONTROL.ENQ) { clearTimeout(abortTimer); clearInterval(listenTimer); callback(null, raw); @@ -352,6 +352,10 @@ module.exports = (config) => { debug('DEBUG: on getDeviceInfo'); (async () => { + if (cfg.deviceInfo.driverId === 'ReliOnPrime') { + cb(null, await getData()); + } + retries = 0; await enterRemoteCommandMode(); From b8189ba737e5e10e2bcfa17d863ce36f18668693 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 21 Oct 2021 11:43:55 +0100 Subject: [PATCH 02/61] don't record any basals prior to missing temp basal start time --- lib/drivers/medtronic600/NGPHistoryParser.js | 18 +++++++++++++----- lib/drivers/medtronic600/medtronic600Driver.js | 8 ++++++-- locales/en/translation.missing.json | 2 +- package.json | 1 + yarn.lock | 18 ++++++++++++++++++ 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/lib/drivers/medtronic600/NGPHistoryParser.js b/lib/drivers/medtronic600/NGPHistoryParser.js index f08a3db30c..0f444f349d 100644 --- a/lib/drivers/medtronic600/NGPHistoryParser.js +++ b/lib/drivers/medtronic600/NGPHistoryParser.js @@ -1216,6 +1216,10 @@ class NGPHistoryParser { } } + // we don't know when this temp basal started, so have to ignore all basal events prior to this timestamp + // since we won't know whether those basals are suppressed by the temp basal + debug('Could not find start event for temp basal ending at', sundial.formatDeviceTime(tempBasalComplete.timestamp.toDate())); + this.firstBasalTime = tempBasalComplete.timestamp; return undefined; } @@ -1619,13 +1623,17 @@ class NGPHistoryParser { buildBasalRecords(events) { for (const event of this.eventsOfType(NGPHistoryEvent.EVENT_TYPE.BASAL_SEGMENT_START)) { - const basal = this.cfg.builder.makeScheduledBasal() - .with_rate(event.rate) - .with_scheduleName(event.patternName); + if (this.firstBasalTime && (this.firstBasalTime.toDate() > event.timestamp.toDate())) { + debug(`Dropping basal event at ${sundial.formatDeviceTime(event.timestamp.toDate())} that occurred prior to temp basal with missing start time`); + } else { + const basal = this.cfg.builder.makeScheduledBasal() + .with_rate(event.rate) + .with_scheduleName(event.patternName); - this.addTimeFields(basal, event.timestamp); + this.addTimeFields(basal, event.timestamp); - events.push(basal); + events.push(basal); + } } // Add gaps from beginning of Auto Mode start until first microbolus, or basal event diff --git a/lib/drivers/medtronic600/medtronic600Driver.js b/lib/drivers/medtronic600/medtronic600Driver.js index 35a065a679..b8c5e42b36 100644 --- a/lib/drivers/medtronic600/medtronic600Driver.js +++ b/lib/drivers/medtronic600/medtronic600Driver.js @@ -25,7 +25,6 @@ const { promisify } = require('util'); const ExtendableError = require('es6-error'); const uploadDataPeriod = require('../../../app/utils/uploadDataPeriod'); const crcCalculator = require('../../crc.js'); -const LZO = require('lzo-wasm'); const common = require('../../commonFunctions'); const NGPUtil = require('./NGPUtil'); const NGPHistoryParser = require('./NGPHistoryParser'); @@ -35,6 +34,10 @@ const isBrowser = typeof window !== 'undefined'; // eslint-disable-next-line no-console const debug = isBrowser ? require('bows')('Medtronic600Driver') : console.log; +// lzo-wasm only works in the browser, for cli we use lzo-decompress +// eslint-disable-next-line import/no-extraneous-dependencies +const LZO = isBrowser ? require('lzo-wasm') : require('lzo-decompress'); + class TimeoutError extends ExtendableError {} class InvalidMessageError extends ExtendableError {} @@ -2520,10 +2523,11 @@ module.exports = (config) => { _.assign(events, timeChanges.postRecords); cfg.tzoUtil = timeChanges.tzoUtil; + // order here is important, as temp basals inform basal records historyParser .buildSettingsRecords(events) - .buildBasalRecords(events) .buildTempBasalRecords(events) + .buildBasalRecords(events) .buildSuspendResumeRecords(events) .buildNormalBolusRecords(events) .buildSquareBolusRecords(events) diff --git a/locales/en/translation.missing.json b/locales/en/translation.missing.json index a8367f8734..768a9d2c91 100644 --- a/locales/en/translation.missing.json +++ b/locales/en/translation.missing.json @@ -6,4 +6,4 @@ "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.": "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.", "Turn meter on and make sure Bluetooth is switched on": "Turn meter on and make sure Bluetooth is switched on", "Sorry, we don't support the Libre 2 yet": "Sorry, we don't support the Libre 2 yet" -} +} \ No newline at end of file diff --git a/package.json b/package.json index ff32a5cb3e..8dbdb14d75 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,7 @@ "jest": "24.9.0", "json-loader": "0.5.7", "less-loader": "6.2.0", + "lzo-decompress": "1.0.1", "mini-css-extract-plugin": "0.12.0", "node-hid": "1.1.0", "object-invariant-test-helper": "0.1.1", diff --git a/yarn.lock b/yarn.lock index e634649f2b..84c99bfd48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9256,6 +9256,14 @@ lru-cache@~4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +lzo-decompress@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lzo-decompress/-/lzo-decompress-1.0.1.tgz#fe8649ba73fe20a4ebafd2f119ad7c1db57949dd" + integrity sha512-C9GZmL2MwkxIFw6EuwvA82WUTxWwMN/yPToMKOpqmg72Yq9+V2qQFwukaacvXyd5ICv5i1EiVfYvHmx6ObfNeA== + dependencies: + napi-macros "2.0.0" + node-gyp-build "4.2.0" + lzo-wasm@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/lzo-wasm/-/lzo-wasm-0.0.4.tgz#49152521a0b67a1da3a3e113dd38f150f303230a" @@ -9776,6 +9784,11 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +napi-macros@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + native-request@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.0.7.tgz#ff742dc555b4c8f2f1c14b548639ba174e573856" @@ -9873,6 +9886,11 @@ node-forge@^0.10.0: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-gyp-build@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.0.tgz#2c2b05f461f4178641a6ce2d7159f04094e9376d" + integrity sha512-4oiumOLhCDU9Rronz8PZ5S4IvT39H5+JEv/hps9V8s7RSLhsac0TCP78ulnHXOo8X1wdpPiTayGlM1jr4IbnaQ== + node-gyp@~3.6.0, node-gyp@~3.6.2: version "3.6.3" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.3.tgz#369fcb09146ae2167f25d8d23d8b49cc1a110d8d" From a3d2423eaaa872fed38265a8bc5eaa8c39f097aa Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 21 Oct 2021 11:50:42 +0100 Subject: [PATCH 03/61] fix lockfile --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 84c99bfd48..c630816dd8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9256,7 +9256,7 @@ lru-cache@~4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" -lzo-decompress@^1.0.1: +lzo-decompress@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lzo-decompress/-/lzo-decompress-1.0.1.tgz#fe8649ba73fe20a4ebafd2f119ad7c1db57949dd" integrity sha512-C9GZmL2MwkxIFw6EuwvA82WUTxWwMN/yPToMKOpqmg72Yq9+V2qQFwukaacvXyd5ICv5i1EiVfYvHmx6ObfNeA== From aff684a368ee5e784834842c3777af28e0a22c05 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 21 Oct 2021 15:55:12 +0100 Subject: [PATCH 04/61] v2.39.0-600-series-duplicate-data.1 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 04c3bbccbc..6353b32fec 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.39.0", + "version": "2.39.0-600-series-duplicate-data.1", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 8dbdb14d75..1aec7fe736 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.39.0", + "version": "2.39.0-600-series-duplicate-data.1", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 8ca6c3cdda3b923bad167e2a2aed0be8bf92d9ce Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 1 Mar 2022 14:38:23 +0000 Subject: [PATCH 05/61] use contour driver as start for prime driver --- lib/core/device.js | 3 ++- lib/drivers/bayer/bayerContour.js | 8 ++------ locales/en/translation.missing.json | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/core/device.js b/lib/core/device.js index 0b76a483c9..5351d70615 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -58,6 +58,7 @@ import careSensDriver from '../drivers/i-sens/careSens'; import WeitaiUSB from '../drivers/weitai/weiTaiUSB'; import glucocardExpression from '../drivers/i-sens/glucocardExpression'; import libreViewDriver from '../drivers/abbott/libreViewDriver'; +import reliOnPrime from '../drivers/i-sens/reliOnPrime'; const device = { log: bows('Device'), @@ -94,7 +95,7 @@ device.deviceDrivers = { CareSens: careSensDriver, Weitai: WeitaiUSB, ReliOnPremier: careSensDriver, - ReliOnPrime: bayerContour, + ReliOnPrime: reliOnPrime, GlucocardExpression: glucocardExpression, GlucocardShine: careSensDriver, GlucocardShineHID: careSensDriver, diff --git a/lib/drivers/bayer/bayerContour.js b/lib/drivers/bayer/bayerContour.js index 991d9340cb..8e4f0c5a86 100644 --- a/lib/drivers/bayer/bayerContour.js +++ b/lib/drivers/bayer/bayerContour.js @@ -251,8 +251,8 @@ module.exports = (config) => { }); } - if (// bytes[0] === ASCII_CONTROL.EOT - bytes[0] === ASCII_CONTROL.ACK + if (bytes[0] === ASCII_CONTROL.EOT + || bytes[0] === ASCII_CONTROL.ACK || bytes[0] === ASCII_CONTROL.ENQ) { clearTimeout(abortTimer); clearInterval(listenTimer); @@ -352,10 +352,6 @@ module.exports = (config) => { debug('DEBUG: on getDeviceInfo'); (async () => { - if (cfg.deviceInfo.driverId === 'ReliOnPrime') { - cb(null, await getData()); - } - retries = 0; await enterRemoteCommandMode(); diff --git a/locales/en/translation.missing.json b/locales/en/translation.missing.json index e7680bf2c7..c2a216ae60 100644 --- a/locales/en/translation.missing.json +++ b/locales/en/translation.missing.json @@ -9,4 +9,4 @@ "Sorry, we don't support the Libre 2 yet": "Sorry, we don't support the Libre 2 yet", "We couldn't communicate with the meter. You may need to give Uploader": "We couldn't communicate with the meter. You may need to give Uploader", "We found more than one device plugged in. Only plug in the device you intend to upload.": "We found more than one device plugged in. Only plug in the device you intend to upload." -} +} \ No newline at end of file From 1893fdf864e8434c221246f9c23277857357def6 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 2 Mar 2022 11:17:51 +0000 Subject: [PATCH 06/61] add prime driver files --- lib/drivers/i-sens/reliOnConstants.js | 73 ++++ lib/drivers/i-sens/reliOnPrime.js | 602 ++++++++++++++++++++++++++ 2 files changed, 675 insertions(+) create mode 100644 lib/drivers/i-sens/reliOnConstants.js create mode 100644 lib/drivers/i-sens/reliOnPrime.js diff --git a/lib/drivers/i-sens/reliOnConstants.js b/lib/drivers/i-sens/reliOnConstants.js new file mode 100644 index 0000000000..9b59ed8116 --- /dev/null +++ b/lib/drivers/i-sens/reliOnConstants.js @@ -0,0 +1,73 @@ +/* + * == BSD2 LICENSE == + * Copyright (c) 2020, Tidepool Project + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the associated License, which is identical to the BSD 2-Clause + * License as published by the Open Source Initiative at opensource.org. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the License for more details. + * + * You should have received a copy of the License along with this program; if + * not, you can obtain one from Tidepool Project at tidepool.org. + * == BSD2 LICENSE == + */ + +export const ASCII_CONTROL = { + ACK: 0x06, + CR: 0x0D, + ENQ: 0x05, + EOT: 0x04, + ETB: 0x17, + ETX: 0x03, + LF: 0x0A, + NAK: 0x15, + STX: 0x02, + CAN: 0x18, +}; + +export const MODELS = { + Bayer6200: 'Contour Next Link', // mg/dL + Contour6200: 'Contour Next Link', // mg/dL + Bayer6210: 'Contour Next Link 2.4', // mg/dL + Contour6210: 'Contour Next Link 2.4', // mg/dL + Bayer6300: 'Contour Next Link', // mmol/L + Contour6300: 'Contour Next Link', // mmol/L + Bayer7350: 'Contour Next', // mg/dL & mmol/L + Contour7350: 'Contour Next', // mg/dL & mmol/L + Bayer7390: 'Contour USB', // mg/dL + Contour7390: 'Contour USB', // mg/dL + Bayer7410: 'Contour Next USB', // mg/dL & mmol/L + Contour7410: 'Contour Next USB', // mg/dL & mmol/L + Contour7800: 'Contour Next One', // mg/dL & mmol/L + Bayer7150: 'Contour', + Contour7150: 'Contour', + Bayer7160: 'Contour Next EZ', + Contour7160: 'Contour Next EZ', + Bayer7220: 'Contour', + Contour7220: 'Contour', + Contour7600: 'Contour Plus', + Contour7900: 'Contour Next', +}; + +export const COMMANDS = { + READ: [0x52, 0x7c], // R| + WRITE: [0x57, 0x7c], // W| + DATE: [0x44, 0x7c], // D| + TIME: [0x54, 0x7c], // T| + DATA: [0x45, 0x7c], // E| +}; + +export const METHODS = { + B: 'whole blood', + P: 'plasma', + C: 'capillary', +}; + +export const MARKS = { + B: 'pre-meal', + A: 'post-meal', + D: 'logbook', +}; diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js new file mode 100644 index 0000000000..43ac44d70b --- /dev/null +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -0,0 +1,602 @@ +/* + * == BSD2 LICENSE == + * Copyright (c) 2020, Tidepool Project + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the associated License, which is identical to the BSD 2-Clause + * License as published by the Open Source Initiative at opensource.org. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the License for more details. + * + * You should have received a copy of the License along with this program; if + * not, you can obtain one from Tidepool Project at tidepool.org. + * == BSD2 LICENSE == + */ + +/* eslint-disable no-param-reassign */ + +import _ from 'lodash'; +import async from 'async'; +import sundial from 'sundial'; + +import structJs from '../../struct'; +import annotate from '../../eventAnnotations'; +import TZOUtil from '../../TimezoneOffsetUtil'; +import common from '../../commonFunctions'; +import { + MODELS, ASCII_CONTROL, COMMANDS, METHODS, MARKS, +} from './reliOnConstants'; + +const isBrowser = typeof window !== 'undefined'; +// eslint-disable-next-line no-console +const debug = isBrowser ? require('bows')('BCDriver') : console.log; + +const struct = structJs(); + +module.exports = (config) => { + const cfg = _.clone(config); + const serialDevice = config.deviceComms; + let retries = 0; + + cfg.tzoUtil = new TZOUtil(cfg.timezone, new Date().toISOString(), []); + _.assign(cfg.deviceInfo, { + tags: ['bgm'], + manufacturers: ['Bayer'], + }); + + const extractPacket = (bytes) => { + // all packets passed the bcnPacketHandler validation are valid, the checksum is verified later + const packet = { + bytes, + valid: false, + packet_len: 0, + payload: null, + }; + + const packetLength = bytes.length; + packet.packet_len = packetLength; + packet.valid = true; + + return packet; + }; + + const bcnPacketHandler = (buffer) => { + if (buffer.len() < 1) { // only empty buffer is no valid packet + return false; + } + + const packet = extractPacket(buffer.bytes()); + if (packet.packet_len !== 0) { + // cleanup the buffer data + buffer.discard(packet.packet_len); + } + + if (packet.valid) { + return packet; + } + return null; + }; + + const buildPacket = (command, cmdlength) => { + const datalen = cmdlength; + const buf = new ArrayBuffer(datalen); + const bytes = new Uint8Array(buf); + + if (cmdlength === 1) { + struct.storeByte(command, bytes, 0); + } else { + const ctr = struct.copyBytes(bytes, 0, command, cmdlength); + struct.storeByte(0x0D, bytes, ctr); // add carriage return + } + debug('Sending byte(s):', common.bytes2hex(bytes)); + return buf; + }; + + const packetParser = (result) => { + if (result != null) { + const tostr = _.map(result, + (e) => String.fromCharCode(e)).join(''); + result.payload = tostr; + return result; + } + return null; + }; + + const buildCmdWithParser = (cmd, length) => ({ + packet: buildPacket(cmd, length), + parser: packetParser, + }); + + const buildCmd = (cmd, length) => ({ + packet: buildPacket(cmd, length), + parser: (result) => result, + }); + + const verifyChecksum = (record) => { + const str = record.trim(); + const data = str.split(String.fromCharCode(ASCII_CONTROL.ETB)); + const check = data[1]; + let sum = 0; + const n = record.slice(0, record.length - 3); + + _.map(n, (e) => { + if (e.charCodeAt(0) !== ASCII_CONTROL.STX) { + sum += e.charCodeAt(0); + } + }); + + if ((sum % 256) !== parseInt(check, 16)) { + return null; + } + return data[0]; + }; + + const parseHeader = (s) => { + const data = s.split('\n').filter((e) => e.length > 1); + const header = data.shift(); + + if (verifyChecksum(header)) { + data.shift(); // patient not used + data.pop(); // remove linefeed + const pString = header.split('|'); + const pInfo = pString[4].split('^'); + const sNum = pInfo[2]; + const records = data.filter((e) => e[2] === 'R'); + const recordAverage = records.shift(); // the first record means the average + const ordRecords = data.filter((e) => e[2] === 'O'); + + const devInfo = { + model: pInfo[0], + serialNumber: sNum, + nrecs: records.length, + recordA: recordAverage, + rawrecords: records, + ordRecords, + }; + + return devInfo; + } + return null; + }; + + const parseDataRecord = (str, callback) => { + const data = verifyChecksum(str); + if (data) { + debug('Record:', data); + const result = data.trim().match(/^.*\d+R\|(\d+).*Glucose\|(\d+\.?\d*)\|(\w+\/\w+)\^(\w*)\|\d*\|(>|<|T|>\\T|<\\T|)\|(\w*)\|(\w*)\|{3}(\d{12})$/); + if (result != null) { + return callback(null, result.slice(1, 10)); + } + } + return callback(new Error('Invalid record data')); + }; + + const getAnnotations = (annotation, value, units) => { + if (annotation.indexOf('>') !== -1) { + return [{ + code: 'bg/out-of-range', + threshold: units === 'mg/dL' ? value - 1 : _.round(18 * (value - 0.05)), + value: 'high', + }]; + } if (annotation.indexOf('<') !== -1) { + return [{ + code: 'bg/out-of-range', + threshold: units === 'mg/dL' ? value + 1 : _.round(18 * (value + 0.05)), + value: 'low', + }]; + } + return null; + }; + + const isControl = (markers) => { + if (markers.indexOf('E') !== -1) { + debug('Marking as control test'); + return true; + } + return false; + }; + + const getOneRecord = (record, data, callback) => { + parseDataRecord(record, (err, r) => { + if (err) { + debug('Failure trying to read record', record); + debug(err); + return callback(err, null); + } + const [nrec, glucose, units, referenceMethod, annotations, userMarks, control, timestamp] = r; + const value = units === 'mg/dL' ? parseInt(glucose, 10) : parseFloat(glucose); + const robj = { + timestamp: parseInt(timestamp, 10), + annotations: getAnnotations(annotations, value, units), + control: isControl(control), + units, + glucose: value, + nrec: parseInt(nrec, 10), + referenceMethod: METHODS[referenceMethod], + userMarks: MARKS[userMarks], + }; + return callback(null, robj); + }); + }; + + const listenForPacket = (timeout, callback) => { + let listenTimer = null; + + const abortTimeout = () => { + clearInterval(listenTimer); + debug('TIMEOUT'); + callback('Timeout error. Is the meter switched on?', null); + }; + + const raw = []; + let abortTimer = setTimeout(abortTimeout, timeout); + + listenTimer = setInterval(() => { + if (serialDevice.hasAvailablePacket()) { + // reset abort timeout + clearTimeout(abortTimer); + abortTimer = setTimeout(abortTimeout, timeout); + + const { bytes } = serialDevice.nextPacket(); + debug('Raw packet received:', common.bytes2hex(bytes), new TextDecoder().decode(bytes)); + _.map(bytes, (e) => { raw.push(e); }); + + if (bytes[0] === ASCII_CONTROL.EOT + || bytes[0] === ASCII_CONTROL.ACK + || bytes[0] === ASCII_CONTROL.ENQ + || _.endsWith(raw, [ASCII_CONTROL.CR, ASCII_CONTROL.LF])) { + clearTimeout(abortTimer); + clearInterval(listenTimer); + callback(null, raw); + } + } + }, 20); + }; + + const bcnCommandResponse = async (commandpacket) => new Promise((resolve, reject) => { + try { + serialDevice.writeSerial(commandpacket.packet, () => { + listenForPacket(5000, (err, result) => { + if (err) { + reject(err); + } + const parsed = commandpacket.parser(result); + resolve(parsed); + }); + }); + } catch (e) { + // exceptions inside Promise won't be thrown, so we have to + // reject errors here (e.g. device unplugged during data read) + reject(e); + } + }); + + const getData = async () => { + // exit remote command mode + // await bcnCommandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); + + const cmd = buildCmdWithParser(ASCII_CONTROL.ACK, 1); + const datatxt = await bcnCommandResponse(cmd); + const header = parseHeader(datatxt.payload); + if (header) { + return header; + } + debug('Invalid header data'); + throw (new Error('Invalid header data')); + }; + + const enterRemoteCommandMode = async () => { + let response; + try { + // [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.NAK, 1)); + // + // if (response === ASCII_CONTROL.ENQ) { + // // if we get an enq, send another nak, because we want an eot + // [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.NAK, 1)); + // } + // + // if (response !== ASCII_CONTROL.EOT) { + // throw new Error(`Expected EOT, got ${response.toString(16)}`); + // } + + [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); + + if (response !== ASCII_CONTROL.ENQ) { + throw new Error(`Expected ENQ, got ${response.toString(16)}`); + } + + [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.ACK, 1)); + + // TODO: parse header + + [response] = await bcnCommandResponse(buildCmd(0x92, 1)); + + if (response !== ASCII_CONTROL.EOT) { + throw new Error(`Expected EOT, got ${response.toString(16)}`); + } + + const [ack] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.ENQ, 1)); + if (ack !== ASCII_CONTROL.ACK) { + throw new Error(`Expected ACK, got ${ack.toString(16)}`); + } + } catch (error) { + if (retries === 3) { + throw error; + } + debug('Trying again ...'); + retries += 1; + await enterRemoteCommandMode(); + } + }; + + const setDateTime = async (serverTime) => { + const newDate = []; + struct.storeString(sundial.formatInTimezone(serverTime, cfg.timezone, 'YYMMDD|').concat('\r'), newDate, 0); + const [ack1] = await bcnCommandResponse(buildCmd(COMMANDS.WRITE, 2)); + const [ack2] = await bcnCommandResponse(buildCmd(COMMANDS.DATE, 2)); + const [ack3] = await bcnCommandResponse(buildCmd(newDate, 8)); + if (ack1 !== ASCII_CONTROL.ACK || ack2 !== ASCII_CONTROL.ACK || ack3 !== ASCII_CONTROL.ACK) { + if (retries === 0) { + debug('Could not set date on meter, retrying..'); + await enterRemoteCommandMode(); + await setDateTime(serverTime); + } else { + throw new Error('Could not set date on meter'); + } + } + + const newTime = []; + struct.storeString(sundial.formatInTimezone(serverTime, cfg.timezone, 'HHmm|').concat('\r'), newTime, 0); + const [ack4] = await bcnCommandResponse(buildCmd(COMMANDS.WRITE, 2)); + const [ack5] = await bcnCommandResponse(buildCmd(COMMANDS.TIME, 2)); + const [ack6] = await bcnCommandResponse(buildCmd(newTime, 6)); + if (ack4 !== ASCII_CONTROL.ACK || ack5 !== ASCII_CONTROL.ACK || ack6 !== ASCII_CONTROL.ACK) { + throw new Error('Could not set time on meter'); + } + }; + + const getDeviceInfo = (cb) => { + debug('DEBUG: on getDeviceInfo'); + + (async () => { + // await getData(); + + retries = 0; + await enterRemoteCommandMode(); + + // read data + await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); + await bcnCommandResponse(buildCmd(COMMANDS.DATA, 2)); + const dataPacket = await bcnCommandResponse(buildCmdWithParser([0x00, 0x01], 2)); + const data = _.split(dataPacket.payload, '|'); + console.log('DATA:', data); + + // read time + await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); + const timePacket = await bcnCommandResponse(buildCmdWithParser(COMMANDS.TIME, 2)); + const [, time] = _.split(timePacket.payload, '|'); + + // read date + await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); + const datePacket = await bcnCommandResponse(buildCmdWithParser(COMMANDS.DATE, 2)); + const [, date] = _.split(datePacket.payload, '|'); + + cfg.deviceInfo.deviceTime = sundial.parseFromFormat(date.concat(' ', time), 'YYMMDD HHmm'); + + common.checkDeviceTime(cfg, async (err, serverTime) => { + try { + if (err) { + if (err === 'updateTime') { + cfg.deviceInfo.annotations = 'wrong-device-time'; + retries = 0; + await setDateTime(serverTime); + cb(null, await getData()); + } else { + cb(err, null); + } + } else { + cb(null, await getData()); + } + } catch (error) { + cb(error, null); + } + }); + })().catch((error) => { + debug('Error in getDeviceInfo: ', error); + cb(error, null); + }); + }; + + const processReadings = (readings) => { + _.each(readings, (reading, index) => { + readings[index].jsDate = sundial.parseFromFormat(reading.timestamp, 'YYYYMMDD HHmm'); + readings[index].displayTime = sundial.formatDeviceTime(readings[index].jsDate); + }); + }; + + const prepBGData = (progress, data) => { + // build missing data.id + data.id = `${data.model}-${data.serialNumber}`; + cfg.builder.setDefaults({ deviceId: data.id }); + const dataToPost = []; + if (data.bgmReadings.length > 0) { + for (let i = 0; i < data.bgmReadings.length; ++i) { + const datum = data.bgmReadings[i]; + if (datum.control === true) { + debug('Discarding control'); + // eslint-disable-next-line no-continue + continue; + } + const smbg = cfg.builder.makeSMBG() + .with_value(datum.glucose) + .with_deviceTime(datum.displayTime) + .with_units(datum.units) + .set('index', datum.nrec); + + if (datum.annotations) { + _.each(datum.annotations, (ann) => { + annotate.annotateEvent(smbg, ann); + }); + } + + cfg.tzoUtil.fillInUTCInfo(smbg, datum.jsDate); + dataToPost.push(smbg.done()); + } + } else { + debug('Device has no records to upload'); + throw (new Error('Device has no records to upload')); + } + + return dataToPost; + }; + + return { + detect(deviceInfo, cb) { + debug('no detect function needed'); + cb(null, deviceInfo); + }, + + setup(deviceInfo, progress, cb) { + debug('in setup!'); + progress(100); + cb(null, { deviceInfo }); + }, + + connect(progress, data, cb) { + debug('in connect!'); + cfg.deviceComms.connect(data.deviceInfo, bcnPacketHandler, (err) => { + if (err) { + return cb(err); + } + cfg.deviceComms.flush(); + progress(100); + data.connect = true; + return cb(null, data); + }); + }, + + getConfigInfo(progress, data, cb) { + debug('in getConfigInfo', data); + + getDeviceInfo((err, result) => { + progress(100); + + if (!err) { + data.connect = true; + _.assign(data, result); + _.merge(cfg.deviceInfo, result); + cfg.deviceInfo.model = MODELS[data.model]; + data.deviceModel = cfg.deviceInfo.model; // for metrics + if (cfg.deviceInfo.model == null) { + cfg.deviceInfo.model = 'Unknown Bayer model'; + } + debug('Detected as: ', cfg.deviceInfo.model); + cb(null, data); + } else { + cb(err, result); + } + }); + }, + + fetchData(progress, data, cb) { + debug('in fetchData', data); + + function getOneRecordWithProgress(recnum, callback) { + const rec = data.rawrecords.shift(); + progress((100.0 * recnum) / data.nrecs); + setTimeout(() => { + getOneRecord(rec, data, callback); + }, 20); + } + + async.timesSeries(data.nrecs, getOneRecordWithProgress, (err, result) => { + if (err) { + debug('fetchData failed'); + debug(err); + debug(result); + } else { + debug('fetchData', result); + } + data.fetchData = true; + data.bgmReadings = result; + progress(100); + cb(err, data); + }); + }, + + processData(progress, data, cb) { + progress(0); + data.bg_data = processReadings(data.bgmReadings); + data.post_records = prepBGData(progress, data); + const ids = {}; + for (let i = 0; i < data.post_records.length; ++i) { + delete data.post_records[i].index; + const id = `${data.post_records[i].time}|${data.post_records[i].deviceId}`; + if (ids[id]) { + debug('duplicate! %s @ %d == %d', id, i, ids[id] - 1); + debug(data.post_records[ids[id] - 1]); + debug(data.post_records[i]); + } else { + ids[id] = i + 1; + } + } + progress(100); + data.processData = true; + cb(null, data); + }, + + uploadData(progress, data, cb) { + progress(0); + const sessionInfo = { + deviceTags: cfg.deviceInfo.tags, + deviceManufacturers: cfg.deviceInfo.manufacturers, + deviceModel: cfg.deviceInfo.model, + deviceSerialNumber: cfg.deviceInfo.serialNumber, + deviceId: data.id, + start: sundial.utcDateString(), + timeProcessing: cfg.tzoUtil.type, + tzName: cfg.timezone, + version: cfg.version, + }; + + debug('POST records:', data.post_records); + + cfg.api.upload.toPlatform( + data.post_records, + sessionInfo, + progress, + cfg.groupId, + (err, result) => { + progress(100); + + if (err) { + debug(err); + debug(result); + return cb(err, data); + } + data.cleanup = true; + return cb(null, data); + }, + 'dataservices', + ); + }, + + disconnect(progress, data, cb) { + debug('in disconnect'); + progress(100); + cb(null, data); + }, + + cleanup(progress, data, cb) { + debug('in cleanup'); + cfg.deviceComms.disconnect(() => { + progress(100); + data.cleanup = true; + data.disconnect = true; + cb(null, data); + }); + }, + }; +}; From 97b8258093065123acbc376be5f279e7fceda12a Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 2 Mar 2022 15:36:20 +0000 Subject: [PATCH 07/61] successfully read number of records and set date/time --- lib/core/device.js | 4 ++++ lib/drivers/i-sens/reliOnPrime.js | 24 ++++-------------------- lib/serialDevice.js | 4 ++++ 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/lib/core/device.js b/lib/core/device.js index 5351d70615..a3899958ce 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -310,6 +310,7 @@ device.driverManifests = { ReliOnPrime: { mode: 'serial', bitrate: 19200, + stopBits: 2, usb: [ { vendorId: 3835, productId: 17 }, // ReliOn Prime ], @@ -528,6 +529,9 @@ device.detectUsbSerial = (driverId, cb) => { if (driverManifest.receiveTimeout) { retval.receiveTimeout = driverManifest.receiveTimeout; } + if (driverManifest.stopBits) { + retval.stopBits = driverManifest.stopBits; + } return retval; }); diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js index 43ac44d70b..5ec202313b 100644 --- a/lib/drivers/i-sens/reliOnPrime.js +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -246,7 +246,8 @@ module.exports = (config) => { if (bytes[0] === ASCII_CONTROL.EOT || bytes[0] === ASCII_CONTROL.ACK || bytes[0] === ASCII_CONTROL.ENQ - || _.endsWith(raw, [ASCII_CONTROL.CR, ASCII_CONTROL.LF])) { + || _.endsWith(raw, [ASCII_CONTROL.CR, ASCII_CONTROL.LF]) + || _.endsWith(raw, ASCII_CONTROL.ACK)) { clearTimeout(abortTimer); clearInterval(listenTimer); callback(null, raw); @@ -290,23 +291,6 @@ module.exports = (config) => { const enterRemoteCommandMode = async () => { let response; try { - // [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.NAK, 1)); - // - // if (response === ASCII_CONTROL.ENQ) { - // // if we get an enq, send another nak, because we want an eot - // [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.NAK, 1)); - // } - // - // if (response !== ASCII_CONTROL.EOT) { - // throw new Error(`Expected EOT, got ${response.toString(16)}`); - // } - - [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); - - if (response !== ASCII_CONTROL.ENQ) { - throw new Error(`Expected ENQ, got ${response.toString(16)}`); - } - [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.ACK, 1)); // TODO: parse header @@ -368,8 +352,8 @@ module.exports = (config) => { // read data await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); - await bcnCommandResponse(buildCmd(COMMANDS.DATA, 2)); - const dataPacket = await bcnCommandResponse(buildCmdWithParser([0x00, 0x01], 2)); + // await bcnCommandResponse(buildCmd(COMMANDS.DATA, 2)); + const dataPacket = await bcnCommandResponse(buildCmdWithParser([0x4d, 0x7c], 2)); const data = _.split(dataPacket.payload, '|'); console.log('DATA:', data); diff --git a/lib/serialDevice.js b/lib/serialDevice.js index 5eb3153ad9..1172d13ab3 100644 --- a/lib/serialDevice.js +++ b/lib/serialDevice.js @@ -129,6 +129,10 @@ module.exports = function(config) { autoOpen: false, }; + if (deviceInfo.stopBits) { + connectopts.stopBits = deviceInfo.stopBits; + } + function openPort(cb) { if (deviceInfo.path) { debug('Opening port', deviceInfo.path); From 3ff186fbfc0b865241735296dacfffb4b475f8c3 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 3 Mar 2022 16:29:00 +0000 Subject: [PATCH 08/61] first prime records are uploading successfully! --- lib/drivers/i-sens/reliOnConstants.js | 17 +- lib/drivers/i-sens/reliOnPrime.js | 264 +++++++++++++------------- 2 files changed, 134 insertions(+), 147 deletions(-) diff --git a/lib/drivers/i-sens/reliOnConstants.js b/lib/drivers/i-sens/reliOnConstants.js index 9b59ed8116..af7795dfe6 100644 --- a/lib/drivers/i-sens/reliOnConstants.js +++ b/lib/drivers/i-sens/reliOnConstants.js @@ -57,17 +57,12 @@ export const COMMANDS = { WRITE: [0x57, 0x7c], // W| DATE: [0x44, 0x7c], // D| TIME: [0x54, 0x7c], // T| - DATA: [0x45, 0x7c], // E| + DATA: [0x4e, 0x7c], // N| + NROFRECORDS: [0x4d, 0x7c], // M| }; -export const METHODS = { - B: 'whole blood', - P: 'plasma', - C: 'capillary', -}; - -export const MARKS = { - B: 'pre-meal', - A: 'post-meal', - D: 'logbook', +export const FLAGS = { + HI: { value: 0x01, name: 'High measurement result' }, + LO: { value: 0x02, name: 'Low measurement result' }, + CONTROL_SOLUTION: { value: 0x04, name: 'Control Solution Test' }, }; diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js index 5ec202313b..22c87ab053 100644 --- a/lib/drivers/i-sens/reliOnPrime.js +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -18,7 +18,6 @@ /* eslint-disable no-param-reassign */ import _ from 'lodash'; -import async from 'async'; import sundial from 'sundial'; import structJs from '../../struct'; @@ -26,7 +25,7 @@ import annotate from '../../eventAnnotations'; import TZOUtil from '../../TimezoneOffsetUtil'; import common from '../../commonFunctions'; import { - MODELS, ASCII_CONTROL, COMMANDS, METHODS, MARKS, + ASCII_CONTROL, COMMANDS, FLAGS, } from './reliOnConstants'; const isBrowser = typeof window !== 'undefined'; @@ -62,6 +61,14 @@ module.exports = (config) => { return packet; }; + const hasFlag = (flag, v) => { + // eslint-disable-next-line no-bitwise + if (flag.value & v) { + return true; + } + return false; + }; + const bcnPacketHandler = (buffer) => { if (buffer.len() < 1) { // only empty buffer is no valid packet return false; @@ -114,7 +121,7 @@ module.exports = (config) => { parser: (result) => result, }); - const verifyChecksum = (record) => { + const verifyHeaderChecksum = (record) => { const str = record.trim(); const data = str.split(String.fromCharCode(ASCII_CONTROL.ETB)); const check = data[1]; @@ -133,27 +140,40 @@ module.exports = (config) => { return data[0]; }; + const verifyChecksum = (record) => { + const str = record.trim(); + const data = str.split(String.fromCharCode(ASCII_CONTROL.ETB)); + const check = data[1]; + let sum = 0; + const n = record.slice(0, record.length - 2); + + _.map(n, (e) => { + if (e.charCodeAt(0) !== ASCII_CONTROL.STX) { + sum += e.charCodeAt(0); + } + }); + + // eslint-disable-next-line no-bitwise + if ((sum & 0x0F) !== parseInt(check, 16)) { + return null; + } + return data[0]; + }; + const parseHeader = (s) => { const data = s.split('\n').filter((e) => e.length > 1); const header = data.shift(); - if (verifyChecksum(header)) { + if (verifyHeaderChecksum(header)) { data.shift(); // patient not used data.pop(); // remove linefeed const pString = header.split('|'); const pInfo = pString[4].split('^'); const sNum = pInfo[2]; - const records = data.filter((e) => e[2] === 'R'); - const recordAverage = records.shift(); // the first record means the average - const ordRecords = data.filter((e) => e[2] === 'O'); const devInfo = { model: pInfo[0], serialNumber: sNum, - nrecs: records.length, - recordA: recordAverage, - rawrecords: records, - ordRecords, }; return devInfo; @@ -161,64 +181,20 @@ module.exports = (config) => { return null; }; - const parseDataRecord = (str, callback) => { + const parseDataRecord = (str) => { const data = verifyChecksum(str); if (data) { debug('Record:', data); - const result = data.trim().match(/^.*\d+R\|(\d+).*Glucose\|(\d+\.?\d*)\|(\w+\/\w+)\^(\w*)\|\d*\|(>|<|T|>\\T|<\\T|)\|(\w*)\|(\w*)\|{3}(\d{12})$/); - if (result != null) { - return callback(null, result.slice(1, 10)); - } - } - return callback(new Error('Invalid record data')); - }; - const getAnnotations = (annotation, value, units) => { - if (annotation.indexOf('>') !== -1) { - return [{ - code: 'bg/out-of-range', - threshold: units === 'mg/dL' ? value - 1 : _.round(18 * (value - 0.05)), - value: 'high', - }]; - } if (annotation.indexOf('<') !== -1) { - return [{ - code: 'bg/out-of-range', - threshold: units === 'mg/dL' ? value + 1 : _.round(18 * (value + 0.05)), - value: 'low', - }]; - } - return null; - }; + const result = { + value: parseInt(data.slice(2, 4).concat(data.slice(0, 2)), 16), + jsDate: sundial.parseFromFormat(data.slice(4, 14), 'mmHHDDMMYY'), + flags: parseInt(data.slice(14, 16), 16), + }; - const isControl = (markers) => { - if (markers.indexOf('E') !== -1) { - debug('Marking as control test'); - return true; + return result; } - return false; - }; - - const getOneRecord = (record, data, callback) => { - parseDataRecord(record, (err, r) => { - if (err) { - debug('Failure trying to read record', record); - debug(err); - return callback(err, null); - } - const [nrec, glucose, units, referenceMethod, annotations, userMarks, control, timestamp] = r; - const value = units === 'mg/dL' ? parseInt(glucose, 10) : parseFloat(glucose); - const robj = { - timestamp: parseInt(timestamp, 10), - annotations: getAnnotations(annotations, value, units), - control: isControl(control), - units, - glucose: value, - nrec: parseInt(nrec, 10), - referenceMethod: METHODS[referenceMethod], - userMarks: MARKS[userMarks], - }; - return callback(null, robj); - }); + throw new Error('Invalid record data'); }; const listenForPacket = (timeout, callback) => { @@ -274,12 +250,47 @@ module.exports = (config) => { } }); - const getData = async () => { + const getNumberOfRecords = async () => { + await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); + const dataPacket = await bcnCommandResponse(buildCmdWithParser(COMMANDS.NROFRECORDS, 2)); + const data = _.split(dataPacket.payload, '|'); + const nrOfRecords = Number(data[1]); + debug('Number of records:', nrOfRecords); + return nrOfRecords; + }; + + const getOneRecord = async (index) => { + const recNumStr = index.toString().padStart(3, '0'); + const recNum = []; + + for (let i = 0; i < recNumStr.length; i++) { + recNum[i] = recNumStr.charCodeAt(i); + } + + recNum.push(0x7c); // add delimiter "|" + + await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); + await bcnCommandResponse(buildCmd(COMMANDS.DATA, 2)); + const result = await bcnCommandResponse(buildCmdWithParser(recNum, 4)); + + const data = _.split(result.payload, '|')[1]; + + const record = parseDataRecord(data); + record.index = index; + return record; + }; + + const getHeader = async () => { // exit remote command mode - // await bcnCommandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); + await bcnCommandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); const cmd = buildCmdWithParser(ASCII_CONTROL.ACK, 1); - const datatxt = await bcnCommandResponse(cmd); + let datatxt = await bcnCommandResponse(cmd); + + if (datatxt[0] === ASCII_CONTROL.ENQ) { + datatxt = await bcnCommandResponse(cmd); + } + const header = parseHeader(datatxt.payload); if (header) { return header; @@ -291,10 +302,6 @@ module.exports = (config) => { const enterRemoteCommandMode = async () => { let response; try { - [response] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.ACK, 1)); - - // TODO: parse header - [response] = await bcnCommandResponse(buildCmd(0x92, 1)); if (response !== ASCII_CONTROL.EOT) { @@ -343,19 +350,16 @@ module.exports = (config) => { const getDeviceInfo = (cb) => { debug('DEBUG: on getDeviceInfo'); + const info = {}; (async () => { - // await getData(); + info.header = await getHeader(); + debug('Header:', info.header); retries = 0; await enterRemoteCommandMode(); - // read data - await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); - // await bcnCommandResponse(buildCmd(COMMANDS.DATA, 2)); - const dataPacket = await bcnCommandResponse(buildCmdWithParser([0x4d, 0x7c], 2)); - const data = _.split(dataPacket.payload, '|'); - console.log('DATA:', data); + info.nrecs = await getNumberOfRecords(); // read time await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); @@ -376,12 +380,12 @@ module.exports = (config) => { cfg.deviceInfo.annotations = 'wrong-device-time'; retries = 0; await setDateTime(serverTime); - cb(null, await getData()); + cb(null, info); } else { cb(err, null); } } else { - cb(null, await getData()); + cb(null, info); } } catch (error) { cb(error, null); @@ -393,39 +397,50 @@ module.exports = (config) => { }); }; - const processReadings = (readings) => { - _.each(readings, (reading, index) => { - readings[index].jsDate = sundial.parseFromFormat(reading.timestamp, 'YYYYMMDD HHmm'); - readings[index].displayTime = sundial.formatDeviceTime(readings[index].jsDate); - }); - }; - const prepBGData = (progress, data) => { // build missing data.id - data.id = `${data.model}-${data.serialNumber}`; + data.id = `${data.deviceInfo.driverId}-${data.header.serialNumber}`; cfg.builder.setDefaults({ deviceId: data.id }); const dataToPost = []; if (data.bgmReadings.length > 0) { for (let i = 0; i < data.bgmReadings.length; ++i) { const datum = data.bgmReadings[i]; - if (datum.control === true) { + if (hasFlag(FLAGS.CONTROL_SOLUTION, datum.flags)) { debug('Discarding control'); // eslint-disable-next-line no-continue continue; } + + // According to spec, HI > 600 and LO < 20 + let annotation = null; + if (hasFlag(FLAGS.HI, datum.flags)) { + datum.value = 601; + annotation = { + code: 'bg/out-of-range', + value: 'high', + threshold: 600, + }; + } else if (hasFlag(FLAGS.LO, datum.flags)) { + datum.value = 19; + annotation = { + code: 'bg/out-of-range', + value: 'low', + threshold: 20, + }; + } + const smbg = cfg.builder.makeSMBG() - .with_value(datum.glucose) - .with_deviceTime(datum.displayTime) - .with_units(datum.units) - .set('index', datum.nrec); - - if (datum.annotations) { - _.each(datum.annotations, (ann) => { - annotate.annotateEvent(smbg, ann); - }); + .with_value(datum.value) + .with_deviceTime(sundial.formatDeviceTime(datum.jsDate)) + .with_units('mg/dL') // hard-coded + .set('index', datum.index); + + if (annotation) { + annotate.annotateEvent(smbg, annotation); } cfg.tzoUtil.fillInUTCInfo(smbg, datum.jsDate); + delete smbg.index; dataToPost.push(smbg.done()); } } else { @@ -471,12 +486,6 @@ module.exports = (config) => { data.connect = true; _.assign(data, result); _.merge(cfg.deviceInfo, result); - cfg.deviceInfo.model = MODELS[data.model]; - data.deviceModel = cfg.deviceInfo.model; // for metrics - if (cfg.deviceInfo.model == null) { - cfg.deviceInfo.model = 'Unknown Bayer model'; - } - debug('Detected as: ', cfg.deviceInfo.model); cb(null, data); } else { cb(err, result); @@ -486,46 +495,29 @@ module.exports = (config) => { fetchData(progress, data, cb) { debug('in fetchData', data); - - function getOneRecordWithProgress(recnum, callback) { - const rec = data.rawrecords.shift(); - progress((100.0 * recnum) / data.nrecs); - setTimeout(() => { - getOneRecord(rec, data, callback); - }, 20); - } - - async.timesSeries(data.nrecs, getOneRecordWithProgress, (err, result) => { - if (err) { - debug('fetchData failed'); - debug(err); - debug(result); - } else { - debug('fetchData', result); + const results = []; + + (async () => { + for (let i = data.nrecs - 1; i >= 0; i--) { + // eslint-disable-next-line no-await-in-loop + const result = await getOneRecord(i); + results.push(result); + progress((100.0 * i) / data.nrecs); } + debug('fetchData', results); data.fetchData = true; - data.bgmReadings = result; + data.bgmReadings = results; progress(100); - cb(err, data); + cb(null, data); + })().catch((error) => { + debug('Error in fetchData: ', error); + cb(error, null); }); }, processData(progress, data, cb) { progress(0); - data.bg_data = processReadings(data.bgmReadings); data.post_records = prepBGData(progress, data); - const ids = {}; - for (let i = 0; i < data.post_records.length; ++i) { - delete data.post_records[i].index; - const id = `${data.post_records[i].time}|${data.post_records[i].deviceId}`; - if (ids[id]) { - debug('duplicate! %s @ %d == %d', id, i, ids[id] - 1); - debug(data.post_records[ids[id] - 1]); - debug(data.post_records[i]); - } else { - ids[id] = i + 1; - } - } progress(100); data.processData = true; cb(null, data); @@ -536,8 +528,8 @@ module.exports = (config) => { const sessionInfo = { deviceTags: cfg.deviceInfo.tags, deviceManufacturers: cfg.deviceInfo.manufacturers, - deviceModel: cfg.deviceInfo.model, - deviceSerialNumber: cfg.deviceInfo.serialNumber, + deviceModel: data.header.model, + deviceSerialNumber: data.header.serialNumber, deviceId: data.id, start: sundial.utcDateString(), timeProcessing: cfg.tzoUtil.type, From 7373ff01999d9415367e9e924974fee84b4cd4c9 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 8 Mar 2022 16:17:56 +0000 Subject: [PATCH 09/61] fix data checksum; some cleanup --- lib/drivers/i-sens/reliOnConstants.js | 26 +------- lib/drivers/i-sens/reliOnPrime.js | 87 +++++++++++++++++---------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/lib/drivers/i-sens/reliOnConstants.js b/lib/drivers/i-sens/reliOnConstants.js index af7795dfe6..27acdce0c5 100644 --- a/lib/drivers/i-sens/reliOnConstants.js +++ b/lib/drivers/i-sens/reliOnConstants.js @@ -1,6 +1,6 @@ /* * == BSD2 LICENSE == - * Copyright (c) 2020, Tidepool Project + * Copyright (c) 2021, Tidepool Project * * This program is free software; you can redistribute it and/or modify it under * the terms of the associated License, which is identical to the BSD 2-Clause @@ -28,30 +28,6 @@ export const ASCII_CONTROL = { CAN: 0x18, }; -export const MODELS = { - Bayer6200: 'Contour Next Link', // mg/dL - Contour6200: 'Contour Next Link', // mg/dL - Bayer6210: 'Contour Next Link 2.4', // mg/dL - Contour6210: 'Contour Next Link 2.4', // mg/dL - Bayer6300: 'Contour Next Link', // mmol/L - Contour6300: 'Contour Next Link', // mmol/L - Bayer7350: 'Contour Next', // mg/dL & mmol/L - Contour7350: 'Contour Next', // mg/dL & mmol/L - Bayer7390: 'Contour USB', // mg/dL - Contour7390: 'Contour USB', // mg/dL - Bayer7410: 'Contour Next USB', // mg/dL & mmol/L - Contour7410: 'Contour Next USB', // mg/dL & mmol/L - Contour7800: 'Contour Next One', // mg/dL & mmol/L - Bayer7150: 'Contour', - Contour7150: 'Contour', - Bayer7160: 'Contour Next EZ', - Contour7160: 'Contour Next EZ', - Bayer7220: 'Contour', - Contour7220: 'Contour', - Contour7600: 'Contour Plus', - Contour7900: 'Contour Next', -}; - export const COMMANDS = { READ: [0x52, 0x7c], // R| WRITE: [0x57, 0x7c], // W| diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js index 22c87ab053..52dd3bea2c 100644 --- a/lib/drivers/i-sens/reliOnPrime.js +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -1,6 +1,6 @@ /* * == BSD2 LICENSE == - * Copyright (c) 2020, Tidepool Project + * Copyright (c) 2021, Tidepool Project * * This program is free software; you can redistribute it and/or modify it under * the terms of the associated License, which is identical to the BSD 2-Clause @@ -42,11 +42,11 @@ module.exports = (config) => { cfg.tzoUtil = new TZOUtil(cfg.timezone, new Date().toISOString(), []); _.assign(cfg.deviceInfo, { tags: ['bgm'], - manufacturers: ['Bayer'], + manufacturers: ['Arkray'], }); const extractPacket = (bytes) => { - // all packets passed the bcnPacketHandler validation are valid, the checksum is verified later + // all packets passed the packetHandler validation are valid, the checksum is verified later const packet = { bytes, valid: false, @@ -69,7 +69,7 @@ module.exports = (config) => { return false; }; - const bcnPacketHandler = (buffer) => { + const packetHandler = (buffer) => { if (buffer.len() < 1) { // only empty buffer is no valid packet return false; } @@ -94,8 +94,7 @@ module.exports = (config) => { if (cmdlength === 1) { struct.storeByte(command, bytes, 0); } else { - const ctr = struct.copyBytes(bytes, 0, command, cmdlength); - struct.storeByte(0x0D, bytes, ctr); // add carriage return + struct.copyBytes(bytes, 0, command, cmdlength); } debug('Sending byte(s):', common.bytes2hex(bytes)); return buf; @@ -145,7 +144,7 @@ module.exports = (config) => { const data = str.split(String.fromCharCode(ASCII_CONTROL.ETB)); const check = data[1]; let sum = 0; - const n = record.slice(0, record.length - 2); + const n = `D|${record.slice(0, record.length - 2)}`; _.map(n, (e) => { if (e.charCodeAt(0) !== ASCII_CONTROL.STX) { @@ -154,7 +153,7 @@ module.exports = (config) => { }); // eslint-disable-next-line no-bitwise - if ((sum & 0x0F) !== parseInt(check, 16)) { + if ((sum & 0xFF) !== parseInt(check, 16)) { return null; } return data[0]; @@ -222,6 +221,7 @@ module.exports = (config) => { if (bytes[0] === ASCII_CONTROL.EOT || bytes[0] === ASCII_CONTROL.ACK || bytes[0] === ASCII_CONTROL.ENQ + || bytes[0] === ASCII_CONTROL.NAK || _.endsWith(raw, [ASCII_CONTROL.CR, ASCII_CONTROL.LF]) || _.endsWith(raw, ASCII_CONTROL.ACK)) { clearTimeout(abortTimer); @@ -232,7 +232,7 @@ module.exports = (config) => { }, 20); }; - const bcnCommandResponse = async (commandpacket) => new Promise((resolve, reject) => { + const commandResponse = async (commandpacket) => new Promise((resolve, reject) => { try { serialDevice.writeSerial(commandpacket.packet, () => { listenForPacket(5000, (err, result) => { @@ -251,8 +251,8 @@ module.exports = (config) => { }); const getNumberOfRecords = async () => { - await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); - const dataPacket = await bcnCommandResponse(buildCmdWithParser(COMMANDS.NROFRECORDS, 2)); + await commandResponse(buildCmd(COMMANDS.READ, 2)); + const dataPacket = await commandResponse(buildCmdWithParser(COMMANDS.NROFRECORDS, 2)); const data = _.split(dataPacket.payload, '|'); const nrOfRecords = Number(data[1]); debug('Number of records:', nrOfRecords); @@ -269,12 +269,17 @@ module.exports = (config) => { recNum.push(0x7c); // add delimiter "|" - await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); - await bcnCommandResponse(buildCmd(COMMANDS.DATA, 2)); - const result = await bcnCommandResponse(buildCmdWithParser(recNum, 4)); + await commandResponse(buildCmd(COMMANDS.READ, 2)); + await commandResponse(buildCmd(COMMANDS.DATA, 2)); + const result = await commandResponse(buildCmdWithParser(recNum, 4)); const data = _.split(result.payload, '|')[1]; + if (result[0] === ASCII_CONTROL.NAK) { + debug('Requested result not available, moving on to the next result..'); + return null; + } + const record = parseDataRecord(data); record.index = index; return record; @@ -282,13 +287,13 @@ module.exports = (config) => { const getHeader = async () => { // exit remote command mode - await bcnCommandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); + await commandResponse(buildCmd(ASCII_CONTROL.EOT, 1)); const cmd = buildCmdWithParser(ASCII_CONTROL.ACK, 1); - let datatxt = await bcnCommandResponse(cmd); + let datatxt = await commandResponse(cmd); if (datatxt[0] === ASCII_CONTROL.ENQ) { - datatxt = await bcnCommandResponse(cmd); + datatxt = await commandResponse(cmd); } const header = parseHeader(datatxt.payload); @@ -299,16 +304,30 @@ module.exports = (config) => { throw (new Error('Invalid header data')); }; + const enterActionReceptionMode = async () => { + let [response] = await commandResponse(buildCmd(ASCII_CONTROL.ACK, 1)); + + await commandResponse(buildCmd(ASCII_CONTROL.ACK, 1)); + + response = await commandResponse(buildCmd(0x92, 1)); + + if (response.length > 1) { + await commandResponse(buildCmd(0x92, 1)); + } + + await commandResponse(buildCmd(ASCII_CONTROL.ENQ, 1)); + }; + const enterRemoteCommandMode = async () => { let response; try { - [response] = await bcnCommandResponse(buildCmd(0x92, 1)); + [response] = await commandResponse(buildCmd(0x92, 1)); if (response !== ASCII_CONTROL.EOT) { throw new Error(`Expected EOT, got ${response.toString(16)}`); } - const [ack] = await bcnCommandResponse(buildCmd(ASCII_CONTROL.ENQ, 1)); + const [ack] = await commandResponse(buildCmd(ASCII_CONTROL.ENQ, 1)); if (ack !== ASCII_CONTROL.ACK) { throw new Error(`Expected ACK, got ${ack.toString(16)}`); } @@ -325,9 +344,9 @@ module.exports = (config) => { const setDateTime = async (serverTime) => { const newDate = []; struct.storeString(sundial.formatInTimezone(serverTime, cfg.timezone, 'YYMMDD|').concat('\r'), newDate, 0); - const [ack1] = await bcnCommandResponse(buildCmd(COMMANDS.WRITE, 2)); - const [ack2] = await bcnCommandResponse(buildCmd(COMMANDS.DATE, 2)); - const [ack3] = await bcnCommandResponse(buildCmd(newDate, 8)); + const [ack1] = await commandResponse(buildCmd(COMMANDS.WRITE, 2)); + const [ack2] = await commandResponse(buildCmd(COMMANDS.DATE, 2)); + const [ack3] = await commandResponse(buildCmd(newDate, 8)); if (ack1 !== ASCII_CONTROL.ACK || ack2 !== ASCII_CONTROL.ACK || ack3 !== ASCII_CONTROL.ACK) { if (retries === 0) { debug('Could not set date on meter, retrying..'); @@ -340,9 +359,9 @@ module.exports = (config) => { const newTime = []; struct.storeString(sundial.formatInTimezone(serverTime, cfg.timezone, 'HHmm|').concat('\r'), newTime, 0); - const [ack4] = await bcnCommandResponse(buildCmd(COMMANDS.WRITE, 2)); - const [ack5] = await bcnCommandResponse(buildCmd(COMMANDS.TIME, 2)); - const [ack6] = await bcnCommandResponse(buildCmd(newTime, 6)); + const [ack4] = await commandResponse(buildCmd(COMMANDS.WRITE, 2)); + const [ack5] = await commandResponse(buildCmd(COMMANDS.TIME, 2)); + const [ack6] = await commandResponse(buildCmd(newTime, 6)); if (ack4 !== ASCII_CONTROL.ACK || ack5 !== ASCII_CONTROL.ACK || ack6 !== ASCII_CONTROL.ACK) { throw new Error('Could not set time on meter'); } @@ -362,13 +381,13 @@ module.exports = (config) => { info.nrecs = await getNumberOfRecords(); // read time - await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); - const timePacket = await bcnCommandResponse(buildCmdWithParser(COMMANDS.TIME, 2)); + await commandResponse(buildCmd(COMMANDS.READ, 2)); + const timePacket = await commandResponse(buildCmdWithParser(COMMANDS.TIME, 2)); const [, time] = _.split(timePacket.payload, '|'); // read date - await bcnCommandResponse(buildCmd(COMMANDS.READ, 2)); - const datePacket = await bcnCommandResponse(buildCmdWithParser(COMMANDS.DATE, 2)); + await commandResponse(buildCmd(COMMANDS.READ, 2)); + const datePacket = await commandResponse(buildCmdWithParser(COMMANDS.DATE, 2)); const [, date] = _.split(datePacket.payload, '|'); cfg.deviceInfo.deviceTime = sundial.parseFromFormat(date.concat(' ', time), 'YYMMDD HHmm'); @@ -465,7 +484,7 @@ module.exports = (config) => { connect(progress, data, cb) { debug('in connect!'); - cfg.deviceComms.connect(data.deviceInfo, bcnPacketHandler, (err) => { + cfg.deviceComms.connect(data.deviceInfo, packetHandler, (err) => { if (err) { return cb(err); } @@ -501,7 +520,13 @@ module.exports = (config) => { for (let i = data.nrecs - 1; i >= 0; i--) { // eslint-disable-next-line no-await-in-loop const result = await getOneRecord(i); - results.push(result); + if (result === null) { + // we got a NAK, so have to re-enter command mode + // eslint-disable-next-line no-await-in-loop + await enterActionReceptionMode(); + } else { + results.push(result); + } progress((100.0 * i) / data.nrecs); } debug('fetchData', results); From 3cab2e110969e4cfafe03c9b6a9e403c1226a7d2 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 10 Mar 2022 13:26:25 +0000 Subject: [PATCH 10/61] successfully downloading more than 10 records --- lib/drivers/i-sens/reliOnPrime.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js index 52dd3bea2c..e799a4e742 100644 --- a/lib/drivers/i-sens/reliOnPrime.js +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -260,7 +260,7 @@ module.exports = (config) => { }; const getOneRecord = async (index) => { - const recNumStr = index.toString().padStart(3, '0'); + const recNumStr = index.toString(16).toUpperCase().padStart(3, '0'); const recNum = []; for (let i = 0; i < recNumStr.length; i++) { @@ -527,7 +527,7 @@ module.exports = (config) => { } else { results.push(result); } - progress((100.0 * i) / data.nrecs); + progress((100.0 * (data.nrecs - i)) / data.nrecs); } debug('fetchData', results); data.fetchData = true; From 225e80ed65c2ad0946ea7e067155670c9728e27d Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 10 Mar 2022 13:38:48 +0000 Subject: [PATCH 11/61] add FTDI cable for Prime meter; add checklist --- docs/checklists/reliOnPrime.md | 39 ++++++++++++++++++++++++++++++++++ lib/core/device.js | 1 + 2 files changed, 40 insertions(+) create mode 100644 docs/checklists/reliOnPrime.md diff --git a/docs/checklists/reliOnPrime.md b/docs/checklists/reliOnPrime.md new file mode 100644 index 0000000000..1dde101c4d --- /dev/null +++ b/docs/checklists/reliOnPrime.md @@ -0,0 +1,39 @@ +## Checklist for ReliOn Prime meter + +(Key: + + - `[x]` available in data protocol/documented in spec and implemented + - `[-]` available in data protocol/documented in spec but *not* yet implemented + - `[?]` unknown whether available in data protocol/documented in spec; *not* yet implemented + - `*[ ]` TODO: needs implementation! + - `[ ]` unavailable in data protocol and/or not documented in spec and not yet implemented) + +### Required if Present + +- `[x]` smbg values +- `[ ]` units of smbg values (read from device, not hard-coded) +- `[x]` out-of-range values (LO or HI) +- `[ ]` out-of-range value thresholds (e.g., often 20 for low and 600 for high on BGMs) +- `[ ]` date & time settings changes +- `[ ]` blood ketone values +- `[ ]` units of blood ketone values (read from device, not hard-coded) +- `[ ]` ketone out-of-range values +- `[ ]` ketone out-of-range value thresholds +- `[x]` use `common.checkDeviceTime(currentDeviceTime, timezone, cb)` to check against server time + +### No Tidepool Data Model Yet + +- `[-]` control (solution) tests (whether marked in UI or auto-detected) - until we have a data model, these should be discarded +- `[ ]` device settings, other than date & time (e.g., target blood glucose range) +- `[ ]` tag/note (e.g., pre- vs. post-meal) + +### Tidepool ingestion API + +Choose one of the following: + + - `[ ]` legacy "jellyfish" ingestion API + - `[x]` platform ingestion API + +### Known implementation issues/TODOs + +*Use this space to describe device-specific known issues or implementation TODOs **not** contained in the above datatype-specific sections.* diff --git a/lib/core/device.js b/lib/core/device.js index a3899958ce..3c55a61227 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -313,6 +313,7 @@ device.driverManifests = { stopBits: 2, usb: [ { vendorId: 3835, productId: 17 }, // ReliOn Prime + { vendorId: 1027, productId: 24577 }, // FTDI cable ], }, GlucocardShine: { From ce3f41390c8ada69afa92e3ffbfddbf5da29178e Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 10 Mar 2022 13:54:38 +0000 Subject: [PATCH 12/61] revert changes to contour driver --- lib/drivers/bayer/bayerContour.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/drivers/bayer/bayerContour.js b/lib/drivers/bayer/bayerContour.js index 8e4f0c5a86..75f674752d 100644 --- a/lib/drivers/bayer/bayerContour.js +++ b/lib/drivers/bayer/bayerContour.js @@ -251,9 +251,9 @@ module.exports = (config) => { }); } - if (bytes[0] === ASCII_CONTROL.EOT - || bytes[0] === ASCII_CONTROL.ACK - || bytes[0] === ASCII_CONTROL.ENQ) { + if (bytes.includes(ASCII_CONTROL.EOT) + || bytes.includes(ASCII_CONTROL.ACK) + || bytes.includes(ASCII_CONTROL.ENQ)) { clearTimeout(abortTimer); clearInterval(listenTimer); callback(null, raw); From 7c82dc11f9b17d7da70428cd5b6a1b35372718ff Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 10 Mar 2022 14:10:38 +0000 Subject: [PATCH 13/61] add support for Glucocard Vital meter --- app/reducers/devices.js | 7 +++++++ lib/core/device.js | 13 ++++++++++++- locales/en/translation.missing.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 984678c7c8..7c9d2f4768 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -119,6 +119,13 @@ const devices = { source: {type: 'device', driverId: 'GlucocardShineHID'}, enabled: {mac: true, win: true, linux: true} }, + glucocardvital: { + instructions: i18n.t('Make sure the meter is switched off and plug in with micro-USB cable'), + name: 'GLUCOCARD Vital', + key: 'glucocardvital', + source: {type: 'device', driverId: 'GlucocardVital'}, + enabled: {mac: true, win: true, linux: true} + }, omnipod: { instructions: [i18n.t('Classic PDM: Plug into USB. Wait for Export to complete. Click Upload.'), i18n.t('DASH PDM: Unlock. Plug into USB. Tap Export on PDM. Click Upload.')], key: 'omnipod', diff --git a/lib/core/device.js b/lib/core/device.js index 34bd74b0bf..2a9f616d59 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -99,6 +99,7 @@ device.deviceDrivers = { GlucocardExpression: glucocardExpression, GlucocardShine: careSensDriver, GlucocardShineHID: careSensDriver, + GlucocardVital: reliOnPrime, AbbottLibreView: libreViewDriver, }; @@ -130,6 +131,7 @@ device.deviceComms = { GlucocardExpression: serialDevice, GlucocardShine: serialDevice, GlucocardShineHID: hidDevice, + GlucocardVital: serialDevice, AbbottLibreView: libreViewDriver, }; @@ -312,7 +314,7 @@ device.driverManifests = { bitrate: 19200, stopBits: 2, usb: [ - { vendorId: 3835, productId: 17 }, // ReliOn Prime + { vendorId: 3835, productId: 17 }, // Arkray cable { vendorId: 1027, productId: 24577 }, // FTDI cable ], }, @@ -335,6 +337,15 @@ device.driverManifests = { { vendorId: 1155, productId: 41355 }, // Shine Connex & Express ], }, + GlucocardVital: { + mode: 'serial', + bitrate: 19200, + stopBits: 2, + usb: [ + { vendorId: 3835, productId: 17 }, // Arkray cable + { vendorId: 1027, productId: 24577 }, // FTDI cable + ], + }, AbbottLibreView: { mode: 'block', }, diff --git a/locales/en/translation.missing.json b/locales/en/translation.missing.json index c36db08513..575a22625d 100644 --- a/locales/en/translation.missing.json +++ b/locales/en/translation.missing.json @@ -11,4 +11,4 @@ "Uploading Libre 2 data?": "Uploading Libre 2 data?", "We couldn't log you in. Try again in a few minutes.": "We couldn't log you in. Try again in a few minutes.", "Please set your LibreView date format to Year-Month-Day and export the CSV again": "Please set your LibreView date format to Year-Month-Day and export the CSV again" -} +} \ No newline at end of file From c4d9ff0c6db761e9eea4694ec2bb0b1972f9a3da Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 10 Mar 2022 14:57:50 +0000 Subject: [PATCH 14/61] fix instructions for upload --- app/reducers/devices.js | 4 ++-- lib/drivers/i-sens/reliOnPrime.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 7c9d2f4768..e15e9a8f8d 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -120,7 +120,7 @@ const devices = { enabled: {mac: true, win: true, linux: true} }, glucocardvital: { - instructions: i18n.t('Make sure the meter is switched off and plug in with micro-USB cable'), + instructions: i18n.t('Make sure the meter is switched off and plug in cable'), name: 'GLUCOCARD Vital', key: 'glucocardvital', source: {type: 'device', driverId: 'GlucocardVital'}, @@ -210,7 +210,7 @@ const devices = { enabled: {mac: true, win: true, linux: true} }, relionprime: { - instructions: 'Plug in meter with cable and make sure the meter is switched on', + instructions: 'Make sure the meter is switched off and plug in with cable', name: 'ReliOn Prime', key: 'relionprime', source: {type: 'device', driverId: 'ReliOnPrime'}, diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js index e799a4e742..ad0fffc204 100644 --- a/lib/drivers/i-sens/reliOnPrime.js +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -30,7 +30,7 @@ import { const isBrowser = typeof window !== 'undefined'; // eslint-disable-next-line no-console -const debug = isBrowser ? require('bows')('BCDriver') : console.log; +const debug = isBrowser ? require('bows')('ReliOnPrime') : console.log; const struct = structJs(); From b4fe0766c8b37926bfccfc0b0bbd1c0eced226a5 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 15 Mar 2022 10:25:21 +0000 Subject: [PATCH 15/61] wrap with i18n.t(), change phrasing --- app/reducers/devices.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/reducers/devices.js b/app/reducers/devices.js index e15e9a8f8d..3219707fa5 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -210,7 +210,7 @@ const devices = { enabled: {mac: true, win: true, linux: true} }, relionprime: { - instructions: 'Make sure the meter is switched off and plug in with cable', + instructions: i18n.t('Make sure meter is switched off before plugging in cable'), name: 'ReliOn Prime', key: 'relionprime', source: {type: 'device', driverId: 'ReliOnPrime'}, From a94057aa6087fbb2c5212b4ce12c5bc27c89996d Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 15 Mar 2022 10:26:10 +0000 Subject: [PATCH 16/61] v2.44.0-relion-prime.1 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 1ddfd3b5f1..e83ee2e7f3 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.44.0", + "version": "2.44.0-relion-prime.1", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 021a3ded42..e4dc8df38e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.44.0", + "version": "2.44.0-relion-prime.1", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 1c2e19c97989f7781a5b6b28aa0b4aa83178e277 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 16 Jun 2022 11:14:43 +0100 Subject: [PATCH 17/61] fix ACK check and flush extra ACKs --- lib/drivers/i-sens/reliOnPrime.js | 8 +++++++- locales/en/translation.missing.json | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/drivers/i-sens/reliOnPrime.js b/lib/drivers/i-sens/reliOnPrime.js index ad0fffc204..eed0c30314 100644 --- a/lib/drivers/i-sens/reliOnPrime.js +++ b/lib/drivers/i-sens/reliOnPrime.js @@ -223,9 +223,15 @@ module.exports = (config) => { || bytes[0] === ASCII_CONTROL.ENQ || bytes[0] === ASCII_CONTROL.NAK || _.endsWith(raw, [ASCII_CONTROL.CR, ASCII_CONTROL.LF]) - || _.endsWith(raw, ASCII_CONTROL.ACK)) { + || raw[raw.length - 1] === ASCII_CONTROL.ACK) { clearTimeout(abortTimer); clearInterval(listenTimer); + + if (serialDevice.hasAvailablePacket()) { + // flushing leftover bytes + debug('Flushing:', common.bytes2hex(serialDevice.nextPacket().bytes)); + } + callback(null, raw); } } diff --git a/locales/en/translation.missing.json b/locales/en/translation.missing.json index 575a22625d..d4b71f7eac 100644 --- a/locales/en/translation.missing.json +++ b/locales/en/translation.missing.json @@ -10,5 +10,7 @@ "We found more than one device plugged in. Only plug in the device you intend to upload.": "We found more than one device plugged in. Only plug in the device you intend to upload.", "Uploading Libre 2 data?": "Uploading Libre 2 data?", "We couldn't log you in. Try again in a few minutes.": "We couldn't log you in. Try again in a few minutes.", - "Please set your LibreView date format to Year-Month-Day and export the CSV again": "Please set your LibreView date format to Year-Month-Day and export the CSV again" + "Please set your LibreView date format to Year-Month-Day and export the CSV again": "Please set your LibreView date format to Year-Month-Day and export the CSV again", + "Make sure the meter is switched off and plug in cable": "Make sure the meter is switched off and plug in cable", + "Make sure meter is switched off before plugging in cable": "Make sure meter is switched off before plugging in cable" } \ No newline at end of file From 34f1f2fc719142c1546254eaec74878d4e554a31 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 27 Jun 2022 16:10:00 +0100 Subject: [PATCH 18/61] update cp2102 userspace driver and use for prime and vital --- lib/core/device.js | 5 +++-- locales/en/translation.missing.json | 35 +++++------------------------ package.json | 2 +- yarn.lock | 12 +++++----- 4 files changed, 15 insertions(+), 39 deletions(-) diff --git a/lib/core/device.js b/lib/core/device.js index 0526404dac..40b2009409 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -323,7 +323,7 @@ device.driverManifests = { bitrate: 19200, stopBits: 2, usb: [ - { vendorId: 3835, productId: 17 }, // Arkray cable + { vendorId: 3835, productId: 17, driver: 'cp2102' }, // Arkray cable { vendorId: 1027, productId: 24577 }, // FTDI cable ], }, @@ -351,7 +351,7 @@ device.driverManifests = { bitrate: 19200, stopBits: 2, usb: [ - { vendorId: 3835, productId: 17 }, // Arkray cable + { vendorId: 3835, productId: 17, driver: 'cp2102' }, // Arkray cable { vendorId: 1027, productId: 24577 }, // FTDI cable ], }, @@ -487,6 +487,7 @@ device.findUsbDevice = (driverId, usbDevices) => { productId: result.productId, userSpaceDriver, bitrate: driverManifest.bitrate, + stopBits: driverManifest.stopBits, })); if (devices.length > 1) { diff --git a/locales/en/translation.missing.json b/locales/en/translation.missing.json index cbb5b88843..7ab9a88b53 100644 --- a/locales/en/translation.missing.json +++ b/locales/en/translation.missing.json @@ -1,35 +1,10 @@ { - "Plug in PDA with micro-USB": "Plug in PDA with micro-USB", + "Select CSV file downloaded from LibreView": "Select CSV file downloaded from LibreView", "Plug in meter with cable and set meter to": "Plug in meter with cable and set meter to", "PC Link Mode": "PC Link Mode", "Make sure the meter is switched off and plug in with micro-USB cable": "Make sure the meter is switched off and plug in with micro-USB cable", - "We couldn't log you in. Try again in a few minutes.": "We couldn't log you in. Try again in a few minutes.", - "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.": "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.", - "Sorry, we don't support the Libre 2 yet": "Sorry, we don't support the Libre 2 yet", - "Please correct the date/time on the linked pump.": "Please correct the date/time on the linked pump.", - "Turn meter on and make sure Bluetooth is switched on": "Turn meter on and make sure Bluetooth is switched on", - "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.": "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only." - "Select CSV file downloaded from LibreView": "Select CSV file downloaded from LibreView", - "Preparing file": "Preparing file", - "We couldn't communicate with the meter. You may need to give Uploader": "We couldn't communicate with the meter. You may need to give Uploader", - "Couldn't connect to device.": "Couldn't connect to device.", - "Clinic Workspace": "Clinic Workspace", - "To manage your clinic workspaces and view patient invites": "To manage your clinic workspaces and view patient invites", - "login to your account in Tidepool Web": "login to your account in Tidepool Web", - "Want to use Tidepool for your private data?": "Want to use Tidepool for your private data?", - "Go to Private Workspace": "Go to Private Workspace", - "Go to Workspace": "Go to Workspace", - "clinic": "clinic", - "Can’t find a patient you are looking for?": "Can’t find a patient you are looking for?", - "Change Workspace": "Change Workspace", - "To manage {{workspace}} workspace and view patient invites, go to": "To manage {{workspace}} workspace and view patient invites, go to", - "Tidepool Web": "Tidepool Web", - "Something went wrong while creating patient account.": "Something went wrong while creating patient account.", - "Email address is already associated with another account.": "Email address is already associated with another account.", - "Private Workspace": "Private Workspace" - "Uploading Libre 2 data?": "Uploading Libre 2 data?", - "We couldn't log you in. Try again in a few minutes.": "We couldn't log you in. Try again in a few minutes.", - "Please set your LibreView date format to Year-Month-Day and export the CSV again": "Please set your LibreView date format to Year-Month-Day and export the CSV again", "Make sure the meter is switched off and plug in cable": "Make sure the meter is switched off and plug in cable", - "Make sure meter is switched off before plugging in cable": "Make sure meter is switched off before plugging in cable" -} + "Turn meter on and make sure Bluetooth is switched on": "Turn meter on and make sure Bluetooth is switched on", + "Make sure meter is switched off before plugging in cable": "Make sure meter is switched off before plugging in cable", + "Plug in PDA with micro-USB": "Plug in PDA with micro-USB" +} \ No newline at end of file diff --git a/package.json b/package.json index 4c3ac8bffc..5453abfafe 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "commander": "4.1.1", "connected-react-router": "6.8.0", "core-js": "2.6.11", - "cp2102": "0.0.3", + "cp2102": "0.0.6", "electron-debug": "3.1.0", "electron-is-dev": "1.2.0", "electron-log": "4.3.0", diff --git a/yarn.lock b/yarn.lock index 24e506c005..36a94fcb1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4144,12 +4144,12 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cp2102@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/cp2102/-/cp2102-0.0.3.tgz#eaa5cf23362fabefe7ea649abb0d898a163cee28" - integrity sha512-B8JbUpFwmdFj3BPVPsjTiFVLXi8+DiI2TAou3OOBOZV+ancOvrCkaXZLUcHiInJhlQ4y8ORi/Bekp1aPhFvVlw== +cp2102@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/cp2102/-/cp2102-0.0.6.tgz#acde78c1148d3badbdf83412620c69cc931cfc51" + integrity sha512-C9mqA6gxZSOVWQp6nfTy/AcvTRIg3JRTCwU9NabRRZ7ypsrRmlyT0Jo8Rvw8LEclu+zr0eyJKNvBTksrH7nkNg== dependencies: - usb "1.6.0" + usb "1.6.3" crc32-stream@^2.0.0: version "2.0.0" @@ -14668,7 +14668,7 @@ usb@1.6.0: nan "2.13.2" prebuild-install "^5.2.4" -usb@^1.3.1, usb@^1.6.0: +usb@1.6.3, usb@^1.3.1, usb@^1.6.0: version "1.6.3" resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.3.tgz#c0bc14994e8f9cb16f9602ec0dbadaa57cb919f5" integrity sha512-23KYMjaWydACd8wgGKMQ4MNwFspAT6Xeim4/9Onqe5Rz/nMb4TM/WHL+qPT0KNFxzNKzAs63n1xQWGEtgaQ2uw== From 75d165e5f523f34c17a42b63797667edd236dd5e Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 27 Jun 2022 16:12:03 +0100 Subject: [PATCH 19/61] v2.45.1-relion-prime.3 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index f32b1c683e..f66f41fb94 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.45.1-relion-prime.2", + "version": "2.45.1-relion-prime.3", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 5453abfafe..7b851afe4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.45.1-relion-prime.2", + "version": "2.45.1-relion-prime.3", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From cbf766d031c4f5f294b3086fa0aaed9f947a10ed Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 28 Jun 2022 10:13:37 +0100 Subject: [PATCH 20/61] add usb drivers for accu-chek instant and arkray cable --- resources/win/phdc.inf | 3 +++ resources/win/tidepoolvcp.inf | 2 ++ 2 files changed, 5 insertions(+) diff --git a/resources/win/phdc.inf b/resources/win/phdc.inf index 2c2ae26b0d..ceb638da95 100644 --- a/resources/win/phdc.inf +++ b/resources/win/phdc.inf @@ -32,11 +32,13 @@ HKR,,Security,,"D:(D;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA %USB\ACGuide.DeviceDesc% = USB_Install, USB\VID_173A&PID_21D5 %USB\AvivaConnect.DeviceDesc% = USB_Install, USB\VID_173A&PID_21CF %USB\ACGuideMe.DeviceDesc% = USB_Install, USB\VID_173A&PID_21D6 +%USB\ACInstant.DeviceDesc% = USB_Install, USB\VID_173A&PID_21D7 [PHDC_Device_WinUSB.NTamd64] %USB\ACGuide.DeviceDesc% = USB_Install, USB\VID_173A&PID_21D5 %USB\AvivaConnect.DeviceDesc% = USB_Install, USB\VID_173A&PID_21CF %USB\ACGuideMe.DeviceDesc% = USB_Install, USB\VID_173A&PID_21D6 +%USB\ACInstant.DeviceDesc% = USB_Install, USB\VID_173A&PID_21D7 ; =================== Installation =================== @@ -110,6 +112,7 @@ Manufacturer="Roche" USB\ACGuide.DeviceDesc="ACCU-CHEK Guide" USB\AvivaConnect.DeviceDesc="ACCU-CHEK Aviva Connect" USB\ACGuideMe.DeviceDesc="ACCU-CHEK Guide Me" +USB\ACInstant.DeviceDesc="ACCU-CHEK Instant" WinUSB_SvcDesc="WinUSB Service" DISK_NAME="PHDC Driver Install Disk" ClassName="PHDC" diff --git a/resources/win/tidepoolvcp.inf b/resources/win/tidepoolvcp.inf index 49c031bc8a..a144b67866 100644 --- a/resources/win/tidepoolvcp.inf +++ b/resources/win/tidepoolvcp.inf @@ -80,6 +80,7 @@ CatalogFile=tidepoolvcp.cat %PID_3420.DeviceDesc%=TI.Uni,USB\VID_1A61&PID_3420 ; Abbott Strip Port USB Data Cable %VID_067B&PID_2303.DeviceDesc% = ComPort.NTx86, USB\VID_067B&PID_2303 ; Prolific PL2303 %VID_067B&PID_2304.DeviceDesc% = ComPort.NTx86, USB\VID_067B&PID_2304 ; Prolific PL2304 +%USB\VID_0EFB&PID_0011.DeviceDesc%=silabser.NTx86, USB\VID_0EFB&PID_0011 ; Arkray cable [Tidepool.NTamd64] %USB\VID_10C4&PID_85A7.DeviceDesc%=silabser.NTamd64, USB\VID_10C4&PID_85A7 @@ -97,6 +98,7 @@ CatalogFile=tidepoolvcp.cat %PID_3420.DeviceDesc%=TI.Uni,USB\VID_1A61&PID_3420 ; Abbott Strip Port USB Data Cable %VID_067B&PID_2303.DeviceDesc% = ComPort.NTamd64, USB\VID_067B&PID_2303 ; Prolific PL2303 %VID_067B&PID_2304.DeviceDesc% = ComPort.NTamd64, USB\VID_067B&PID_2304 ; Prolific PL2304 +%USB\VID_0EFB&PID_0011.DeviceDesc%=silabser.NTx86, USB\VID_0EFB&PID_0011 ; Arkray cable [FtdiPort.NT.AddService] DisplayName = %SvcDesc% From 5fe5b85fca6e41efe846130a5c3b99c48af0ccc0 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 28 Jun 2022 10:27:42 +0100 Subject: [PATCH 21/61] add string description for new SL driver --- resources/win/tidepoolvcp.inf | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/win/tidepoolvcp.inf b/resources/win/tidepoolvcp.inf index a144b67866..26656efdf4 100644 --- a/resources/win/tidepoolvcp.inf +++ b/resources/win/tidepoolvcp.inf @@ -435,6 +435,7 @@ Disk_Description="Tidepool Tidepool USB Driver Installation Disk" USB\VID_22A3&PID_0047.DeviceDesc="Tidepool USB Driver (CDC ACM chipset)" USB\VID_0483&PID_5740.DeviceDesc="Tidepool USB Driver (CDC ACM chipset)" USB\VID_10C4&PID_85A7.DeviceDesc="Tidepool USB Driver (SL chipset)" +USB\VID_0EFB&PID_0011.DeviceDesc="Tidepool USB Driver (SL chipset)" VID_0403&PID_6001.DeviceDesc="Tidepool USB Driver (FTDI chipset)" VID_0403&PID_6010.DeviceDesc="Tidepool USB Driver (FTDI chipset)" VID_0403&PID_6011.DeviceDesc="Tidepool USB Driver (FTDI chipset)" From 2b49dc67e72a1b3bb2d86a1e5364b02003f5901e Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 28 Jun 2022 10:30:35 +0100 Subject: [PATCH 22/61] signed drivers --- resources/win/amd64/WdfCoInstaller01009.dll | Bin 1883896 -> 1894168 bytes resources/win/amd64/ftbusui.dll | Bin 235872 -> 246136 bytes resources/win/amd64/ftcserco.dll | Bin 161360 -> 171624 bytes resources/win/amd64/ftd2xx64.dll | Bin 383352 -> 393640 bytes resources/win/amd64/ftdibus.sys | Bin 198240 -> 208512 bytes resources/win/amd64/ftlang.dll | Bin 342384 -> 352648 bytes resources/win/amd64/ftser2k.sys | Bin 177280 -> 187544 bytes resources/win/amd64/ftserui2.dll | Bin 151856 -> 162120 bytes resources/win/amd64/ser2pl64.sys | Bin 314144 -> 324416 bytes resources/win/amd64/silabser.sys | Bin 635712 -> 645984 bytes resources/win/amd64/tiusb.sys | Bin 217848 -> 228128 bytes resources/win/ftdibus.cat | Bin 17730 -> 17527 bytes resources/win/i386/ftbusui.dll | Bin 224624 -> 234904 bytes resources/win/i386/ftcserco.dll | Bin 166192 -> 176472 bytes resources/win/i386/ftd2xx.dll | Bin 340472 -> 350752 bytes resources/win/i386/ftdibus.sys | Bin 174008 -> 184288 bytes resources/win/i386/ftlang.dll | Bin 323064 -> 333336 bytes resources/win/i386/ftser2k.sys | Bin 163560 -> 173832 bytes resources/win/i386/ftserui2.dll | Bin 150856 -> 161136 bytes resources/win/i386/ser2pl.sys | Bin 289456 -> 299728 bytes resources/win/i386/silabser.sys | Bin 624864 -> 635144 bytes resources/win/i386/tiusb.sys | Bin 210048 -> 220328 bytes resources/win/phdc_driver.cat | Bin 16207 -> 16081 bytes resources/win/tidepoolhid.cat | Bin 14338 -> 14488 bytes resources/win/tidepoolvcp.cat | Bin 22208 -> 21469 bytes resources/win/winusbinstallation.cat | Bin 14317 -> 14453 bytes resources/win/x64/WdfCoInstaller01009.dll | Bin 1884056 -> 1894336 bytes resources/win/x64/WdfCoInstaller01011.dll | Bin 1967160 -> 1977432 bytes resources/win/x64/winusbcoinstaller2.dll | Bin 1061784 -> 1072072 bytes resources/win/x86/WdfCoInstaller01009.dll | Bin 1624744 -> 1635024 bytes resources/win/x86/WdfCoInstaller01011.dll | Bin 1800456 -> 1810736 bytes resources/win/x86/winusbcoinstaller2.dll | Bin 910264 -> 920552 bytes 32 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/win/amd64/WdfCoInstaller01009.dll b/resources/win/amd64/WdfCoInstaller01009.dll index ea50c92b4476cfb5705933d15250e9cb14799953..22e2accf24fff3e50a931891d28845a446c1bba2 100644 GIT binary patch delta 2823 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 Q$Vhc^jjLcl14=pbZ+VrpW&i*H delta 135 zcmey-#Q$Iu-v$pxX5LTClf4-OnG&3v=P|a=V`SVukC7=UL@B|Uk%57UiNT)FR?K>|cJJSLn-xefjv0W*Q>8&ukz9*2U@3LJiiz$eSN$11%tQ;mjCSk1yY+TxG hj4X^z=1eS%hRuvx=eKv~F?ny={@H`MwStua1OO+OBxwKu diff --git a/resources/win/amd64/ftcserco.dll b/resources/win/amd64/ftcserco.dll index 27a3ef73753ccfacce2f43d4aa5f0e9e48ea3e75..e37fe8021d2d6633e35fa87e945abab7dd422d5f 100644 GIT binary patch delta 2709 zcmZvdc{J1u8^`DOGc)$VSjQDZLP~zdo+7ek%f5_tEMuvdkToXLpa_W?Te3t35hmNX zk)_+%Rc^K}kqAY-*R}I{-}k)tyvzOPInVPs&-woGJ{lmqxhnE(a=gMlCnx(P7wNKVBh)1(bvfE_G4oX!3LjT&T@IE8qNP9F|M>L36> z3FTQYH?tf1_gew*;q>!c016b$A3}1SKmu@pq6xwQm775RizYeA3|gEUI1F&ptlYtAvS5kqa`#!48@FI39b3{?h-Y04#l-E$ z$meCK1)o7UVpVMH{pryQ>h?_~h;|LDb$OONI zwFruCRARfLk|(#=lyeg2r&=csbRUnIitNvO${LGF_^YM$nWjv4>ZzpW_#^GjYFhR~ zCwsWsxuLmu@WRZej?xaYnM~j#xIgiZg zkV)UnM9@rY-F{ZE4sED`NN;u*0(f3Tbt&KqgIF0OS^c@S?mp)k9G&6>Ufz2jOWQ@j%XBDw&)HrODsE zxRse+>sr%j^DwfMDVlj1WLJaUawp-th+#1;jrDB~n-k`H`8#FSXr14?#QEVW{g{gq zdFj&}vwuXPqI=e%O~yV|Fk9svgTMIh(W*jwsfo(60soh1OQgNbmj5}YdKqywAht8! zB{8yhZ7JIr!F}H%wyT=GEghG6i402$n$o&hhGVJPj)ad0gCmLAj4i}7(v(drntiyb zX!g2@Qe9pRbxmAA>LM2GInS>?Jyb${=OWu_j}smXfVUPgESDZ&cutG3=h}AZ|m>u%!az()aEGPJwV026Z$po1-*ETykhxifbMy_ zj|pKo_H_pd#$Id3N~;SVYM%A!8DRE|9!p&)?aT325V(eE1SnEnR%~9*_J$V;nJg|D z37-l>OA~%IzmIRNN!m^2w$nm`vhzhzl8#fq6Pn>TDs>K1#&6AmW?kxZtQ2b0NYiR{^Ef8|f~C*TC<(;C|xO_y+MgCP^XsYJzDlZTpy8j9#DNbOvd zUMIIkBQF`qn6!!7EwGB6u9FAD?qBX!H3*7c`Z0Q8GhBQ?*ldl>ar``6f=5#-BL(yG ze!cCjy^M&Gxf2%7_|%H1YQ>`iC-@oJf}E_^Bk-=`l`G^yVru;*GiFrJ7*FvJz$0=t z6NUZAc#k7eh+A8g0Tp&K%3jUel96r7j|x7-ei*NP?1a#9Qa153(YNT@<hp2t>SduNYMq~o@4Ukg#1*Y`*d zIlpNf+DeI~a(a2@`j*E0?NRMljXZNn*IogBlH7)}Q`|51S5dJ)H%>5zZWze5b@)oC z$6N(txcR_%L!JT@-s8j9oWxpxkI$-C?PNEC4lb9#)yUH6O-wy7ik*g%0_lH|FIqyN zaHsZNS3Z6{_UzwMAAA1IU{73>CV&NV<$Q-eLo#A~|IR*0OI;np;r|5M{{pmOEclb` z;VuZkAg;p#g51A>zyZYm&tBl^AwB9c z&U`GN^^1@LOlcpa!F&G~(81}zIc#h2;t$&PFa^O&t4M|9H~+u!dFd@s>_1>SHA3+mhU9v+l;tV9(R`LaF4_v1>x-lfx(+*!@P zcvM>|##eCuG$g*TlADyK>yWw0tSU%L#ywwmV{TAeOsOfX(v9^*k(Q3UGy2_y1z3ff ztNOMJLfD4Yii}|Ly^X?v{RRIYZi`$JM!^n2UmLYfh6u$Cf1hsuKI!->on`*3mX7d% z=JnN9m?nOl`_t@ZMEI**pJSTs)+v?8*VwVN=`4v^OZfoBXrftie#$S7jLT=zY95(o zK54&0BxYSn_F11<;*k3|Wzu7uAh#=HO}Ub9dqhre^)g2!9gfk(MK%rY0dY}(2i;P+ AZU6uP delta 134 zcmaE{hwH){&J6*K%t_OkCI>SHG6nQ(Ud9;pLMfn!k%57UiNT)FR?K>|c zJJSLnUl$~(v03RArwDI_ERa(n!NkaD(70^!!5>pLpZT|ok*W01)(%EKCgI{uY+TxG ij4X^z=1eS%hRuw{3%9RiV$}G({hcaPRRt>p2mkWj&n$pbBSh8g&%a90VPbsqHO_X75O&L354KGbhLYAh; zzLZ@;Ohn33mQwZ_KJPi-dB5*_&-cf@=RVK5=iYPfx%au7m14z_;uS;y>cB{`2CSjQ zzL9hwmJa-7&^_Z|(gB!5BC6OIfIy&72sRS%&4hCujWLed-~%|J`Foi17a7GwCBv3P zI33gWkYgefL5JBuq4w%b?_wA~RK)HmoErlNU;tSK3IlMFfSp7vl>uW?8DJG$^u&Kx zB%@`pWV95GB??lQ6Hmc5KCll$N-kV=VzGd#R%%+U$6F(RLwwP0=0KK>?I^LsX4CaEP* z{87h4@(=D#O<=q%%-+^ooLscMVSDz7>@(-66E-0cC+wxVhFEpD*y9CcF$9(@Cj9q= zIXD0uSqzFLBX<60u!wJa)B>&G1x$>V(*kN}7_Tdv^I&w?q>j5kCa07IhyQdA;@6f* zO|7;U$=mE1fx_LYj%>YxiHqQ|cs!PXSH)rRSge{NK?P3}Z3Un3<5biPjw|cxVvnoh zl?gN}1@MTR&?PLHQxr>v{m$or0#K-k5(EO=(^91l@)Em^x*SxM!tFv1R)i|g|sZ6?oLgjqI)%CcuIzUGb^*ZnN9jDo**v$@+elbML( zC9SK8W}<40;f)-CG`Ea`HfW<`kb6GdO0;uYM~`Ar^001GBO!Eq^$@*F5A#hWqBM&l z$P6Fq=njsjEGJZ6R0&w$ch?RgFS2<`-y_)Gmo10>(|hCad)}KY^qIB3!By(|fk>M| zDxMIn&ec03p?3FZMOGN2@^V8oLx`RE6a+#g<%Q)5-(?+EGaJpC=!^U)PgWjh!+wuv-_l%Tl zwrzP^U)nlp0W1lVZ^HWO`50Xr2k|Z^t{+#XI0U7mYkr`%RW1ZV>_0N z%qD7-6uxJjH%bd$+LGTm^GmR($wkYwh*IGwfuLzup5RmF<$73 zYSIT<;LmwwHYOBTtGh$fEF^K<-~1OD?LRYwS=Ym3_nubWbG`Z@i$Q*t)qM2sxm)+buA zJrQ;E&XLZm<*W17hZ7%kIrY1DGRcPVfBZe64qk2>1n2p+nsG9H)W;L%8LZnUY{TB*niFNJp@JgV@=D*gDcfSCq9z9yBs0w;JIJ3 z6OCN(>I#?-l10{?`^C1I^IRx3(M`MXVt=ESRa&NE9wA_=syc<&^kGBdPGBd|8uqeE zYl`_i1PtZ`hp=R*CM{v`|EiS&t#JV+BpUwxr+c~NSrB&M(Qe#9TSlN=TLI1WF_?MS zWBxuCB`)wE{Zq!`a1MVHYB=m)1Z}_(M51Q*lA!N!pmHZ17%+2-tI>!F=P4{;#eN=i*~M0;J%-SS_I1@zRAKX z`1z*PQaOCSinyF{q2oyPX^X>%CbKBRvA`luO!}8kck=Vy!ip4BAg05Ehr-q_34bOG zsA~EL?cP|+NV&{=?uzPUD>b)xj-6V=;az!~3&=^229pK;smNB#FddoAoQWrl3Rfa@ zH@Qw2u&jQ!RV3*Djv+bQyL~X0?9manPh`L)gzo5_S_;lNb$;S`zxK z8Wx_cW^Qw&p0*+k#*zNf0E>djxcA)W-8_o0JJln`5%K#_7wT9r3$i(EWh2l00<<{& ziRJtIVF5fK1V)BJn0;sZJvuHd{^9+l4q4ojm@R?4*(_dYb6&NoXPLs~5f_Xv=_-5w zk{{{)Vus@4Ijl8d`uGj5Rhx7;_9hjb`zUdfrGJNRRld*H;#y?~?5Di6?((}+#%;b? z0?*Z5U*{RRXt_&^N_C5Q84B?BRI#5Z6-DZexkLi+j-z&5`Qv^1<_9*(F(&q}3<`9v zoSa;Gp_AI?`jtbwW-#tp`iy10q(30~pgqUIbJB_Ow$_@Zz`bN_vvh=nSzXNA-`U@= zc`g2Ipre-uRaGg3(tGFz8{;km%d$Oo49tOhm~W zf2-}sPD5qp7p$~G5ePg<;z}hItysv+??4_5WVK{bWSkAYEzjf+Pyo9uRcwtYXP{95@n^zE(cJdiwqwHv@ys_Qt7O zsMW=Lq`t~hS}QbQ#9l|bwm_Z7V{1A>l(ElgxmG3q)cW|>o)Ib2OMdRQ&o>36xa5N8 zKKaw**fT5kdStFJUa5$yIc+Vl@X1t1#~T@^WD#8#uo0?q0q=1e+)ls VE_peo%w#2N%d0arpMt9Be*u=a(@X#W delta 144 zcmZ3{Eb(KL_=W&Rre=Z3L5x9674FT;7~7XIf-n;hGjCtU$PzU{sluI+fq{vM!JwJZ zJ&lc1tIebBJ1-+U(*htr3?vx1U1<`_TVZzNBp}Z?cDvXzmJlW;L-y@CD_HoLg!R6& pacQ$LvM@H8GqErlHZ$ryYwumfvb}c|>t?p?#Wz_^HJBL~7y$6;D4YNQ diff --git a/resources/win/amd64/ftdibus.sys b/resources/win/amd64/ftdibus.sys index 98024b462dfd5ee9b7f37dd6917ffd63ae68574c..12051c55bda71bc389b50ae19f1a98649ecd928a 100644 GIT binary patch delta 2756 zcmZvdc{J2}AIInSo3YH8F?Lh7L7|Y}3|YqviL$gHNyDVvXvofu=c~00IGm2q+8)@Zv`Ak31T=iUWAS+@0R>Pe|v;RRL>~0`xyS zIvoT6D6{|yO@c%F09DSJ9smu3cDp%FeE>fwY>VN>D02fSfUO0h08$umdW{o40MM&M zcKxq5TL}ZPmAK(HLokNZ@dx+{$Mpna@2Y@3UxC^1Yd=sOK*N^ffE#?T5%go3OYir% zE!mY{-qxH~Jz&8cH{BNDFGC}@2ya19r*~pv`_`$(PRSp-U%D$j(1vUB#Z#6F?@Z)A zX_({;53TCSK9Z$6d|0@wHX~kRkl*mtw);5Vy?15PEHQt}ZL!}#v|+|Q+(D$Ow@%}e zg^n&;{;rvb+A%z0;c4^6;`lntB1uDSsZJWOmlsc~Ire?3BF;E*d4-BGjVf=T$*sI@p%S-y7B!bVPA>G16vUp~;KIk`SUJAAcZp1rc=Kb`dfFT-TKzUHmU$3`DO>d zYFb7~k0Zh5?Pq_G`$9$3EHa!ROoqs0NRzBhg2)hwbO6#O!!c^$U49bzkddmfx}mYE zmWJ^m_|p=gsF2GRw1wC_Scr{U&P9R%2nwqs5I`OfVUtmP${`l9b5uYcJn|Y$hLrMd znti^$5fT&R&G>cUO1QSY$N=T+TH6qg5OOup5GvM1I*+@dj!n_pH=;*MyJ zajC<1{=Zj%009jfm`-t)v|M`mHVmP*{_+Rllr7-ydfcTwr;m&g!bdy z+k0(|6yTf#OFhd++#^qs<})0cN1%(FnJd&eLy^#^Hs-6J9UW#}hrZ=o{C!Bk_dq3wM*o*V+plKdu0 zT4Yj7ChkqYWZc(gmcgn)Fax7``XXVv-|2BvO7DBec8MbCw8hIoR=$T3Q?qQPl*KFP zrpa$jbsnBNvC&*<-A4lJ8U^f?OG%+(zGoy~+q;)^Y2b66T&m!Kmr23x@d>@jc1oSK zG}`Ux;yEYpkH!>*A=4_J<z!AnAHvvM8sYY$wN*FYc|-}m>Z>I)qb1p#T>_L zpd!E`HpmO^4GuJ!U}x=r+-a(oGn|@H@EjvV6slEzF9lhq1{su(k242U1gC0O`90Ga z?r4i1nJA4cIX(9*m(mx>(?N2&9fN%gv2&wPo@{L-kIfaF*l)M+2;}y`{4&?bEt{(aD^`um$%{Jmp`(6GTYc~ z6}>m_BTtZwGTwH|b=Dy?KfPlsY($nxmwB2DYxYDuyXm5G@1;yibiBbk+tZj#n>iNu z6#e`?l~!aU*~wADQ8DF;o8Ze~X91W|Vp*)MM)=|t18;!%FP{s{fuqKDM|{Z8~}2hJr}di~O0rtJ^YtQsZ~&5B~rwEeL5 zN2c$|yu6-r^Qcax2@l8g3Ju+5FMgPH-1Wk&!LQ#R+EjV%Lh}vC>{eb^i$5&Z)kjwJ z^vxoTG8mo*!mSfX%*UcYoM*Jt^!4J$lZhVk6XRPR(1ft}q~_bsI~*)7HlvsI)Ve^y zRo^#w`(kPUKLXysH$Z?#kXm_-=lNw+HQjKV5KCL{u6c%cTX=@&S~ zg=+^Yu`|AU(-!GA=70wNOLzsAq;2{fA5gOLvXSglaQkP+DO9hhiIwEhTuzsWa}HBb z`@(ua;cd?h6*-|=OYz#4E}gpv9w@gPhT=X}3)oE~O@9Nb;Ds_U8UJ^W{stlqh@IQS z7k9R$uJ|;X-zpMy>J=u8rxn^&@iKiS6)B_bf$&KrQkwXc_tb)JDEktToe=KBHEU{$ zY2Q1-J|V08Mk(fFLRUCEA_2y;{x$%TLlK2su!L{Rw2wDjMkZPt7ijfv%{a`4M#GHC zzSIKv3^#=P8Dan*7Xrlw5wFS`y=o{_}LE>s7ZHn6gqudR9Qn2%x~9|I#Z0GylD8+Blo(X zVsv*)W8B-$;3954>#*W~J;>Vj;zv0<50$%z&FhN++0U)sWP1>V;|u>~W_L~}UhOdL+0Z0S_@o(rR#(w|+ delta 139 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 diff --git a/resources/win/amd64/ftser2k.sys b/resources/win/amd64/ftser2k.sys index d9f52454e3fc4788e8019c4dc46288b93ac9dca1..a38ba556d66c5d2e8d2398136b9a7a234ae43712 100644 GIT binary patch delta 2760 zcmaKtc{J3G8pr*9Ci{|YgzU>8%Wno_h)~v;qK)i&hiJ4&)-a4ECTrAhkc=@zSEMi$ zMV7IYtrSHng{f&VS(Ddw?|tuk?tRa>_rK@+InVh%=RD^*-zSkRL~Rkig9AW@YQ8ye z2&A?rX9LV^05~tNMr{XpctDT`N(S05^9kyvIi{_M0{kFtOJDp4jAW|q1O#_(XArj( zBM1ZlD5(-k%7gRF0exmL4iE%Ex+XK+91sJgXfk|4yZ8VEKsE&t06H05npHVu@+0uv+VrGQvwGb! z6S5RU#gG#n4SP{Y3P~*hS+T=qA1Ft=%hhUP*EK6d-EF-^Pt-ZPITagF6KYBi5++<7 z8Y>Te4yf@e(h))NVSXiDJ+k8}ST;AM{wx0h%cH9a3EhgthOFS#VIoKAaHr;i_{9X? z8L-yYW7`d^aC`#v-SRfz$@R5XDxFxIJ>V2~{(0a*SM5C<|*e0~QvGqa_E;36yWQp3Y2P;8dS-5orya_KRtVskB-( zmYY@p`A#&P)lot1kitM141~qt&=3Yfn;4+crttM{ zhfMu3e9xjeFPH8K(n0Ut#(6PL)6WV{@+ZmEjd6V*6uJJ^+qAC{XX?drHQWBRWNqCU zYfC#`;lrSY37i+{jv?cE|8PjLH8#LDdF$Pwc*w^`oWL3=Y#hnx2es`(@i6hAEBBP;%FZF+PW zNylUt8nTcpiceyX?e-mh#+nc56|}-x$xwGOtBASiGhNTC378BbQ9d)bFMPF^T#C0B zZ|dq6(vPOR$JfQ>$(!R2AHEcbzbhYjLx|~pjzrZsYrq(PW1WgL)Q){)u^LkrF#gQL z0^f&rPmiW}>b6x<FF;SrmBuPT)tF$4->H<588=UMr9k<+h>oa; z?h{9HJawW^4`e?1_P5YOriwxnJs%GVus@ndnF_O$LPmdRa`Jnp4IS&0LlKTw3$U7B3QLvWRX^4N4v1B9uj8KxiKlxp; zmsaAQA(@jEyptN?*{R3Jmsz%?0&^c~_=?u^lqfzg(#+M)bN&0n5rL=+2;T(GOuTd{ z|D4TWh}~~c4olb^pu_rFqoGPl2lI8z2=Qq#1iR1x`pZ_hXd)xa0~ehr1@%@zs2 zn$L7FPxpx@wyVjeJ|03MD5mRuJ*^Juel~p`RV}}(3%38-9g@9rIapBlvV=la1gb4U z>{CsJ4T*kkKENNnc3O7Fw&m(uaz$kZr40&PIj*TD5#`?$f1T&IP`Y2FOJaRNZSDx| zYKhfn?~fYybxQm?wVi*_RI=3%wppKeaIgDq{lZ6MyTkPpzNGL* zMJQU2#e}Pyt8xRKcSay^{yay#d4YAX z_yNX2C;x}s^8x5kmD8xNJLSmlQ&X1ABd^^?Kii$U#v?bqmzi)`Em#;x znA`)Y?GXQWB0^@yrp6f0KY`gF0E&Vv|48JN<3d}n&Jfavgurb)vs(rrz_V2YTW?jo z7X&sT{(sgI%zrfm=|6-wvETtx+0l?3$@>hg0=6c<|Jo> zdM0UI;2yS}lD4uy))+4DK}t3y(kC)3Xyj`Nn`y1!JvR}9ecW|z4YsyP!Fx>+>pAba zO~djE-DSN01%9DllUX^EdDoqurK;!dR7&qOj2@d3<*wapE-*TiV~D_@>$n#6cVS!NWb{jKq~K81GfFsW{DB5tF5*wOAlvtiuXKn$o^|{ z(BkQ%pQ~?nn0=YvUW6ifS6m{AJ7Tn+nwyy^BbI-@dugLSn(u|#xW7TL7{6p>+~vSQ ziv>NzfA;cvke&nHgL9BE_hcO%SqY!Y#ev7uq@az{$>BW<;g zA9WjZbd%{(!90nZL}w%`B>N{K!JKdY``xTtA2VXN_lLYaHQ~XRdR+CJdc;WGs?WYM8;uz`(@BV9?AsBae+!tIebB zJ1-+U(*htr4kQ@4T}g(KQ%0c156G+WWMX7AXk2E{IC1(!D@NVz85WG3OiWcA+l#Fj x`Iv;uf3R_BvoW$THkmWAFd8;9mOtM<#fH)M|8~P3CNuu+CdEuCnXC*T000UGDYO6p diff --git a/resources/win/amd64/ftserui2.dll b/resources/win/amd64/ftserui2.dll index 04e49a2cec968202cdd671ccd5bbcfa7cd59694d..14da4eec5de36787c25650bac4ad0d6f07a807f0 100644 GIT binary patch delta 2719 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 CqqfBW delta 131 zcmX@{iF3mu&J7WaOvmO-j$#aAGU(mBjxp$vl0h#c0|OHigF!Q6uN)hvR+~rLcV0$z zrUgJgA4rgMv(gbx5#EY_Ku*O^CPqes#$}TaUYfG`%#B@)Ol6BVciiG*5-yp{#-+{1 f$imoU&cwoK*vwecw0Y&7zrVL0W@@cqWdH#HW|k}^ diff --git a/resources/win/amd64/ser2pl64.sys b/resources/win/amd64/ser2pl64.sys index 70b08a4eec3eef4aa593583be14906f0450d476e..3859653e0234888187b2ad3a19c218b077cdb40e 100644 GIT binary patch delta 2598 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 YOgGi8cfpgsu=rT9w(#^nVGs!9KMG8nIRF3v delta 141 zcmX@`OnAXG;SC;)OibaEy%>X-6e^qNF}BZRWZXWFktr!aNuiR7fq{vM!JwI`Qh<$9 ztIebBJ1-+U(*htLBv|o#nl^Li_SHd5M|jz@)&NDamQN3CWtzKPIFX5&i7A71yF@b6 rUSZ)7H#RP9Hbxf4CUYhhM#E;N5YzS-WlY;&lrb;9y?sR$%hU=0Y=kP8 diff --git a/resources/win/amd64/silabser.sys b/resources/win/amd64/silabser.sys index 2da82acde5de314530027bc5ce84e9ac56fe7bf9..d3ed1aa8a7b795dcc6c923265a2b5f8802679d25 100644 GIT binary patch delta 2737 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 JRSpOQ@*ntNx3K^K delta 152 zcmaE`P5r<#wG9D`Oji^q2QdaQIh<`?#@N1$5rmn5m>Gy!fS7grGDfzjCrS=ynHU(D zm>3M2na&!sacZ@Bw0-AgWM^6c=$$*VZn~jl$vB{i?h0(B?X_I`rA|pExb8J^+Tg947Hmr)S`owF0|0|Ek!1+y6My%Q67 zMg|Hi1_1;Cf;R#L0WpIDcr}OU0s*(^0s^!Dw{_YAHV*+2mmxL*-+!^#m~q_+ zP1<>&PeLTS@DMlfs)Gk}(r#>C)^^YIPrq(FOKFECvT%AU5Kp_|b@vd>{?1Ahy z^_$mg+k&MTVsTIEE}?8rYWVdW;bxgTE;w{k?>ShL$2q!hL@ts?#`;}#ZF!VfAg9kj zOCxM|%h|@h&ihFUP=A)-*-gFaB3F897I#16>+-`E{829-CD51D$A?37K&EYQMT+@l z+Fb~n3zLo&S7=Bvgq$4rT>12=!k?Ofl+{?*MDwChgZ%x@{kY**mR>*sTJQ1oX- zn1a#Vc6=xjRfGqXA8!B(1$SEJJFi{`ZI4(DRa6lag+fHVjsm~Omy7EHf;@gP-5}oz zMfbpEAQDYaV^G>|V%%t)FUKey(n@H5rz`>nVzI-~@-G+@GB7eSFg7wcF)%VPGB7SN zG&q;xSOTe+ZxI4Fw<+xcE)XVU)4wnx7!NWqGBPkWGB_|bF)=bXS{M&9FfuYQHZnOd zH8C+VH<$mg0vaObWYfO_0RS)u0s#O50s|K?2Lb^A0s;|OFbV<%0On>TKbH{u0ZxB> z-?>>`Ny2jIj-6YPl*8)W*3sWU6c5D?Q-bL_PSjLZ-&Gvjp34ZwF@gjQFoFb^;j;mYml^*8Parf|oXp7GB@XsqCzr7(0~3Eucnoq@YI`6|qOC<0_?JuUqk&3{Z&P*x<;;(H@8ABs z+{@qQoT^yE-@WacsOleGt?#F{*7<;9PjSMAWCgDk{JJg7N@x5rc83y!kuiU}SXjaMn6++` zbY_g?#kyC-6|>16>rpAq6rKr)n z0T>3NTtjAL0TI$$jY&h7DK!cUs|ehHaT!jxa5>G8HJi)Qf){F(s#z(+5V%fD2#yRBauuIK>Enms76LV-?zCK33>|nnt{X z<^+Ys%XJR_4kYa>3L$`afUV=pAS95FwQf1#i`wmz=HzK!CuDe%Y1vo%a5|vigQ1z0fK*--fmN9pJj6mLI(3IYqUqh$`3`$1RE_pPn!G@q^So>BL b2HeNql@c7j)zJhfHs2Vxm;wV}Pyzq|FqBk^ delta 132 zcmZ4RjrYe=-VG6q%*Gd)Cr2{|GW{soypA#Gj?#}3CI$v3CI*9Mrjl1|oLX%jZQpqr z*_jpq`L{rVSEn-uGk0!YeeVb_ds-V%B&~6JpdjPi&BAY)nV6FAZ jjgf`1$()IW(Xg2*fWQ3(6XW(5OiY{qZ$GHT92)=tD}yaM diff --git a/resources/win/ftdibus.cat b/resources/win/ftdibus.cat index 275a91450658b0ae4646938f1683d6f2a45f9208..082a97f76f04190db254ce6ee62b1ce82099ff97 100644 GIT binary patch delta 5664 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 delta 5094 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 F{|5+omoxwX diff --git a/resources/win/i386/ftbusui.dll b/resources/win/i386/ftbusui.dll index c2eaebd290682f15b150fa9c46b34ad6bfa4f05b..2859895fd9c5e947e82a7bf5401ef6369d89c808 100644 GIT binary patch delta 2674 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 delta 129 zcmbQSn(xCc-VGj%%!ZsSlf4-onF`#S`xx8%7#X+sF)|gYC>6LfGB7YPF&H#6x+k-7 zYPET^edlFlXIcQ{2ZIFtwkxSIy%lCRjtBCLqqd7#F$FO(8M1B9vSH$564v|1#-+{1 d$imoU&cwoK*vzQ+bbGfQQ_8mOqO#156#%=-A&39~ diff --git a/resources/win/i386/ftcserco.dll b/resources/win/i386/ftcserco.dll index bdae1e9a31e9cec1b757b0b57b1d4b5c2f42274e..eb81605854985f28c899ee739d2dbcf897b34c6f 100644 GIT binary patch delta 1336 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 diff --git a/resources/win/i386/ftdibus.sys b/resources/win/i386/ftdibus.sys index 84b6a8fdb8b0117ddcfa1478424eba6380f570c7..bb60120023ead5475b824a4a05240090025d510a 100644 GIT binary patch delta 2682 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 bHZxXCZTDegobJQMB(S|nkEyMKjR6b*l#D0o diff --git a/resources/win/i386/ftserui2.dll b/resources/win/i386/ftserui2.dll index 5f7e6ac61bc5c220f5771429940ec364d12a2bc1..f65a32c2806949c33ff1c50780b727812af23cd2 100644 GIT binary patch delta 1325 zcmV+|1=9M+nhEgg39wKB1I?%clT!gf0&uyrmH}$IB5=6@0006405F3AxnBkeDuzgg z_YDCD0-%Edxlb^I0l7-EBD@I{4W&OYg8`*F0s#Rqfu@te%9OLr(7FKvqU5uP(hdR> zpwtEmD+U1s0fILI1OYLF0ieT!snoZr)B#Q?x6#xAHV**{mo5wf-+v!>=+b4P3N^So zgF=i0`wN^D!bd%&+9`xu1xJa6&(*Vbx=NJzQCx#T5?d!G&!Li8C~s*s16gy@&(D?n zy5!>wC5zGXiW1_lHK95TI}7qAJMvQ@KCXoNvkd3VTPZtlx)%r|7Jw52Y094A9%8e8 zR=r}OyWg0iXA`2(Fn=j>=@89?ot3M!6*Y;bUPLhLG`+X+AGO_Z8xpgh1O(jVXG>nVZ~}f&#zwm*?dHfXkPB*8xQrD`(KvOzc3;g4>B+^GB7qWI50IaF)}w=7!NWqGBPkW zGC43cF)=ci*!KY(A!O6P0s#Op2Lb^A0s;dUFb4tw00IILSTG6#1pww|B|npq@*p6q zkmn2hUIV_?1}|d;tmAm=)^!LhX)jg>V$UnJrCx1Y7e5>T6P&klIXsx%98Bj|1Q~B^ ztrWPKgkClQRlUsyZCT-NP)^iTR^L?|+n&n-$Ctg(0g{)l`T-D^h4}$LAQtNfTni!1obQ9Uu5KUPtGb|M+k18s z%J4+i>Cd-CKgnnz^cFOCyl)x=G>S2)oRnqcY^f2(0Qo{BzY+B3)4R+Fet($-=4^>L zbqWh#F;r-);xOu0iczIklQfQKn6y+zI<}Px$eW~`6t*UEKfzy7foUMLgx5{2|YEgIC!+|<~ z`6SraXxI(-zz|_Q-ff=wwhJ$lTe#8%po4eUZ>Di-`1#10oJ=h;-G93ohJMcDtHX-@ z+Q0D_^bBckY&v%FTS$wX?#_A}Z4Sm>P)gO6{QlmBkc&pB959RgBDB%K{~7OjH5qc^ zdBX(Lo=-LQJqwBJqAL^0+D07f7`cDSon#Vi3~*oKZJZU#8@lNEj-4IQbpZz~y*&Lz jH7&$|+xU7sz&RDIrvyDvZxNRrB?64Mfc*i;PXYh{dNNh* delta 131 zcmezHiu1%Q&J6*K%oF99CkHb+GI>ngJdH7Hmy*XsMg|5ZCI*9M#)+0}oLX%jZQpqr z*_jpq`I;a>mCZ_fI7N7CC4rn;5hg}PgT`f(51yK``OJk~j7(MgHg{a&V-l`d$Ht}2 i#>m3hWX{CGXxPkHF}Hc;mF+99F#2h1msMp73;+PN!73{N diff --git a/resources/win/i386/ser2pl.sys b/resources/win/i386/ser2pl.sys index 49b02e8bb4ce6ebcb58505e11c07b30a77083c2c..5c5fa6fc4562b2e577c6b1a3e611cac709a4a70e 100644 GIT binary patch delta 2687 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 diff --git a/resources/win/i386/silabser.sys b/resources/win/i386/silabser.sys index 58fc6b568e1be2b00ecf99ca659b0468d4c682ae..577217f62804a74ed750910b088b35956b8db719 100644 GIT binary patch delta 1348 zcmV-K1-ts-ktT@ZCa_=u1NXQIlVbrv0towqrU8eh0Re}m0Ro4n0RxAo0R)Gp0R^|F z0R~#MA_)5e0006405F3B`uGM3Duzgg_YDCD0-%Ee`sgr&0{Y{(BDMxc5C`g-FoOc> zmA7!l1}p*s=x4W{$Odo-6W{d)3M&Qy1Ob9K0t5jug96{=hau4hhau4iw;|C8n2)!U zI0-fn0Th>^K?mP|FagRV)M{$D9lGM-P}H<2Y3TC?Y^13COPsUVx`1maYA-RU3kTbN zn{Fj-8~7ZJVSgCYOYG1!EJQL{;V4`7>}3(QIyLQG^K~UZxS5sA6J)Pz*bhW^wcK|{ z@m3tGnCi*ViPxRiV0@zb-WH0zXqKi)Z7O+`Ds6 zOwcjv@?{nRBdnLHNeO~HfUoN`5lWg3NRq%n4wSXFcN!NtCvXO2Q#-tO9?O#CS=pUFd`TaGB7eS zFg7wcFf}nTGB;Wn4>B+^GB7qWIWRRbF)}xop(_X)BIab%zXAaOFb4tw00II77cd6` z0RRF55m+z^0tEo(W+gwDu`>xzf8V)TT}i@n=#HIRk(9&g+}6?GKok$f4pWBX?gUul zrHFawxCDVdKZO=p6qkmn2hUIV_?1}|d;tmAm=)^!LhX)jg>V$UnJrCx1Y7e5>T z6P&klIXsx%98Bj|1Q~B^trWPKgkClQRlUsyZCT-NP)^iTR^L?|+n&qEmwz+~l9zB^ z2@sb@T?s!RW+yo=ylIMJ;SC`rlmw+`19+$*j3BP|Q zLoF_9QzwM&M7fCO%;)Yl!Gz7KDvdEz?GL#2Q-_MSiz-{``@6EH+cm|eylgo#6xZQlqTBL#tSZyt$Yrw26Rn z8q73zit0Ni2kWVl*6Z~h;%k5DB<@SLD?89$rHGMiq%Ul+3%FEm!y_0DNJc5-xVP7x zWJfR&$oW%5YDH%1F>ibT)fK_$0)a7FD8XH(_L`(8{JRobS-ycrQ&~j>)4-amEn@7C zA3hLSlFLI8;;L2HI05c?TQ!KfS7%|;zf=b{oC(%aH?wn0J2atjsO4v diff --git a/resources/win/i386/tiusb.sys b/resources/win/i386/tiusb.sys index 9b7fdab3ad0745e6701bd0530905d7f25d5805d2..2ac6ba1ba05a7fd7372a76f596c0913b43469918 100644 GIT binary patch delta 1325 zcmV+|1=9L}=?tj34X{W71HAwQlS=_X0;r<1jsbGGBB-JQ0006405F3BqL>B=Duzgg z_YDCD0-%EeqKGhq0-}SL;M)O-v#Ywq4F{AoFoOb=FPBlF0iClG$pZock&Uw$%efO1 zebNRBD+U1s0fILI1OYLF0)4@Q4l zw6MPbw_d~yvkj($%8?wH1O*0q$Kj~2Y9O)U&wtOGR|v|jQhqDT7m#}YbbPH zX1<}WorJ^GY4RQ}HDCS6P5^hcl_iCr!5or=5hx%dEkA{}+PkI>Ar+_k%p6qkmn2hUIV_? z1}|d;tmAm=)^!LhX)jg>V$UnJrCx1Y7e5>T6P&klIXsx%98Bj|1Q~B^trWPKgkClQ zRlUsyZCT-NP)^iTR^L?|+n&n-$Cn@A0+N>y3IhWRj$WP=9eJh0v?xS2?M`>CqpeRYEvhK?L@hV=FI4Sx+4xPuRcT4 zBQ?5FMC%Bg=$oR88p}AQKCin5mCWo%>QJ7V0?rV7np8Y}8W~0r6m-*-i`dxraCRg1 z-(limzZ|INUM!c;3;pd@h~7fiFS{^*50$1{#vEbESEnUe;>RpDLAeFp+ojoF{y5~r zemdxJGTlH7$0}<;$k^zgowPb3YF{K)1BgEnwd}^Cj%Y0Jfv!Ryfm=2wZ|Km=f3oqi zH$CXH`}L;@!l6v0L%%y9!+BjF|9N&4YGhKWeQaB1Zf56fP-Fmm)tr5Z4WQ3|YnS4B zJRpq5L#TJ}6T^THWz-M^h7*>MKLGG;5E)=0O?PH16U-Bm&h{r^{?MRDUCEKpDeu` jOK@N0UA6B3HkTBwTp;Ux@Qo2HBLRty6wC;|Wg8f8j} delta 135 zcmZ3nlegg|&jt@hW?ygS$=-~PObu0=`xuLMC^b|uF)%POF&H#6RTZ&uYPET^edlFl zXIcQ{CxHZGr$4yO*tvQ2t|PqcIeb8o9M0*13mNBb7Cy<$#FUx7S>p6gVd2mrI%|H2|&!Ep`9^ diff --git a/resources/win/phdc_driver.cat b/resources/win/phdc_driver.cat index 409950c0f5d87c3e952977f835fcc828d318a49d..c9e30ef2007ade145b14cfbcf38409429a701efe 100644 GIT binary patch delta 4566 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ℑ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 bOlt87_8+c`8Z6mYH@Psx+aTTXum26H)T delta 6899 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 KGAQUL@#J5ehtdiF diff --git a/resources/win/winusbinstallation.cat b/resources/win/winusbinstallation.cat index 3a1cf65edb9bacf1769af522431c7e00bf159ef6..d2ae5548ab51cce91db8fa33ae590d04d366f516 100644 GIT binary patch delta 3591 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 R64>#qDRP{_I=tVpe*x#4=sExZ delta 245 zcmWm2y$-=(7{&2Ek7|8?f4?k^iG@jHG&MpZu0RYdCX-nc4AMnn64AkK@^*9?!eVs= zjE;Xp2tgPk5QP}TApuE9K^iiU zg&gFe07WQChs3;Vm>w$%v(m8Ht7^g8%36J*r1J@#`JZuV^u#TvyM2^v$@f^yn2(RW qAzrdI5gke&u3D(BkxI)JtJJjla9(ex0?Kkbtyn$zeO5*TRl$DLxk@Pj diff --git a/resources/win/x64/winusbcoinstaller2.dll b/resources/win/x64/winusbcoinstaller2.dll index 2f898f54ba193387b935df1b4cd25ce28a8c7739..147b6a894779fd4da03f92e485ff4b2403650e98 100644 GIT binary patch delta 2759 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 Qil?`h&kCOz#`<&q3k;m?m;e9( delta 227 zcmcccG0qO@WP69WSi6N5oB)07!(oLX%j zZQpqr*_jpq`5hp^=Iu&mVq7A;4dp;yLlF}rqe0``>4i(hO17`{5|d?Os=c}WjE|TS slW_G`HZE;8Mi#~!)B)HCGCvHi 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 C)9wTS delta 235 zcmdmRD6ivF?gkG==8{C2$=-~POdLC#`xx8%7(ti`h?#+y1&CRJm<@>8ftUk`If0l9 zh`E872Z(urm=B2gfmi^D1%X%yh=qYz1c*g}SPY28xA!qh6zx;u*vZ7ez{JF0(9E>s zCmW|$n@8JsUPgAN1wj5wkl>T;N(Uqkh_NqH0`eBgZhv`AB8Q1-{`%>L1-!GSC-h0U yZ8yIq;lwCBx0{Vin~jl$vB{i?h0(B?X>L_}&us}HmfYTRTk4g{_Bk5TlPUl`a!o)0 diff --git a/resources/win/x86/winusbcoinstaller2.dll b/resources/win/x86/winusbcoinstaller2.dll index 474d819af1109fe80cff4431b89f8baabac784a1..6febd9952fbb34884040e43fd19d3121f23c0dfa 100644 GIT binary patch delta 2779 zcmZ9Nc{J2*8^`B2GiD5aV;h6sA*oPVelxa_Eh&_Y$G&7&lAVZ&UNnld)KnnXBp&5G5{aSyLlKm zikOuJqNxC#3j7An0l@*ufr|r*1DXRj2Mh-u4!ku~fbZ&rH0K};28Y9-Xh8M@3Ue^d zDDEc+py5nT&i*a7)a;((S z8N19uWdO|p29bvu-7K(>dSB3(VBavFuYIJuyGnr2$%q~K@vB`)#ZlN$z`-R8;rrdk zQhx6B*gdXOe8pK#ca9q>-X;u2xRX!p6n6A3l-zycS@vD(mcY5Plcb2m`8lwu=Zx^Y zZ1GbgZITDkb(@E}d`-B^Ohx3|)Hzr%}Ph6td9j_jP%&c0M`<&dOl!-tM8O?(Erc z$akb1%^bl}8iBKr~UVzov^o07M#o1)|}X{x(?r1VT~AHnI7yYLKvaeF7=OG%%E~Zlf({T3EdbGwYfJ-FFUfvaQ)md8#2k2S3VZ@-0^QuWb540#PzUirTis1)W!${4dSZDF+Xqo(K6fEc%tc264np&FUJ~uth zl5`Vao>AF%)M2j4CGd|?=2}ihOLn)Dp2B<(`{|s%yEGq5K43l}HX?KH@PJjEai;0be$U>_m+{OLmRc0HvTTK)s#CEBXn7STTlP z!M2&RV}5aB=SQQ%^T9s)g{%jTi3YPJ^a{>vOrWQ^dpn7juc{x$b@^Ud3H!5yEIIR3^2Yg7kHqkM+&TW|^B6dx*th%SlVHI9Bsz|8T*Wi}} z(9X0-I-aJBdf~Z6wPr-9XvKUXnv?a5_nL&|+;&@8S5cxj4NRNLPnPYG+G@ylKoqqd ze-QaipwDKhvEK5z-+I!y^z)1R=)4!a0*ZAng}Z5CaLn-Bre3FyqX{N~?sih)+b5c_ z_GZ0H&9eF#u4G5$i`Av3hn2WBoiA(bToGCedq1{hsQdW66_rplUi_uU^3uL{MiEL~ z{7CNE_14DMO*vH2m)7-^5nAB0laKRfrrO(jTZ(r-#|{4Io|iDe4TRGA>aJx&Au{r| z>0)CN;cvrF(%JvILBL-|oYJ;0z+d40MXWqS@Zb|EO_^=-{Z&gl3rRokP!qT55$4|3 z4%(0LVOn7j-c+#@Z?=QlH3uG6%SRj3vtucKVn1!VX}*K2CX4A}2A@n$j+LnM@VvRR zQe7;KU1|$^#=4;8x#z3F?%;=)tCr?}&Ba`22?zA$Teci(Jf>9YJ5O;NeK3{lon{qk zu{%ZF+9-5K&T3={s%}!;b$T(LeMnC1Kz`tG5X6oT$5$Z@*Tj-)Her7gOeFy zNnq*U?Im>>B;%?(0tSy)X9>KDA2yDYoIZQ@%cFaYp{)@ZlxLyrrcd{2w&5@5pFH9;C$8N-BAGd4(Zf1mrf+RPXyHNdK&3*~D! z?)L}fou&1t6=5)^6JRqW&VgzC|1{>tbKnuF+I^Nx64l~PMfpT5g|;W=ML1l2Wxi)8Lx(2ssxnM{d9OmhO zRreANt`5re)DIhB&2JpOn4jYGwKHn)2{dOvUvDPpqotphr5O_E9Z-?PiWEuO_`cuR zO2m(9-Uv#mt=V@@MA#eKXKe5(MvYD!J*8Y!`pIt6>=OlpIFktmyK$M7JR5P=pYPgV z5W1QF#4?-z{9di=LXL61x0P01MIZC$MW8?2((i2G(p^BRUa{ltjyKt-+&oCTSfH~j zR+@(M5pUsbMAZ8_Z2@b{TZ>Jw;kFZ(sYjnu(QsOpSbIr&;m%Id)${LM-0Mi1DdepS zB;JVf^$?#TVCsz9b>{G%v|i)nrGa(OMz2Rwvl^9|(ca~{Xp0)PDC?b}W3?wu7kZ2v zQb)S9>_n0-M30K9Up+aFWnob=Y6rw%GbN^MbF-rXa;LK*%X3GarU+7>6SLR6>oTZy z+nxMsW07532Bj@i>QjzWo4~z1vaQToVZZ2b=J?8j*V$=B%{?P>wL&&B(Xw9@g*&MZFt=k&`fn%tu0tmzs>Z!jSY H4ukz0uk_eC delta 188 zcmaDc-D1aa^9>e^Oni-#tr(q{cl>8)u4inoX9Qs;AZ7+)79eH?Vm2UV2VxE&<^*Cc zAm-j)&&bpGNFJz>fq{vM!Jz5?DmG57HjlRNyo~Hj3!47V1`17|uD+QkZF|QPo<+jE zO|N?lnqGG>F)|u7&Yk{%nYU#7+8;dPOw3I$zD$of!83b%@^7A2M&YJs7umS9*%(lti!q From f7d125aa5eaf333b9b111fe85399fad85bcc8acd Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 11 Jul 2022 13:14:33 +0100 Subject: [PATCH 23/61] update instructions for uploading Caresens meters via Bluetooth --- app/reducers/devices.js | 6 ++++- locales/en/translation.missing.json | 34 +++++------------------------ 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 8dd391b7ce..96539684cc 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -79,7 +79,11 @@ const devices = { enabled: {mac: true, win: true, linux: true} }, caresensble: { - instructions: i18n.t('Once paired, hold in right arrow until "BT Send" appears on the screen'), + instructions: { + text: i18n.t('For uploading instructions,'), + linkText: i18n.t('visit our support site'), + link: 'https://support.tidepool.org/hc/en-us/articles/360035332972#h_01EDCWR70ZH3WMHY4RX3SC80NX', + }, name: 'CareSens N Premier, Dual & N Plus BT (using Bluetooth)', key: 'caresensble', source: {type: 'device', driverId: 'BluetoothLE'}, diff --git a/locales/en/translation.missing.json b/locales/en/translation.missing.json index 57713aff54..32e8a34e51 100644 --- a/locales/en/translation.missing.json +++ b/locales/en/translation.missing.json @@ -1,33 +1,9 @@ { - "Plug in PDA with micro-USB": "Plug in PDA with micro-USB", + "Select CSV file downloaded from LibreView": "Select CSV file downloaded from LibreView", + "For uploading instructions,": "For uploading instructions,", + "visit our support site": "visit our support site", "Plug in meter with cable and set meter to": "Plug in meter with cable and set meter to", "PC Link Mode": "PC Link Mode", "Make sure the meter is switched off and plug in with micro-USB cable": "Make sure the meter is switched off and plug in with micro-USB cable", - "We couldn't log you in. Try again in a few minutes.": "We couldn't log you in. Try again in a few minutes.", - "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.": "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.", - "Sorry, we don't support the Libre 2 yet": "Sorry, we don't support the Libre 2 yet", - "Please correct the date/time on the linked pump.": "Please correct the date/time on the linked pump.", - "Turn meter on and make sure Bluetooth is switched on": "Turn meter on and make sure Bluetooth is switched on", - "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only.": "Your device doesn't appear to be connected. You can try using another USB cable, as some USB cables are designed to carry a signal for power only." - "Select CSV file downloaded from LibreView": "Select CSV file downloaded from LibreView", - "Preparing file": "Preparing file", - "We couldn't communicate with the meter. You may need to give Uploader": "We couldn't communicate with the meter. You may need to give Uploader", - "Couldn't connect to device.": "Couldn't connect to device.", - "Clinic Workspace": "Clinic Workspace", - "To manage your clinic workspaces and view patient invites": "To manage your clinic workspaces and view patient invites", - "login to your account in Tidepool Web": "login to your account in Tidepool Web", - "Want to use Tidepool for your private data?": "Want to use Tidepool for your private data?", - "Go to Private Workspace": "Go to Private Workspace", - "Go to Workspace": "Go to Workspace", - "clinic": "clinic", - "Can’t find a patient you are looking for?": "Can’t find a patient you are looking for?", - "Change Workspace": "Change Workspace", - "To manage {{workspace}} workspace and view patient invites, go to": "To manage {{workspace}} workspace and view patient invites, go to", - "Tidepool Web": "Tidepool Web", - "Something went wrong while creating patient account.": "Something went wrong while creating patient account.", - "Email address is already associated with another account.": "Email address is already associated with another account.", - "Private Workspace": "Private Workspace" - "Uploading Libre 2 data?": "Uploading Libre 2 data?", - "We couldn't log you in. Try again in a few minutes.": "We couldn't log you in. Try again in a few minutes.", - "Please set your LibreView date format to Year-Month-Day and export the CSV again": "Please set your LibreView date format to Year-Month-Day and export the CSV again" -} + "Turn meter on and make sure Bluetooth is switched on": "Turn meter on and make sure Bluetooth is switched on" +} \ No newline at end of file From 028a8e6776d7131d41ed3acc60e24ec6215a65f8 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 11 Jul 2022 13:18:08 +0100 Subject: [PATCH 24/61] 2.45.1-caresens-instructions.1 --- app/package.json | 2 +- lib/drivers/tandem | 1 - package.json | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) delete mode 160000 lib/drivers/tandem diff --git a/app/package.json b/app/package.json index e4993f198d..d1030fa773 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.45.1-tandem-private.2", + "version": "2.45.1-caresens-instructions.1", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/lib/drivers/tandem b/lib/drivers/tandem deleted file mode 160000 index e1dec0c59c..0000000000 --- a/lib/drivers/tandem +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e1dec0c59c9920865b23d02768ae639ea0eb60f3 diff --git a/package.json b/package.json index 09547383f0..b2af8cda9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.45.1-tandem-private.2", + "version": "2.45.1-caresens-instructions.1", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From e8e7a6fd50abbc7cdf3f634c1f05b5c14b23b59b Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 11 Jul 2022 13:32:24 +0100 Subject: [PATCH 25/61] add tandem folder back --- lib/drivers/tandem | 1 + 1 file changed, 1 insertion(+) create mode 160000 lib/drivers/tandem diff --git a/lib/drivers/tandem b/lib/drivers/tandem new file mode 160000 index 0000000000..e1dec0c59c --- /dev/null +++ b/lib/drivers/tandem @@ -0,0 +1 @@ +Subproject commit e1dec0c59c9920865b23d02768ae639ea0eb60f3 From 39c3cdae9f3a794edb709d2527706004776bb09e Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 14 Jul 2022 15:34:33 +0100 Subject: [PATCH 26/61] add support for Contour Plus Blue --- app/reducers/devices.js | 10 +++++----- lib/core/device.js | 7 ++++--- lib/drivers/bayer/bayerConstants.js | 1 + lib/drivers/bayer/bayerContourNext.js | 10 ++++++---- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 8dd391b7ce..6263510c0f 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -64,11 +64,11 @@ const devices = { source: {type: 'device', driverId: 'BayerContour'}, enabled: {mac: true, win: true, linux: true} }, - contourplusone: { - instructions: i18n.t('Plug meter into USB port'), - key: 'contourplusone', - name: 'Ascensia Contour Plus One', - source: {type: 'device', driverId: 'ContourPlusOne'}, + contourplus: { + instructions: i18n.t('Plug in meter with micro-USB'), + key: 'contourplus', + name: 'Ascensia Contour Plus One/Blue', + source: {type: 'device', driverId: 'ContourPlus'}, enabled: {mac: true, win: true, linux: true} }, caresens: { diff --git a/lib/core/device.js b/lib/core/device.js index ab8f9e36bd..ce0653fb28 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -92,7 +92,7 @@ device.deviceDrivers = { AbbottFreeStyleNeo: abbottFreeStyleNeo, BayerContourNext: bayerContourNext, BayerContour: bayerContour, - ContourPlusOne: bayerContourNext, + ContourPlus: bayerContourNext, Animas: animasDriver, Medtronic: medtronicDriver, Medtronic600: medtronic600Driver, @@ -123,7 +123,7 @@ device.deviceComms = { Tandem: serialDevice, BayerContourNext: hidDevice, BayerContour: serialDevice, - ContourPlusOne: hidDevice, + ContourPlus: hidDevice, Animas: serialDevice, Medtronic: hidDevice, Medtronic600: hidDevice, @@ -223,10 +223,11 @@ device.driverManifests = { { vendorId: 1027, productId: 24577, driver: 'ftdi' }, // FTDI cable ], }, - ContourPlusOne: { + ContourPlus: { mode: 'HID', usb: [ { vendorId: 6777, productId: 30720 }, // Ascensia Contour Plus One + { vendorId: 6777, productId: 31056 }, // Ascensia Contour Plus Blue ], }, Animas: { diff --git a/lib/drivers/bayer/bayerConstants.js b/lib/drivers/bayer/bayerConstants.js index ddc82e672c..6114bc87a9 100644 --- a/lib/drivers/bayer/bayerConstants.js +++ b/lib/drivers/bayer/bayerConstants.js @@ -50,6 +50,7 @@ export const MODELS = { Contour7220: 'Contour', Contour7600: 'Contour Plus', Contour7900: 'Contour Next', + Contour7950: 'Contour Plus Blue', }; export const COMMANDS = { diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index 02141dc0a8..f347c5d0f0 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -44,7 +44,7 @@ module.exports = function (config) { cfg.tzoUtil = new TZOUtil(cfg.timezone, new Date().toISOString(), []); _.assign(cfg.deviceInfo, { tags : ['bgm'], - manufacturers : ['Bayer'] + manufacturers : ['Bayer', 'Ascensia'] }); var messageBuffer = { @@ -504,7 +504,9 @@ module.exports = function (config) { }); }, eot: function(callback) { - if (cfg.deviceInfo.model !== 'Contour Next One' || cfg.deviceInfo.model !== 'Contour Next One') { + if ((cfg.deviceInfo.model !== 'Contour Next One') && + (cfg.deviceInfo.model !== 'Contour Plus One') && + (cfg.deviceInfo.model !== 'Contour Plus Blue')) { bcnCommandResponse(buildPacket([constants.ASCII_CONTROL.EOT], 1), false, function (err, result) { if(err) { return cb(err, null); @@ -698,8 +700,8 @@ module.exports = function (config) { if(cfg.deviceInfo.model == null) { cfg.deviceInfo.model = 'Unknown Bayer model'; } - if (cfg.deviceInfo.driverId === 'ContourPlusOne') { - // Contour Next one and Contour Plus One share the same model number, + if (cfg.deviceInfo.driverId === 'ContourPlus' && cfg.deviceInfo.model === 'Contour Next One') { + // Contour Next One and Contour Plus One share the same model number, // so we distinguish between the two use the driver ID cfg.deviceInfo.model = 'Contour Plus One'; } From ef3075da464cb9833140b9c50c7a2f517b0b977d Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 14 Jul 2022 15:35:23 +0100 Subject: [PATCH 27/61] v2.46.0-contour-plus-blue.1 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 474d3ff9ec..2e479cf3f7 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0", + "version": "2.46.0-contour-plus-blue.1", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 139783d56f..d7a668d420 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0", + "version": "2.46.0-contour-plus-blue.1", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From d50111b4994f228c39c7005ad70bbc5e277f44a0 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 3 Aug 2022 12:44:27 +0100 Subject: [PATCH 28/61] on MacOS a configuration may already be selected --- lib/drivers/roche/accuChekUSB.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/drivers/roche/accuChekUSB.js b/lib/drivers/roche/accuChekUSB.js index 5aeb39b4b5..052d40ea57 100644 --- a/lib/drivers/roche/accuChekUSB.js +++ b/lib/drivers/roche/accuChekUSB.js @@ -69,8 +69,11 @@ class AccuChekUSB { await this.usbDevice.open(); this.usbDevice.reset(); - await this.usbDevice.selectConfiguration(1); - + if (this.usbDevice.configuration === null) { + debug('Selecting configuration 1'); + await this.usbDevice.selectConfiguration(1); + } + if (this.usbDevice.configuration.interfaces == null) { throw new Error('Please unplug device and retry.'); } From f21a2de3e7d0ceae5fd2a98f7ee76f081a807c2a Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 3 Aug 2022 12:45:03 +0100 Subject: [PATCH 29/61] v2.46.0-electron-v16.12 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 1f8f84c2d8..8a3400415e 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.11", + "version": "2.46.0-electron-v16.12", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index d27950a54a..3b11bdbfa1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.11", + "version": "2.46.0-electron-v16.12", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 0db9d2f7365bbc7e5860d5bf39ef655d3156a406 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 3 Aug 2022 13:06:35 +0100 Subject: [PATCH 30/61] fix linting --- lib/drivers/roche/accuChekUSB.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/drivers/roche/accuChekUSB.js b/lib/drivers/roche/accuChekUSB.js index 052d40ea57..b05926b31c 100644 --- a/lib/drivers/roche/accuChekUSB.js +++ b/lib/drivers/roche/accuChekUSB.js @@ -73,7 +73,7 @@ class AccuChekUSB { debug('Selecting configuration 1'); await this.usbDevice.selectConfiguration(1); } - + if (this.usbDevice.configuration.interfaces == null) { throw new Error('Please unplug device and retry.'); } From 7a217a596f67e7ceaf3ed25a4a3494d56a2a6f1f Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 3 Aug 2022 13:48:27 +0100 Subject: [PATCH 31/61] remove reset() that breaks MacOS --- lib/drivers/roche/accuChekUSB.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/drivers/roche/accuChekUSB.js b/lib/drivers/roche/accuChekUSB.js index b05926b31c..74a1d0a1f1 100644 --- a/lib/drivers/roche/accuChekUSB.js +++ b/lib/drivers/roche/accuChekUSB.js @@ -67,7 +67,6 @@ class AccuChekUSB { try { await this.usbDevice.open(); - this.usbDevice.reset(); if (this.usbDevice.configuration === null) { debug('Selecting configuration 1'); From 26c47c3f7020b98bd5dfc47543d4db48f78f3ee4 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 15 Aug 2022 12:46:28 +0100 Subject: [PATCH 32/61] fix timeout on accu-chek meters --- lib/drivers/roche/accuChekUSB.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/drivers/roche/accuChekUSB.js b/lib/drivers/roche/accuChekUSB.js index 74a1d0a1f1..f1199c8389 100644 --- a/lib/drivers/roche/accuChekUSB.js +++ b/lib/drivers/roche/accuChekUSB.js @@ -45,8 +45,8 @@ class AccuChekUSB { this.cfg = cfg; } - static get TIMEOUT() { - return 5000; + static timeout(delay = 5000) { + return new Promise((resolve, reject) => setTimeout(reject, delay, new Error('Timeout error'))); } // eslint-disable-next-line consistent-return @@ -102,7 +102,11 @@ class AccuChekUSB { }; await this.usbDevice.controlTransferIn(getStatus, 2); - const incoming = await this.usbDevice.transferIn(this.usbDevice.usbconfig.inEPnum, 128); + + const incoming = await Promise.race([ + AccuChekUSB.timeout(), + this.usbDevice.transferIn(this.usbDevice.usbconfig.inEPnum, 128), + ]); debug('Received association request:', common.bytes2hex(new Uint8Array(incoming.data.buffer), true)); await this.usbDevice.transferOut( @@ -112,7 +116,7 @@ class AccuChekUSB { return cb(null); } catch (error) { - if (error.message === 'LIBUSB_TRANSFER_TIMED_OUT') { // FIXME + if (error.message === 'Timeout error') { error.code = 'E_UNPLUG_AND_RETRY'; } debug('Error:', error); From d9b17052ca885fd5765c9edd2d4fa892f2c670b4 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 15 Aug 2022 13:28:06 +0100 Subject: [PATCH 33/61] add FTDI cable support for ReliOn Premier driver and Glucocard Expression --- lib/core/driverManifests.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/core/driverManifests.js b/lib/core/driverManifests.js index 2ff1894d45..2e56e695d3 100644 --- a/lib/core/driverManifests.js +++ b/lib/core/driverManifests.js @@ -178,6 +178,7 @@ const driverManifests = { mode: 'serial', usb: [ { vendorId: 1027, productId: 24597, driver: 'ftdi' }, // FT230x + { vendorId: 1027, productId: 24577, driver: 'ftdi' }, // FTDI cable ], }, GlucocardShine: { @@ -191,6 +192,7 @@ const driverManifests = { bitrate: 19200, usb: [ { vendorId: 1659, productId: 8963, driver: 'pl2303' }, + { vendorId: 1027, productId: 24577, driver: 'ftdi' }, // FTDI cable ], }, GlucocardShineHID: { From 9fc6ff42170e0080dc9373007de3f766c459d3e3 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 15 Aug 2022 13:28:35 +0100 Subject: [PATCH 34/61] v2.46.0-electron-v16.13 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 8a3400415e..cd7e2e0c79 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.12", + "version": "2.46.0-electron-v16.13", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 3b11bdbfa1..5eb2da101f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.12", + "version": "2.46.0-electron-v16.13", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 74c30a8c91e4cd9add4bd56b1ac35ed4b024b5e5 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 16 Aug 2022 11:07:46 +0100 Subject: [PATCH 35/61] added FTDI cable support for Glucocard Shine driver --- lib/core/driverManifests.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/core/driverManifests.js b/lib/core/driverManifests.js index 2e56e695d3..04b160cf82 100644 --- a/lib/core/driverManifests.js +++ b/lib/core/driverManifests.js @@ -185,6 +185,7 @@ const driverManifests = { mode: 'serial', usb: [ { vendorId: 1027, productId: 24597, driver: 'ftdi' }, // FT230x + { vendorId: 1027, productId: 24577, driver: 'ftdi' }, // FTDI cable ], }, GlucocardExpression: { From cdd96e9ee3769828209476f28122c4daad626f18 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 16 Aug 2022 11:39:31 +0100 Subject: [PATCH 36/61] update icon paths --- app/utils/drivers.darwin.js | 3 +-- resources/mac/sudo-askpass.osascript.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/utils/drivers.darwin.js b/app/utils/drivers.darwin.js index df446b586b..1588729b8c 100644 --- a/app/utils/drivers.darwin.js +++ b/app/utils/drivers.darwin.js @@ -73,13 +73,12 @@ export function checkVersion(dispatch) { const appFolder = path.dirname(remote.app.getAppPath()); let helperPath = path.join(appFolder, 'driver/helpers/'); let driverPath = path.join(appFolder, 'driver/'); - let iconsPath = path.join(appFolder, '/Tidepool Uploader.icns'); + let iconsPath = path.join(appFolder, '/icon.icns'); let scriptPath = path.join(appFolder, 'driver/updateDrivers.sh'); if (!remote.app.isPackaged) { driverPath = path.resolve(appFolder, 'build/driver/'); helperPath = path.join(appFolder, 'resources/mac/helpers/'); - iconsPath = path.join(appFolder, 'resources/icon.icns'); scriptPath = path.resolve(appFolder, 'resources/mac/updateDrivers.sh'); } diff --git a/resources/mac/sudo-askpass.osascript.js b/resources/mac/sudo-askpass.osascript.js index 02a0ab824b..3042ba6cd8 100755 --- a/resources/mac/sudo-askpass.osascript.js +++ b/resources/mac/sudo-askpass.osascript.js @@ -26,7 +26,7 @@ app.includeStandardAdditions = true const result = app.displayDialog('Please enter your computer password to allow Tidepool Uploader to access your OneTouch meter.', { defaultAnswer: '', - withIcon: Path('/Applications/Tidepool\ Uploader.app/Contents/Resources/Tidepool\ Uploader.icns'), + withIcon: Path('/Applications/Tidepool\ Uploader.app/Contents/Resources/icon.icns'), buttons: ['Cancel', 'Why do I need to do this?', 'OK'], defaultButton: 'OK', hiddenAnswer: true, From ce3467f02ef6d5c4fef0a10c47fc0342aeaabee0 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 16 Aug 2022 11:39:51 +0100 Subject: [PATCH 37/61] v2.46.0-electron-v16.14 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index cd7e2e0c79..a1fd18f80f 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.13", + "version": "2.46.0-electron-v16.14", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 5eb2da101f..d1f51aeec6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.13", + "version": "2.46.0-electron-v16.14", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 7b82d580efd1d697eb127f14343eb24caf668da6 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 16 Aug 2022 14:08:21 +0100 Subject: [PATCH 38/61] log when notarizing starts --- scripts/notarize.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/notarize.js b/scripts/notarize.js index 54ef909fc8..661995c968 100644 --- a/scripts/notarize.js +++ b/scripts/notarize.js @@ -8,6 +8,8 @@ exports.default = async function notarizing(context) { const appName = context.packager.appInfo.productFilename; + console.log(`Notarizing ${appName}`); + return await notarize({ appBundleId: 'org.tidepool.TidepoolUploader', appPath: `${appOutDir}/${appName}.app`, From 2efdbe57f83df5f1325af8f1432e1d3b75a36a37 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 6 Sep 2022 16:23:34 +0100 Subject: [PATCH 39/61] update sundial --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1f51aeec6..df6c79c257 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "source-map-support": "0.5.21", "stack-trace": "0.0.10", "sudo-prompt": "9.2.1", - "sundial": "1.7.0-update-deps.1", + "sundial": "1.7.0-update-deps.2", "tidepool-platform-client": "0.48.0", "usb-cdc-acm": "0.1.1", "uuid": "8.3.2", From 6264e5cf29d85c662c389d3b86684cc3e572b7af Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 6 Sep 2022 16:26:26 +0100 Subject: [PATCH 40/61] 2.46.0-electron-v16.15 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index a1fd18f80f..5b43a8b9bc 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.14", + "version": "2.46.0-electron-v16.15", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index d1f51aeec6..0d9b31589d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.14", + "version": "2.46.0-electron-v16.15", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 7d1e80aac9535e3abc1178afcf7f2e3bb81c4f0f Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 6 Sep 2022 16:31:15 +0100 Subject: [PATCH 41/61] fix lockfile --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index dd9988b500..1c71aa1b8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11997,10 +11997,10 @@ moment-timezone@0.4.1: dependencies: moment ">= 2.6.0" -moment-timezone@0.5.33: - version "0.5.33" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" - integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== +moment-timezone@0.5.37: + version "0.5.37" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.37.tgz#adf97f719c4e458fdb12e2b4e87b8bec9f4eef1e" + integrity sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg== dependencies: moment ">= 2.9.0" @@ -16277,12 +16277,12 @@ sundial@1.6.0: dependencies: moment-timezone "0.4.1" -sundial@1.7.0-update-deps.1: - version "1.7.0-update-deps.1" - resolved "https://registry.yarnpkg.com/sundial/-/sundial-1.7.0-update-deps.1.tgz#d9bbac556ff089a9e7fcea6f2a34ec9d2c2e46e3" - integrity sha512-oLv0SsRpqa7uZnowqKWl/TV7tmIMzCjjRW10no2iAhnm9j/f7CzHP1vBPo4jRcQwfc9MSPL7u1lanKOgoyWcrg== +sundial@1.7.0-update-deps.2: + version "1.7.0-update-deps.2" + resolved "https://registry.yarnpkg.com/sundial/-/sundial-1.7.0-update-deps.2.tgz#b3b71299913b4a8c38c5d9f55b3cceb87d67daa2" + integrity sha512-3z/+S28z//7wM7VkMNWNra9/joZgANYVQWAoTJXWZ9r9SGQuXdetE2+AocwPBSz3QTRlvI45NmnCij9ayEl31Q== dependencies: - moment-timezone "0.5.33" + moment-timezone "0.5.37" superagent@5.2.2: version "5.2.2" From df3264671095d8547d7e9d4dd911c30998ee81fc Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 14 Sep 2022 13:17:39 +0100 Subject: [PATCH 42/61] update config files for new local dev setup --- config/device-debug.sh | 8 ++++---- config/local.sh | 8 ++++---- config/qa1.sh | 7 +++++++ config/qa2.sh | 7 +++++++ config/ui-debug.sh | 8 ++++---- 5 files changed, 26 insertions(+), 12 deletions(-) create mode 100755 config/qa1.sh create mode 100755 config/qa2.sh diff --git a/config/device-debug.sh b/config/device-debug.sh index 5247c249d8..b9c6d5fefd 100755 --- a/config/device-debug.sh +++ b/config/device-debug.sh @@ -1,7 +1,7 @@ -export API_URL='http://localhost:3000' -export UPLOAD_URL='http://localhost:3000' -export DATA_URL='http://localhost:3000/dataservices' -export BLIP_URL='http://localhost:3000' +export API_URL='http://localhost:31500' +export UPLOAD_URL='http://localhost:31500' +export DATA_URL='http://localhost:31500/dataservices' +export BLIP_URL='http://localhost:31500' export DEBUG_ERROR=true export REDUX_LOG=false export REDUX_DEV_UI=false diff --git a/config/local.sh b/config/local.sh index 38b19896b9..5ebcff17f7 100755 --- a/config/local.sh +++ b/config/local.sh @@ -1,7 +1,7 @@ -export API_URL='http://localhost:3000' -export UPLOAD_URL='http://localhost:3000' -export DATA_URL='http://localhost:3000/dataservices' -export BLIP_URL='http://localhost:3000' +export API_URL='http://localhost:31500' +export UPLOAD_URL='http://localhost:31500' +export DATA_URL='http://localhost:31500/dataservices' +export BLIP_URL='http://localhost:31500' export DEBUG_ERROR=false export REDUX_LOG=false export REDUX_DEV_UI=false diff --git a/config/qa1.sh b/config/qa1.sh new file mode 100755 index 0000000000..fda7a091b6 --- /dev/null +++ b/config/qa1.sh @@ -0,0 +1,7 @@ +export API_URL='https://qa1.development.tidepool.org' +export UPLOAD_URL='https://qa1.development.tidepool.org' +export BLIP_URL='https://qa1.development.tidepool.org' +export DATA_URL='https://qa1.development.tidepool.org/dataservices' +export DEBUG_ERROR=true +export REDUX_LOG=true +export REDUX_DEV_UI=true diff --git a/config/qa2.sh b/config/qa2.sh new file mode 100755 index 0000000000..fa755b47f1 --- /dev/null +++ b/config/qa2.sh @@ -0,0 +1,7 @@ +export API_URL='https://qa2.development.tidepool.org' +export UPLOAD_URL='https://qa2.development.tidepool.org' +export BLIP_URL='https://qa2.development.tidepool.org' +export DATA_URL='https://qa2.development.tidepool.org/dataservices' +export DEBUG_ERROR=true +export REDUX_LOG=true +export REDUX_DEV_UI=true diff --git a/config/ui-debug.sh b/config/ui-debug.sh index cc6f836354..7d8789ae26 100755 --- a/config/ui-debug.sh +++ b/config/ui-debug.sh @@ -1,7 +1,7 @@ -export API_URL='http://localhost:3000' -export UPLOAD_URL='http://localhost:3000' -export DATA_URL='http://localhost:3000/dataservices' -export BLIP_URL='http://localhost:3000' +export API_URL='http://localhost:31500' +export UPLOAD_URL='http://localhost:31500' +export DATA_URL='http://localhost:31500/dataservices' +export BLIP_URL='http://localhost:31500' export DEBUG_ERROR=false export REDUX_LOG=true export REDUX_DEV_UI=true From ac4bb881dce22e981693bb293634c605aef525a3 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 14 Sep 2022 13:17:39 +0100 Subject: [PATCH 43/61] update config files for new local dev setup --- config/device-debug.sh | 8 ++++---- config/local.sh | 8 ++++---- config/qa1.sh | 7 +++++++ config/qa2.sh | 7 +++++++ config/ui-debug.sh | 8 ++++---- 5 files changed, 26 insertions(+), 12 deletions(-) create mode 100755 config/qa1.sh create mode 100755 config/qa2.sh diff --git a/config/device-debug.sh b/config/device-debug.sh index 5247c249d8..b9c6d5fefd 100755 --- a/config/device-debug.sh +++ b/config/device-debug.sh @@ -1,7 +1,7 @@ -export API_URL='http://localhost:3000' -export UPLOAD_URL='http://localhost:3000' -export DATA_URL='http://localhost:3000/dataservices' -export BLIP_URL='http://localhost:3000' +export API_URL='http://localhost:31500' +export UPLOAD_URL='http://localhost:31500' +export DATA_URL='http://localhost:31500/dataservices' +export BLIP_URL='http://localhost:31500' export DEBUG_ERROR=true export REDUX_LOG=false export REDUX_DEV_UI=false diff --git a/config/local.sh b/config/local.sh index 38b19896b9..5ebcff17f7 100755 --- a/config/local.sh +++ b/config/local.sh @@ -1,7 +1,7 @@ -export API_URL='http://localhost:3000' -export UPLOAD_URL='http://localhost:3000' -export DATA_URL='http://localhost:3000/dataservices' -export BLIP_URL='http://localhost:3000' +export API_URL='http://localhost:31500' +export UPLOAD_URL='http://localhost:31500' +export DATA_URL='http://localhost:31500/dataservices' +export BLIP_URL='http://localhost:31500' export DEBUG_ERROR=false export REDUX_LOG=false export REDUX_DEV_UI=false diff --git a/config/qa1.sh b/config/qa1.sh new file mode 100755 index 0000000000..fda7a091b6 --- /dev/null +++ b/config/qa1.sh @@ -0,0 +1,7 @@ +export API_URL='https://qa1.development.tidepool.org' +export UPLOAD_URL='https://qa1.development.tidepool.org' +export BLIP_URL='https://qa1.development.tidepool.org' +export DATA_URL='https://qa1.development.tidepool.org/dataservices' +export DEBUG_ERROR=true +export REDUX_LOG=true +export REDUX_DEV_UI=true diff --git a/config/qa2.sh b/config/qa2.sh new file mode 100755 index 0000000000..fa755b47f1 --- /dev/null +++ b/config/qa2.sh @@ -0,0 +1,7 @@ +export API_URL='https://qa2.development.tidepool.org' +export UPLOAD_URL='https://qa2.development.tidepool.org' +export BLIP_URL='https://qa2.development.tidepool.org' +export DATA_URL='https://qa2.development.tidepool.org/dataservices' +export DEBUG_ERROR=true +export REDUX_LOG=true +export REDUX_DEV_UI=true diff --git a/config/ui-debug.sh b/config/ui-debug.sh index cc6f836354..7d8789ae26 100755 --- a/config/ui-debug.sh +++ b/config/ui-debug.sh @@ -1,7 +1,7 @@ -export API_URL='http://localhost:3000' -export UPLOAD_URL='http://localhost:3000' -export DATA_URL='http://localhost:3000/dataservices' -export BLIP_URL='http://localhost:3000' +export API_URL='http://localhost:31500' +export UPLOAD_URL='http://localhost:31500' +export DATA_URL='http://localhost:31500/dataservices' +export BLIP_URL='http://localhost:31500' export DEBUG_ERROR=false export REDUX_LOG=true export REDUX_DEV_UI=true From 7fbf8034915b49f27c09efc2fe8ed70cdd592e41 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 14 Sep 2022 16:46:07 +0100 Subject: [PATCH 44/61] handle thresholds from contour meters in mmol/L --- lib/commonFunctions.js | 8 +++++++- lib/drivers/bayer/bayerContourNext.js | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/commonFunctions.js b/lib/commonFunctions.js index f5ea615479..2d79bf4b50 100644 --- a/lib/commonFunctions.js +++ b/lib/commonFunctions.js @@ -24,6 +24,8 @@ var rollbar =require('../app/utils/rollbar'); var isBrowser = typeof window !== 'undefined'; var moment = require('moment'); +var GLUCOSE_MM = 18.01559; + /** * Computes the number of milliseconds after midnight on the date specified. * @@ -85,12 +87,16 @@ exports.getName = function (list, idx) { }; exports.convertBackToMmol = function(n) { - var GLUCOSE_MM = 18.01559; var inMmol = n / GLUCOSE_MM; // return a value with a single significant digit return Math.floor(inMmol * 10 + 0.5) / 10; }; +exports.convertToMgDl = function(n) { + // return a integer value + return Math.round(n * GLUCOSE_MM); +} + exports.finalScheduledBasal = function(currBasal, settings, source) { var millisInDay = sundial.getMsFromMidnight(currBasal.time, currBasal.timezoneOffset); var basalSched = settings.basalSchedules[currBasal.scheduleName]; diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index f347c5d0f0..f277489771 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -125,6 +125,7 @@ module.exports = function (config) { // 7830H5001733 -> 5001733 var sNum = pInfo[2].match(/^\d+[\w-]\s*(\w+)/); var threshold = null; + var units = null; var thrs = pString[5].split('^'); for (var i = 0; i < thrs.length; i++) { @@ -133,6 +134,9 @@ module.exports = function (config) { threshold = thrs[i].match(/^.+\=(\d{2})(\d{3})/); break; } + if (val[1] === 'U') { + units = parseInt(thrs[i][2]); + } } var jsDate = sundial.parseFromFormat(pString[13], 'YYYYMMDDhhmmss'); @@ -153,6 +157,12 @@ module.exports = function (config) { devInfo.hiThreshold = 600; } + if (units == 1) { + // thresholds must always be in mg/dL + devInfo.lowThreshold = common.convertToMgDl(devInfo.lowThreshold / 10.0); + devInfo.hiThreshold = common.convertToMgDl(devInfo.hiThreshold / 10.0); + } + callback(null, devInfo); }; From 8d7a8ca4477ec7c246ee7afd47467d0a2ade6120 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 14 Sep 2022 16:46:53 +0100 Subject: [PATCH 45/61] v2.46.0-contour-plus-blue.2 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 2e479cf3f7..da65fe71f0 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-contour-plus-blue.1", + "version": "2.46.0-contour-plus-blue.2", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index d7a668d420..e4d9dc46b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-contour-plus-blue.1", + "version": "2.46.0-contour-plus-blue.2", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 0e0bbcc1bcb851e9f7cbff6b22a11d10a8209734 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 14 Sep 2022 16:57:27 +0100 Subject: [PATCH 46/61] fix linting issues --- lib/commonFunctions.js | 2 +- lib/drivers/bayer/bayerContourNext.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/commonFunctions.js b/lib/commonFunctions.js index 2d79bf4b50..f6db078223 100644 --- a/lib/commonFunctions.js +++ b/lib/commonFunctions.js @@ -95,7 +95,7 @@ exports.convertBackToMmol = function(n) { exports.convertToMgDl = function(n) { // return a integer value return Math.round(n * GLUCOSE_MM); -} +}; exports.finalScheduledBasal = function(currBasal, settings, source) { var millisInDay = sundial.getMsFromMidnight(currBasal.time, currBasal.timezoneOffset); diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index f277489771..9cbbfe364d 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -135,7 +135,7 @@ module.exports = function (config) { break; } if (val[1] === 'U') { - units = parseInt(thrs[i][2]); + units = parseInt(thrs[i][2], 10); } } From 3da120c3c90d6dcbed76cce5cfe545638b75d785 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 13:25:26 +0100 Subject: [PATCH 47/61] fix verio uploads on windows --- lib/core/device.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/device.js b/lib/core/device.js index 748f560a5c..a2235c2615 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -375,7 +375,7 @@ device.detect = (driverId, options, cb) => { return cb(null, devdata); }); })().catch((error) => { - if (webUSBDevice == null && driverId === 'InsuletOmniPod') { + if (webUSBDevice == null && (driverId === 'InsuletOmniPod' || driverId === 'OneTouchVerio')) { // could also be block mode device device.deviceInfoCache[driverId] = _.cloneDeep(devdata); device.detectHelper(driverId, options, (err) => { From 97d3b214e3c492291d6c9b3a1032b204f2f44b72 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 13:27:28 +0100 Subject: [PATCH 48/61] v2.46.0-electron-v16.16 --- app/package.json | 2 +- lib/drivers/tandem | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/package.json b/app/package.json index 5b43a8b9bc..16c785999e 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.15", + "version": "2.46.0-electron-v16.16", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/lib/drivers/tandem b/lib/drivers/tandem index 076a3b3ad2..e1dec0c59c 160000 --- a/lib/drivers/tandem +++ b/lib/drivers/tandem @@ -1 +1 @@ -Subproject commit 076a3b3ad25afbe702899cc3966ed6eeb7e13922 +Subproject commit e1dec0c59c9920865b23d02768ae639ea0eb60f3 diff --git a/package.json b/package.json index fc8fa54a2c..c32e763eac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.15", + "version": "2.46.0-electron-v16.16", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 73e0b6ae4a6d2dd2d2839dc405ff5b61acfbab7f Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 13:54:13 +0100 Subject: [PATCH 49/61] drivelist should only be in app/package.json --- package.json | 1 - yarn.lock | 107 ++++----------------------------------------------- 2 files changed, 7 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index c32e763eac..0d2b08bc49 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "connected-react-router": "6.9.2", "core-js": "2.6.12", "cp2102": "0.0.7", - "drivelist": "11.0.0", "electron-debug": "3.2.0", "electron-is-dev": "2.0.0", "electron-log": "4.4.8", diff --git a/yarn.lock b/yarn.lock index 0dc7f9d832..ec79fff90a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4429,7 +4429,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.3.0, bindings@^1.5.0: +bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -4444,7 +4444,7 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^4.0.3, bl@^4.1.0: +bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -6443,11 +6443,6 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -6697,16 +6692,6 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== -drivelist@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-11.0.0.tgz#7bd747ab94bb9331479af45cc8ec296380283c5f" - integrity sha512-Mo1j1WyzQt8LU9UGnsarDTFYWXy0vs01xZVcn2zJfEcSMzZyE9djQtngxR7uk8rkWDDln0he0AwXqnAOapew9A== - dependencies: - bindings "^1.3.0" - debug "^4.3.4" - node-addon-api "^5.0.0" - prebuild-install "^7.1.0" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -6970,7 +6955,7 @@ encoding@^0.1.11, encoding@^0.1.12: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -7610,11 +7595,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -8434,11 +8414,6 @@ gitbook-cli@2.3.2: tmp "0.0.31" user-home "2.0.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= - github-url-from-git@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" @@ -11836,7 +11811,7 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -11961,11 +11936,6 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -12079,11 +12049,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - napi-macros@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" @@ -12142,7 +12107,7 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-abi@^3.0.0, node-abi@^3.3.0: +node-abi@^3.0.0: version "3.22.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.22.0.tgz#00b8250e86a0816576258227edbce7bbe0039362" integrity sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w== @@ -12164,11 +12129,6 @@ node-addon-api@^4.2.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== -node-addon-api@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" - integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== - node-api-version@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" @@ -13853,24 +13813,6 @@ postcss@^8.2.15: picocolors "^1.0.0" source-map-js "^1.0.1" -prebuild-install@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -14230,7 +14172,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -14469,7 +14411,7 @@ readable-stream@1.1.x, readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -15506,20 +15448,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -16337,16 +16265,6 @@ tar-fs@^1.15.3: pump "^1.0.0" tar-stream "^1.1.2" -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - tar-stream@^1.1.2, tar-stream@^1.5.4: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" @@ -16360,17 +16278,6 @@ tar-stream@^1.1.2, tar-stream@^1.5.4: to-buffer "^1.1.1" xtend "^4.0.0" -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^2.0.0, tar@~2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" From f90fac88e78ca096f7ed5ba787f9bcf866ece61b Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 14:10:34 +0100 Subject: [PATCH 50/61] Revert "drivelist should only be in app/package.json" This reverts commit 73e0b6ae4a6d2dd2d2839dc405ff5b61acfbab7f. --- package.json | 1 + yarn.lock | 107 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 101 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 0d2b08bc49..c32e763eac 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "connected-react-router": "6.9.2", "core-js": "2.6.12", "cp2102": "0.0.7", + "drivelist": "11.0.0", "electron-debug": "3.2.0", "electron-is-dev": "2.0.0", "electron-log": "4.4.8", diff --git a/yarn.lock b/yarn.lock index ec79fff90a..0dc7f9d832 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4429,7 +4429,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: +bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -4444,7 +4444,7 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^4.1.0: +bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -6443,6 +6443,11 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -6692,6 +6697,16 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== +drivelist@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-11.0.0.tgz#7bd747ab94bb9331479af45cc8ec296380283c5f" + integrity sha512-Mo1j1WyzQt8LU9UGnsarDTFYWXy0vs01xZVcn2zJfEcSMzZyE9djQtngxR7uk8rkWDDln0he0AwXqnAOapew9A== + dependencies: + bindings "^1.3.0" + debug "^4.3.4" + node-addon-api "^5.0.0" + prebuild-install "^7.1.0" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -6955,7 +6970,7 @@ encoding@^0.1.11, encoding@^0.1.12: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -7595,6 +7610,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -8414,6 +8434,11 @@ gitbook-cli@2.3.2: tmp "0.0.31" user-home "2.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + github-url-from-git@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" @@ -11811,7 +11836,7 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -11936,6 +11961,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -12049,6 +12079,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + napi-macros@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" @@ -12107,7 +12142,7 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-abi@^3.0.0: +node-abi@^3.0.0, node-abi@^3.3.0: version "3.22.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.22.0.tgz#00b8250e86a0816576258227edbce7bbe0039362" integrity sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w== @@ -12129,6 +12164,11 @@ node-addon-api@^4.2.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== +node-addon-api@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" + integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== + node-api-version@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" @@ -13813,6 +13853,24 @@ postcss@^8.2.15: picocolors "^1.0.0" source-map-js "^1.0.1" +prebuild-install@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -14172,7 +14230,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -14411,7 +14469,7 @@ readable-stream@1.1.x, readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -15448,6 +15506,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -16265,6 +16337,16 @@ tar-fs@^1.15.3: pump "^1.0.0" tar-stream "^1.1.2" +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + tar-stream@^1.1.2, tar-stream@^1.5.4: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" @@ -16278,6 +16360,17 @@ tar-stream@^1.1.2, tar-stream@^1.5.4: to-buffer "^1.1.1" xtend "^4.0.0" +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^2.0.0, tar@~2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" From ef53b3936fe8c8fc84216410dc4ac63a5fb86e00 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 15:00:08 +0100 Subject: [PATCH 51/61] fix driver manifest --- lib/core/driverManifests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/driverManifests.js b/lib/core/driverManifests.js index 652a092c9b..a85052dc2e 100644 --- a/lib/core/driverManifests.js +++ b/lib/core/driverManifests.js @@ -83,7 +83,7 @@ const driverManifests = { { vendorId: 1027, productId: 24577, driver: 'ftdi' }, // FTDI cable ], }, - ContourPlusOne: { + ContourPlus: { mode: 'HID', usb: [ { vendorId: 6777, productId: 30720 }, // Ascensia Contour Plus One From db1dcae6b0270ef4178470094b075bfef266691d Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 15:45:57 +0100 Subject: [PATCH 52/61] fix onetouch select plus on windows --- lib/core/device.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/core/device.js b/lib/core/device.js index a2235c2615..c1c41e4534 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -375,7 +375,11 @@ device.detect = (driverId, options, cb) => { return cb(null, devdata); }); })().catch((error) => { - if (webUSBDevice == null && (driverId === 'InsuletOmniPod' || driverId === 'OneTouchVerio')) { + if (webUSBDevice == null && ( + driverId === 'InsuletOmniPod' || + driverId === 'OneTouchVerio' || + driverId === 'OneTouchSelect' + )) { // could also be block mode device device.deviceInfoCache[driverId] = _.cloneDeep(devdata); device.detectHelper(driverId, options, (err) => { From 3bceb2830d3e11e516557700c2ff132d182005db Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 15:46:45 +0100 Subject: [PATCH 53/61] remove test suffix --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index da65fe71f0..474d3ff9ec 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-contour-plus-blue.2", + "version": "2.46.0", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index e4d9dc46b8..139783d56f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-contour-plus-blue.2", + "version": "2.46.0", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 3b04de23c38d728c23be44104cc414caca857f36 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 21 Sep 2022 16:28:19 +0100 Subject: [PATCH 54/61] remove test suffix --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 518e3928ea..474d3ff9ec 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-600-series-duplicate-data.1", + "version": "2.46.0", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index e68dea8518..53d66970e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-600-series-duplicate-data.1", + "version": "2.46.0", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From bab64bf0a4ffbd32cc0f797d08671c61729cf9fa Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 22 Sep 2022 09:35:59 +0100 Subject: [PATCH 55/61] v2.46.0-electron-v16.17 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index 16c785999e..c8ffb10dc6 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.16", + "version": "2.46.0-electron-v16.17", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index c32e763eac..00954efcc6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.16", + "version": "2.46.0-electron-v16.17", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 4e1955fe443bf8b06cefd7d15ed40add745d4851 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 26 Sep 2022 10:34:05 +0100 Subject: [PATCH 56/61] use limit-requests branch of tandem driver --- lib/drivers/tandem | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/drivers/tandem b/lib/drivers/tandem index e1dec0c59c..076a3b3ad2 160000 --- a/lib/drivers/tandem +++ b/lib/drivers/tandem @@ -1 +1 @@ -Subproject commit e1dec0c59c9920865b23d02768ae639ea0eb60f3 +Subproject commit 076a3b3ad25afbe702899cc3966ed6eeb7e13922 From e2fba0d96075e71913b12775590a87863d1e502d Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 26 Sep 2022 10:34:47 +0100 Subject: [PATCH 57/61] v2.46.0-electron-v16.18 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index c8ffb10dc6..574388215a 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.17", + "version": "2.46.0-electron-v16.18", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 00954efcc6..978aeb7d5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.17", + "version": "2.46.0-electron-v16.18", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 4cb3f60dd92d807da222c6c63a875ec4cabd6792 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 28 Sep 2022 10:20:10 +0100 Subject: [PATCH 58/61] remove test suffices --- app/package.json | 2 +- package.json | 4 ++-- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/package.json b/app/package.json index 574388215a..be0e12e27c 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0-electron-v16.18", + "version": "2.46.0", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 978aeb7d5f..9d67ed0c7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0-electron-v16.18", + "version": "2.46.0", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", @@ -87,7 +87,7 @@ "source-map-support": "0.5.21", "stack-trace": "0.0.10", "sudo-prompt": "9.2.1", - "sundial": "1.7.0-update-deps.2", + "sundial": "1.7.0", "tidepool-platform-client": "0.48.0", "usb-cdc-acm": "0.1.1", "uuid": "8.3.2", diff --git a/yarn.lock b/yarn.lock index 0dc7f9d832..558143d70a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16218,10 +16218,10 @@ sundial@1.6.0: dependencies: moment-timezone "0.4.1" -sundial@1.7.0-update-deps.2: - version "1.7.0-update-deps.2" - resolved "https://registry.yarnpkg.com/sundial/-/sundial-1.7.0-update-deps.2.tgz#b3b71299913b4a8c38c5d9f55b3cceb87d67daa2" - integrity sha512-3z/+S28z//7wM7VkMNWNra9/joZgANYVQWAoTJXWZ9r9SGQuXdetE2+AocwPBSz3QTRlvI45NmnCij9ayEl31Q== +sundial@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sundial/-/sundial-1.7.0.tgz#1fa049341335449a8d892f687f23b25c7f373780" + integrity sha512-XAniZ1lSJWMtG4vcsuXVpZdMfJ1JW6KGV5uGFj5h0hpG61juM33Dy39MNV9DTSaiZ87x8j479gWj3uWsSj3V2Q== dependencies: moment-timezone "0.5.37" From a8e302d2ab022b0097560df81768cda45577af48 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 28 Sep 2022 10:52:54 +0100 Subject: [PATCH 59/61] tandem changes have been merged to main --- lib/drivers/tandem | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/drivers/tandem b/lib/drivers/tandem index 076a3b3ad2..0028b5fb08 160000 --- a/lib/drivers/tandem +++ b/lib/drivers/tandem @@ -1 +1 @@ -Subproject commit 076a3b3ad25afbe702899cc3966ed6eeb7e13922 +Subproject commit 0028b5fb0887789dadea59211f56e0587f6f9097 From de72f409c9a169b57dd23d040a1ec977ad75e290 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 28 Sep 2022 10:53:04 +0100 Subject: [PATCH 60/61] v2.47.0 --- app/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/package.json b/app/package.json index be0e12e27c..3691cbf7c8 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.46.0", + "version": "2.47.0", "description": "Tidepool Project Universal Uploader", "main": "./main.prod.js", "author": { diff --git a/package.json b/package.json index 9d67ed0c7b..f01b5dad31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.46.0", + "version": "2.47.0", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.prod.js", From 2c0cc1db7494a214feea57a9902a50dc3f44508b Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 30 Sep 2022 12:19:57 +0000 Subject: [PATCH 61/61] fix: upgrade usb from 2.4.3 to 2.5.2 Snyk has created this PR to upgrade usb from 2.4.3 to 2.5.2. See this package in npm: See this project in Snyk: https://app.snyk.io/org/tidepool/project/ae26ef2f-f4cf-48b7-987b-8ea2917d443a?utm_source=github&utm_medium=referral&page=upgrade-pr --- app/package.json | 2 +- app/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/package.json b/app/package.json index be0e12e27c..e7bf6161f3 100644 --- a/app/package.json +++ b/app/package.json @@ -13,6 +13,6 @@ "drivelist": "11.0.0", "keytar": "7.9.0", "@ronomon/direct-io": "3.0.1", - "usb": "2.4.3" + "usb": "2.5.2" } } diff --git a/app/yarn.lock b/app/yarn.lock index 99d5833eaf..7eb201847e 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -318,10 +318,10 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -usb@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/usb/-/usb-2.4.3.tgz#fab8c1820276d0cb34f87a5ddba0152633d4a829" - integrity sha512-BmCjjxsriODcrb+TdXdzSDDys+MOUeRvo22ywmyIxYcuVW9YKrr2Wp2gQZUfHrQbvovKu87Po9mk5OPftJdDeQ== +usb@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/usb/-/usb-2.5.2.tgz#081b83aff83279c6d7605608880009ad698bc2c8" + integrity sha512-/7hWfbPL4ExGTQO2v2XfuKoBHDwNMoNPZmyKjsPpS4bnEY3BIsaanPpGsLmaI4MOq9pAWDrIz0DwRA8SqJ1pVQ== dependencies: "@types/w3c-web-usb" "1.0.6" node-addon-api "^4.2.0"