UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

265 lines (257 loc) 10.5 kB
import { VariableType } from '@iotize/tap/service/impl/variable'; import '@iotize/tap/service/impl/target'; import { GPIOMode } from '@iotize/tap/service/impl/gpio'; import { createDebugger } from '@iotize/common/debug'; const CONFIGURE_MASK = 0x80000000; const DIRECT_ACCESS_GPIO = 0x40; const DIRECT_ACCESS_GPIO_FORMAT = DIRECT_ACCESS_GPIO | VariableType.Data.INT8; const prefix = '@iotize/tap/gpio'; const debug = createDebugger(prefix); const GPIO_MAPPING = [ { index: 0, name: 'RST', connector: 'Target.10' }, { index: 1, name: 'TDI', connector: 'Target.8' }, { index: 2, name: 'TDO', connector: 'Target.6' }, { index: 3, name: 'SWDCK', connector: 'Target.4' }, { index: 4, name: 'SWDIO', connector: 'Target.2' }, { index: 5, name: 'SCL_FACTORYRST', connector: '' }, { index: 6, name: 'EXT_A2', connector: 'PA1.2' }, { index: 7, name: 'EXT_A3', connector: 'PA1.3' }, { index: 8, name: 'EXT_A4', connector: 'PA1.4' }, { index: 9, name: 'EXT_A5', connector: 'PA1.5' }, { index: 10, name: 'EXT_A6', connector: 'PA1.6' }, { index: 11, name: 'EXT_A7', connector: 'PA1.7' }, { index: 12, name: 'EXT_A8', connector: 'PA1.8' }, { index: 13, name: 'EXT_A9', connector: 'PA1.9' }, { index: 14, name: 'EXT_A10', connector: 'PA1.10' }, { index: 15, name: 'EXT_A11', connector: 'PA1.11' }, { index: 16, name: 'EXT_B2', connector: 'PA2.2' }, { index: 17, name: 'EXT_B3', connector: 'PA2.3' }, { index: 18, name: 'EXT_B4', connector: 'PA2.4' }, { index: 19, name: 'EXT_B5', connector: 'PA2.5' }, { index: 20, name: 'EXT_B6', connector: 'PA2.6' }, { index: 21, name: 'EXT_B7', connector: 'PA2.7' }, { index: 22, name: 'EXT_B8', connector: 'PA2.8' }, { index: 23, name: 'EXT_B9', connector: 'PA2.9' }, { index: 24, name: 'EXT_B10', connector: 'PA2.10' }, { index: 25, name: 'EXT_B11', connector: 'PA2.11' }, ]; const ASCENDING_SORT_NUMBER = (a, b) => a - b; const ɵ0 = ASCENDING_SORT_NUMBER; // export function encodeGPIOWriteConfig(options: GPIOWriteConfig) { // if (options.indexs.length === 0) { // throw new Error(`Invalid GPIO config. You must give at least one pin index`); // } // const indexes = options.indexs.sort(); // const data = encodeMultiGPIOData(indexes, options.mode); // return { // data, // info: encodeMultiAddressInfo(indexes, true) // }; // } function encodeMultiAddressInfo(indexes, configure = false) { indexes = indexes.sort(ASCENDING_SORT_NUMBER); const firstIndex = indexes[0]; const lastIndex = indexes[indexes.length - 1]; const length = lastIndex - firstIndex + 1; return { address: (configure ? CONFIGURE_MASK : 0) | firstIndex, format: DIRECT_ACCESS_GPIO_FORMAT, length, }; } function encodeMultiIndexData(indexValues) { const indexes = indexValues.map((v) => v.index).sort(ASCENDING_SORT_NUMBER); const firstIndex = indexes[0]; const data = []; const lastIndex = indexes[indexes.length - 1]; for (let pinIndex = firstIndex, loopIndex = 0; pinIndex <= lastIndex; pinIndex++, loopIndex++) { const indexValue = indexValues.find((v) => v.index == pinIndex); if (indexValue) { data[loopIndex] = indexValue.value === true ? 1 : indexValue.value === false ? 0 : indexValue.value; } else { data[loopIndex] = 0xff; } } return Uint8Array.from(data); } // export function encodeMultiGPIOData(indexes: number[], value: number): Uint8Array { // indexes = indexes.sort(ASCENDING_SORT_NUMBER); // const firstIndex = indexes[0]; // const data: number[] = []; // const lastIndex = indexes[indexes.length - 1]; // for (let pinIndex = firstIndex, loopIndex = 0; pinIndex <= lastIndex; pinIndex++, loopIndex++) { // if (indexes.indexOf(pinIndex) >= 0) { // data[loopIndex] = value; // } // else { // data[loopIndex] = 0xFF; // } // } // return Uint8Array.from(data); // } var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class GPIOManager { constructor(tap) { this.tap = tap; this._cache = {}; } getPinByIndex(index) { if (!(index in this._cache)) { this._cache[index] = new GPIOPin(this.tap, index); } return this._cache[index]; } /** * TODO min api version ? * @param options */ readValues(indexs) { return __awaiter(this, void 0, void 0, function* () { return this._readMuliple(indexs || GPIO_MAPPING.map((pin) => pin.index), false); }); } /** * TODO min api version ? * @param options */ readConfig(indexs) { return __awaiter(this, void 0, void 0, function* () { return this._readMuliple(indexs || GPIO_MAPPING.map((pin) => pin.index), true); }); } _readMuliple(indexs, config) { return __awaiter(this, void 0, void 0, function* () { const memoryInfo = encodeMultiAddressInfo(indexs, config); const results = (yield this.tap.service.target.readAddress(memoryInfo)).body(); const formwattedResult = Array.from(results).map((v, index) => { return { index: memoryInfo.address + index, value: (config ? v : !!v), }; }); return formwattedResult; }); } writeValues(indexValues) { return __awaiter(this, void 0, void 0, function* () { if (typeof indexValues === 'boolean') { indexValues = GPIO_MAPPING.map((pin) => ({ index: pin.index, value: indexValues, })); } const indexs = indexValues.map((info) => info.index); const memoryInfo = encodeMultiAddressInfo(indexs); const encodedData = encodeMultiIndexData(indexValues); (yield this.tap.service.target.writeAddress({ data: encodedData, info: memoryInfo, })).successful(); }); } /** * TODO min api version ? * @param options */ writeConfig(indexValues) { return __awaiter(this, void 0, void 0, function* () { if (typeof indexValues === 'number') { indexValues = GPIO_MAPPING.map((pin) => ({ index: pin.index, value: indexValues, })); } const indexs = indexValues.map((info) => info.index); const memoryInfo = encodeMultiAddressInfo(indexs, true); const encodedData = encodeMultiIndexData(indexValues); (yield this.tap.service.target.writeAddress({ data: encodedData, info: memoryInfo, })).successful(); }); } } function pinIndexToConfigureAddress(index) { return (CONFIGURE_MASK | index) >>> 0; } class GPIOPin { constructor(tap, index) { this.tap = tap; this.index = index; } readConfig() { return __awaiter(this, void 0, void 0, function* () { debug(`Read config for pin=${this.index}...`); const body = (yield this.tap.service.target.readAddress({ address: pinIndexToConfigureAddress(this.index), format: DIRECT_ACCESS_GPIO_FORMAT, length: 1, })).body(); // TODO check body.length >= 1 return body[0]; }); } writeConfig(options) { return __awaiter(this, void 0, void 0, function* () { if (!(options.mode in GPIOMode)) { throw new Error(`Unknown mode GPIO mode ${options.mode}`); } debug(`writeConfig on pin=${this.index}`, GPIOMode[options.mode]); (yield this.tap.service.target.writeAddress({ data: Uint8Array.from([options.mode]), info: { address: pinIndexToConfigureAddress(this.index), format: DIRECT_ACCESS_GPIO_FORMAT, length: 1, }, })).successful(); }); } readValue() { return __awaiter(this, void 0, void 0, function* () { const rawBody = (yield this.tap.service.target.readAddress({ address: this.index, format: DIRECT_ACCESS_GPIO_FORMAT, length: 1, })).body(); if (rawBody.length !== 1) { throw new Error(`Unexpected Tap response for read Address. Should be 1 byte but received ${rawBody.length} bytes`); } const value = !!rawBody[0]; debug(`Read value for pin=${this.index} ==> ${value}`); return value; }); } writeValue(value) { return __awaiter(this, void 0, void 0, function* () { debug(`Write value on pin=${this.index}; ${value}`); return (yield this.tap.service.target.writeAddress({ data: value ? Uint8Array.from([1]) : Uint8Array.from([0]), info: { address: this.index, format: DIRECT_ACCESS_GPIO_FORMAT, length: 1, }, })).body(); }); } } /** * Generated bundle index. Do not edit. */ export { CONFIGURE_MASK, DIRECT_ACCESS_GPIO_FORMAT, GPIOManager, GPIOPin, GPIO_MAPPING }; //# sourceMappingURL=iotize-tap-gpio.js.map