Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/actions/catalog.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import { KeyboardLabelLang } from '../services/labellang/KeyLabelLangs';
import {
AbstractKeymapData,
IFirmwareBuildingTask,
isError,
isSuccessful,
} from '../services/storage/Storage';
import { KeycodeList } from '../services/hid/KeycodeList';
import {
Expand All @@ -23,6 +21,7 @@ import { ThunkAction, ThunkDispatch } from 'redux-thunk';
import { getEncoderIdList } from './utils';
import { KC_NO } from '../services/hid/KeycodeInfoList';
import { StorageActions } from './storage.action';
import { isError, isSuccessful } from '../types';

export const CATALOG_APP_ACTIONS = `@CatalogApp`;
export const CATALOG_APP_UPDATE_PHASE = `${CATALOG_APP_ACTIONS}/UpdatePhase`;
Expand Down
11 changes: 4 additions & 7 deletions src/actions/firmware.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,9 @@ import {
} from '../store/state';
import { sendEventToGoogleAnalytics } from '../utils/GoogleAnalytics';
import intelHex from 'intel-hex';
import {
IFirmware,
IFirmwareBuildingTask,
isError,
} from '../services/storage/Storage';
import { IFirmware, IFirmwareBuildingTask } from '../services/storage/Storage';
import { IBootloaderType } from '../services/firmware/Types';
import { isError } from '../types';

export const UPLOAD_FIRMWARE_DIALOG_ACTIONS = '@UploadFirmwareDialog';
export const UPLOAD_FIRMWARE_DIALOG_UPDATE_OPEN = `${UPLOAD_FIRMWARE_DIALOG_ACTIONS}/UploadOpen`;
Expand Down Expand Up @@ -317,7 +314,7 @@ export const firmwareActionsThunk = {

const writeResult = await firmwareWriter.write(
bootloaderType,
flashBytes,
new Uint8Array(flashBytes),
null,
(message, lineBreak) => {
dispatch(FlashFirmwareDialogActions.appendLog(message, lineBreak));
Expand Down Expand Up @@ -360,7 +357,7 @@ export const firmwareActionsThunk = {
handleError(error, cause);
}
);
if (!writeResult.success) {
if (isError(writeResult)) {
handleError(writeResult.error!, writeResult.cause);
return;
}
Expand Down
3 changes: 2 additions & 1 deletion src/actions/organizations.actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import { IOrganizationsPhase, RootState } from '../store/state';
import { ThunkAction, ThunkDispatch } from 'redux-thunk';
import { NotificationActions } from './actions';
import { StorageActions } from './storage.action';
import { IOrganizationMember, isError } from '../services/storage/Storage';
import { IOrganizationMember } from '../services/storage/Storage';
import { isError } from '../types';

export const ORGANIZATIONS_APP_ACTIONS = '@Organizations!App';
export const ORGANIZATIONS_APP_UPDATE_PHASE = `${ORGANIZATIONS_APP_ACTIONS}/UpdatePhase`;
Expand Down
3 changes: 1 addition & 2 deletions src/actions/storage.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ import {
IFirmwareBuildingTask,
IKeyboardDefinitionDocument,
IOrganization,
isError,
isSuccessful,
KeyboardDefinitionStatus,
SavedKeymapData,
} from '../services/storage/Storage';
Expand All @@ -43,6 +41,7 @@ import { sendEventToGoogleAnalytics } from '../utils/GoogleAnalytics';
import { CatalogAppActions } from './catalog.action';
import * as qs from 'qs';
import { IBootloaderType } from '../services/firmware/Types';
import { isError, isSuccessful } from '../types';

export const STORAGE_ACTIONS = '@Storage';
export const STORAGE_UPDATE_KEYBOARD_DEFINITION = `${STORAGE_ACTIONS}/UpdateKeyboardDefinition`;
Expand Down
12 changes: 4 additions & 8 deletions src/services/firmware/Bootloader.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { IEmptyResult, IResult } from '../../types';
import {
FirmwareWriterPhaseListener,
FirmwareWriterProgressListener,
} from './FirmwareWriter';
import { IResult } from './Types';

export interface IBootloaderReadResult extends IResult {
bytes?: Uint8Array;
}

export interface IBootloader {
read(
Expand All @@ -16,7 +12,7 @@ export interface IBootloader {
progress: FirmwareWriterProgressListener,
// eslint-disable-next-line no-unused-vars
phase: FirmwareWriterPhaseListener
): Promise<IBootloaderReadResult>;
): Promise<IResult<{ bytes: Uint8Array }>>;

write(
// eslint-disable-next-line no-unused-vars
Expand All @@ -27,7 +23,7 @@ export interface IBootloader {
progress: FirmwareWriterProgressListener,
// eslint-disable-next-line no-unused-vars
phase: FirmwareWriterPhaseListener
): Promise<IResult>;
): Promise<IEmptyResult>;

verify(
// eslint-disable-next-line no-unused-vars
Expand All @@ -36,5 +32,5 @@ export interface IBootloader {
progress: FirmwareWriterProgressListener,
// eslint-disable-next-line no-unused-vars
phase: FirmwareWriterPhaseListener
): Promise<IResult>;
): Promise<IEmptyResult>;
}
63 changes: 27 additions & 36 deletions src/services/firmware/Command.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import {
errorResultOf,
IEmptyResult,
IResult,
isError,
successResultOf,
} from '../../types';
import { ISerial } from './serial/Serial';
import { IResult } from './Types';

export interface ICommandRequest {}

export interface ICommandResponse {}

export interface ICommandResult<T> {
success: boolean;
response?: T;
error?: string;
cause?: any;
}

export interface ICommandResponseHandler<T extends ICommandResponse> {
// eslint-disable-next-line
(result: ICommandResult<T>): Promise<void>;
(result: IResult<{ response: T }>): Promise<void>;
}

export abstract class AbstractCommand<
Expand Down Expand Up @@ -44,19 +43,18 @@ export abstract class AbstractCommand<
}

// eslint-disable-next-line no-unused-vars
protected async verify(_serial: ISerial): Promise<IResult> {
return {
success: false,
error: 'Verification logic not implemented.',
};
protected async verify(_serial: ISerial): Promise<IEmptyResult> {
return errorResultOf('Verification logic not implemented.');
}

abstract createRequest(): string | Uint8Array | null;
abstract getReadBytesLength(): number;
// eslint-disable-next-line no-unused-vars
abstract createResponse(resultArray: Uint8Array): TResponse;

async writeRequest(serial: ISerial): Promise<ICommandResult<TResponse>> {
async writeRequest(
serial: ISerial
): Promise<IResult<{ response: TResponse }>> {
const request = this.createRequest();
if (request !== null) {
let writeResult;
Expand All @@ -65,12 +63,8 @@ export abstract class AbstractCommand<
} else {
writeResult = await serial.writeBytes(request as Uint8Array);
}
if (!writeResult.success) {
return {
success: false,
error: writeResult.error,
cause: writeResult.cause,
};
if (isError(writeResult)) {
return writeResult;
}
}
const readBytesLength = this.getReadBytesLength();
Expand All @@ -79,33 +73,30 @@ export abstract class AbstractCommand<
this.getReadBytesLength(),
this.getTimeout()
);
if (!readResult.success) {
return {
success: false,
error: readResult.error,
cause: readResult.cause,
};
if (isError(readResult)) {
return readResult;
}
if (this.isVerify()) {
const verifyResult = await this.verify(serial);
if (!verifyResult.success) {
if (isError(verifyResult)) {
return verifyResult;
}
}
return {
success: true,
response: this.createResponse(readResult.bytes!),
};
return successResultOf({
response: this.createResponse(readResult.value.bytes),
});
} else {
if (this.isVerify()) {
const verifyResult = await this.verify(serial);
if (!verifyResult.success) {
if (isError(verifyResult)) {
return verifyResult;
}
}
return {
success: true,
};
// No response expected, return an empty result.
console.warn('No response expected, returning an empty result.');
return successResultOf({
response: this.createResponse(new Uint8Array(0)),
});
}
}
}
9 changes: 3 additions & 6 deletions src/services/firmware/FirmwareWriter.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import { IBootloaderType, IErrorHandler, IResult } from './Types';
import { IEmptyResult } from '../../types';
import { IBootloaderType, IErrorHandler } from './Types';

export type FirmwareWriterProgressListener = (
message: string,
lineBreak?: boolean
) => void;

export interface IFirmwareWriterReadResult extends IResult {
bytes?: Uint8Array;
}

export type IFirmwareWriterPhase =
| 'opened'
| 'initialized'
Expand All @@ -28,5 +25,5 @@ export interface IFirmwareWriter {
progress: FirmwareWriterProgressListener,
phase: FirmwareWriterPhaseListener,
errorHandler: IErrorHandler
): Promise<IResult>;
): Promise<IEmptyResult>;
}
16 changes: 9 additions & 7 deletions src/services/firmware/FirmwareWriterWebApiImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import {
} from './FirmwareWriter';
import { CaterinaBootloader } from './caterina/CaterinaBootloader';
import { WebSerial } from './serial/WebSerial';
import { IBootloaderType, IErrorHandler, IResult } from './Types';
import { IBootloaderType, IErrorHandler } from './Types';
import { ISerial } from './serial/Serial';
import { IUsb } from './usb/Usb';
import WebUsb from './usb/WebUsb';
import { IBootloader } from './Bootloader';
import { DfuBootloader } from './dfu/DfuBootloader';
import { WebFileSystem } from './copy/WebFileSystem';
import { IEmptyResult, isError } from '../../types';

const BAUD_RATE = 115200;
const BUFFER_SIZE = 81920;
Expand All @@ -25,15 +26,15 @@ export class FirmwareWriterWebApiImpl implements IFirmwareWriter {
progress: FirmwareWriterProgressListener,
phase: FirmwareWriterPhaseListener,
errorHandler: IErrorHandler
): Promise<IResult> {
): Promise<IEmptyResult> {
if (bootloaderType === 'caterina') {
const serial: ISerial = new WebSerial(CHUNK_SIZE);
const openResult = await serial.open(
BAUD_RATE,
BUFFER_SIZE,
errorHandler
);
if (!openResult.success) {
if (isError(openResult)) {
return openResult;
}
phase('opened');
Expand All @@ -42,24 +43,25 @@ export class FirmwareWriterWebApiImpl implements IFirmwareWriter {
} else if (bootloaderType === 'dfu') {
const usb: IUsb = new WebUsb();
const openResult = await usb.open();
if (!openResult.success) {
if (isError(openResult)) {
return openResult;
}
phase('opened');
const createDfuBootloaderResult = DfuBootloader.createDfuBootloader(
usb,
progress
);
if (!createDfuBootloaderResult.success) {
if (isError(createDfuBootloaderResult)) {
await usb.close();
return createDfuBootloaderResult;
}
const bootloader: IBootloader = createDfuBootloaderResult.bootloader!;
const bootloader: IBootloader =
createDfuBootloaderResult.value.bootloader;
return await bootloader.write(flashBytes, eepromBytes, progress, phase);
} else if (bootloaderType === 'copy') {
const fileSystem = new WebFileSystem();
const openResult = await fileSystem.open();
if (!openResult.success) {
if (isError(openResult)) {
return openResult;
}
phase('opened');
Expand Down
6 changes: 0 additions & 6 deletions src/services/firmware/Types.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
export type IResult = {
success: boolean;
error?: string;
cause?: any;
};

export const ALL_FIRMWARE_FLASH_TYPE = ['flash', 'eeprom'] as const;
type firmwareFlashTypeTuple = typeof ALL_FIRMWARE_FLASH_TYPE;
export type FirmwareFlashType = firmwareFlashTypeTuple[number];
Expand Down
Loading
Loading