Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 1x 1x 1x 1x 1x | import * as utils from 'sportident/lib/utils'; import {proto} from 'sportident/lib/constants'; import {ShellCommandContext} from '../Shell'; import {BaseCommand, ArgType} from './BaseCommand'; import {getDirectOrRemoteStation} from './getDirectOrRemoteStation'; export class GetBackupCommand extends BaseCommand { getArgTypes(): ArgType[] { return [ { name: 'target', choices: ['direct', 'remote'], }, ]; } printUsage(context: ShellCommandContext): void { super.printUsage(context); context.putString('e.g. getBackup direct\n'); context.putString('e.g. getBackup remote\n'); } run(context: ShellCommandContext): Promise<void> { const device = context.env.device; Iif (!device) { return Promise.reject(new Error('No device.')); } const station = getDirectOrRemoteStation(context.args[1], device); Iif (station === undefined) { context.putString('No such station\n'); return Promise.resolve(); } const readBlock = (blockIndex: number) => ( station.sendMessage({ command: proto.cmd.GET_BACKUP, parameters: [0x00, Math.floor(blockIndex / 2) + 1, (blockIndex % 2) * 0x80, 0x80], }, 1) ); const allBlocks: number[][] = []; const readAllBlocks = (blockIndex: number): Promise<void> => { Iif (blockIndex > 26) { console.warn(allBlocks.length); console.warn(allBlocks.map((block) => utils.prettyHex(block, 16)).join('\n\n')); return Promise.resolve(); } return readBlock(blockIndex) .then((results: number[][]) => { console.warn(results[0][3] === Math.floor(blockIndex / 2) + 1); console.warn(results[0][4] === (blockIndex % 2) * 0x80); allBlocks.push(results[0].slice(5)); return readAllBlocks(blockIndex + 1); }); }; return readAllBlocks(0); } } |