import { IConfig, IDataService, IParam, IData, IGroup } from 'app/nodes/configs.interfaces'; import { CONFIG, PARAMETER_TYPE } from 'app/nodes/types'; import { createBaseParam, createBaseData } from 'app/nodes/utils'; const range = require('range').range; const ppgParam = createBaseParam({title: 'PPG Config', service: 'bf00', characteristic: 'bf05'}); const ppgData = createBaseData({title: 'PPG Data', service: 'bf00', littleEndian: true, bytesPerSample: 3, bytesPerPackage: 12}); /* config */ const greenLED = ppgParam({ name: 'Green LED', offset: 2, bits: 6 }); const redLED = ppgParam({ name: 'Red LED', offset: 2 * 8 + 2, bits: 6 }); const infraredLED = ppgParam({ name: 'Infrared LED', offset: 1 * 8 + 2, bits: 6 }); const greenOffset = ppgParam({ name: 'Green offset', offset: 3 * 8 + 3, bits: 4 }); const redOffset = ppgParam({ name: 'Red offset', offset: 5 * 8 + 3, bits: 4 }); const infraredOffset = ppgParam({ name: 'Infrared offset', offset: 4 * 8 + 3, bits: 4 }); const gain = ppgParam({ id: CONFIG.GAIN, name: 'Gain', offset: 6 * 8, bits: 3, type: PARAMETER_TYPE.DROPDOWN, values: [ { key: '10 kΩ', value: 0b101 }, { key: '25 kΩ', value: 0b100 }, { key: '50 kΩ', value: 0b011 }, { key: '100 kΩ', value: 0b010 }, { key: '250 kΩ', value: 0b001 }, { key: '500 kΩ', value: 0b000 }, { key: '1 MΩ', value: 0b110 }, { key: '2 MΩ', value: 0b111 }, ] }); const filterCapacitor = ppgParam({ id: CONFIG.FILTER_CAPACITOR, name: 'Filter capacitor', offset: 6 * 8, bits: 3, type: PARAMETER_TYPE.DROPDOWN, values: [ { key: '5 pF', value: 0b000 }, { key: '2.5 pF', value: 0b001 }, { key: '7.5 pF', value: 0b011 }, { key: '10 pF', value: 0b010 }, { key: '17.5 pF', value: 0b101 }, { key: '20.5 pF', value: 0b100 }, { key: '22.5 pF', value: 0b111 }, { key: '25 pF', value: 0b110 }, ] }); /* data */ const greenLEDData = ppgData({ name: 'PPG Green LED', characteristic: 'bf01', read: readLED }); const infraredLEDData = ppgData({ name: 'PPG Infrared LED', characteristic: 'bf02', read: readLED }); const redLEDData = ppgData({ name: 'PPG Red LED', characteristic: 'bf03', read: readLED }); /* ui grouping */ const LEDGroup: IGroup = { title: 'LED', sections: [{ title: 'Red', toggle: redLEDData, items: [ redLED, redOffset ] }, { title: 'Green', toggle: greenLEDData, items: [ greenLED, greenOffset ] }, { title: 'Infrared', toggle: infraredLEDData, items: [ infraredLED, infraredOffset ] }] }; const GainGroup: IGroup = { title: 'Gain', sections: [ { title: 'Gain', items: [ gain ] } ] }; const FilterGroup: IGroup = { title: 'Filter', sections: [ { title: 'Filter', items: [ filterCapacitor ] } ] }; /* read function */ export function readLED(buffer: Buffer): number[] { const bytesPerSample = 3; const bytesPerPackage = 12; return range(bytesPerPackage / bytesPerSample) .map(i => buffer.readIntLE(i * bytesPerSample, bytesPerSample)); } export const groups: IGroup[] = [LEDGroup, GainGroup, FilterGroup];