diff --git a/app/package-lock.json b/app/package-lock.json index 79b6785..0d011b8 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "openscan3-client", - "version": "0.6.0", + "version": "0.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openscan3-client", - "version": "0.6.0", + "version": "0.7.0", "dependencies": { "@quasar/extras": "^1.17.0", "axios": "^1.13.2", diff --git a/app/package.json b/app/package.json index c58c426..4d838ea 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "openscan3-client", - "version": "0.6.0", + "version": "0.7.0", "apiVersion": "0.9.0", "description": "Frontend client for OpenScan3 firmware devices", "productName": "OpenScan3", diff --git a/app/quasar.config.js b/app/quasar.config.js index aa0e6bd..09898ea 100644 --- a/app/quasar.config.js +++ b/app/quasar.config.js @@ -94,7 +94,13 @@ export default configure(function (/* ctx */) { // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer devServer: { // https: true - open: true // opens browser window automatically + open: true, // opens browser window automatically + watch: { + // Use polling so development still works on hosts with a low inotify + // watch limit (otherwise Vite can terminate with EMFILE). + usePolling: true, + interval: 500 + } }, // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework diff --git a/app/src/generated/api/latest/sdk.gen.ts b/app/src/generated/api/latest/sdk.gen.ts index d4e5b58..4588f05 100644 --- a/app/src/generated/api/latest/sdk.gen.ts +++ b/app/src/generated/api/latest/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -538,6 +538,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1332,7 +1368,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/latest/types.gen.ts b/app/src/generated/api/latest/types.gen.ts index a111c53..700c8e0 100644 --- a/app/src/generated/api/latest/types.gen.ts +++ b/app/src/generated/api/latest/types.gen.ts @@ -785,6 +785,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1225,6 +1263,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1357,6 +1413,52 @@ export type TriggerConfig = { pulse_width_ms?: number; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2440,6 +2542,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4003,6 +4195,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/generated/api/next/sdk.gen.ts b/app/src/generated/api/next/sdk.gen.ts index 8bdaa39..f27c663 100644 --- a/app/src/generated/api/next/sdk.gen.ts +++ b/app/src/generated/api/next/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelExternalTriggerRunEndpointData, CancelExternalTriggerRunEndpointErrors, CancelExternalTriggerRunEndpointResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateExternalTriggerRunData, CreateExternalTriggerRunErrors, CreateExternalTriggerRunResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetExternalTriggerRunData, GetExternalTriggerRunErrors, GetExternalTriggerRunPathData, GetExternalTriggerRunPathErrors, GetExternalTriggerRunPathResponses, GetExternalTriggerRunResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetTriggerData, GetTriggerErrors, GetTriggerNameSettingsData, GetTriggerNameSettingsErrors, GetTriggerNameSettingsResponses, GetTriggerResponses, GetTriggersData, GetTriggersErrors, GetTriggersResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, ListExternalTriggerRunsData, ListExternalTriggerRunsErrors, ListExternalTriggerRunsResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseExternalTriggerRunEndpointData, PauseExternalTriggerRunEndpointErrors, PauseExternalTriggerRunEndpointResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, PwmLightData, PwmLightErrors, PwmLightResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ReplaceTriggerNameSettingsData, ReplaceTriggerNameSettingsErrors, ReplaceTriggerNameSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeExternalTriggerRunEndpointData, ResumeExternalTriggerRunEndpointErrors, ResumeExternalTriggerRunEndpointResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TriggerOnceData, TriggerOnceErrors, TriggerOnceResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UpdateTriggerNameSettingsData, UpdateTriggerNameSettingsErrors, UpdateTriggerNameSettingsResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelExternalTriggerRunEndpointData, CancelExternalTriggerRunEndpointErrors, CancelExternalTriggerRunEndpointResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateExternalTriggerRunData, CreateExternalTriggerRunErrors, CreateExternalTriggerRunResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetExternalTriggerRunData, GetExternalTriggerRunErrors, GetExternalTriggerRunPathData, GetExternalTriggerRunPathErrors, GetExternalTriggerRunPathResponses, GetExternalTriggerRunResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetTriggerData, GetTriggerErrors, GetTriggerNameSettingsData, GetTriggerNameSettingsErrors, GetTriggerNameSettingsResponses, GetTriggerResponses, GetTriggersData, GetTriggersErrors, GetTriggersResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, ListExternalTriggerRunsData, ListExternalTriggerRunsErrors, ListExternalTriggerRunsResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseExternalTriggerRunEndpointData, PauseExternalTriggerRunEndpointErrors, PauseExternalTriggerRunEndpointResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, PwmLightData, PwmLightErrors, PwmLightResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ReplaceTriggerNameSettingsData, ReplaceTriggerNameSettingsErrors, ReplaceTriggerNameSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeExternalTriggerRunEndpointData, ResumeExternalTriggerRunEndpointErrors, ResumeExternalTriggerRunEndpointResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TriggerOnceData, TriggerOnceErrors, TriggerOnceResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UpdateTriggerNameSettingsData, UpdateTriggerNameSettingsErrors, UpdateTriggerNameSettingsResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -556,6 +556,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1496,7 +1532,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/next/types.gen.ts b/app/src/generated/api/next/types.gen.ts index 1473716..e015b2d 100644 --- a/app/src/generated/api/next/types.gen.ts +++ b/app/src/generated/api/next/types.gen.ts @@ -922,6 +922,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1362,6 +1400,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1557,6 +1613,52 @@ export type TriggerStatusResponse = { last_duration_ms?: number | null; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2681,6 +2783,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4673,6 +4865,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/generated/api/sdk.gen.ts b/app/src/generated/api/sdk.gen.ts index d4e5b58..4588f05 100644 --- a/app/src/generated/api/sdk.gen.ts +++ b/app/src/generated/api/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -538,6 +538,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1332,7 +1368,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/types.gen.ts b/app/src/generated/api/types.gen.ts index a111c53..700c8e0 100644 --- a/app/src/generated/api/types.gen.ts +++ b/app/src/generated/api/types.gen.ts @@ -785,6 +785,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1225,6 +1263,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1357,6 +1413,52 @@ export type TriggerConfig = { pulse_width_ms?: number; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2440,6 +2542,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4003,6 +4195,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/generated/api/v0_8/sdk.gen.ts b/app/src/generated/api/v0_8/sdk.gen.ts index 63eb5c4..1929c84 100644 --- a/app/src/generated/api/v0_8/sdk.gen.ts +++ b/app/src/generated/api/v0_8/sdk.gen.ts @@ -1249,7 +1249,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/v0_9/sdk.gen.ts b/app/src/generated/api/v0_9/sdk.gen.ts index d4e5b58..4588f05 100644 --- a/app/src/generated/api/v0_9/sdk.gen.ts +++ b/app/src/generated/api/v0_9/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -538,6 +538,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1332,7 +1368,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/v0_9/types.gen.ts b/app/src/generated/api/v0_9/types.gen.ts index a111c53..700c8e0 100644 --- a/app/src/generated/api/v0_9/types.gen.ts +++ b/app/src/generated/api/v0_9/types.gen.ts @@ -785,6 +785,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1225,6 +1263,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1357,6 +1413,52 @@ export type TriggerConfig = { pulse_width_ms?: number; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2440,6 +2542,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4003,6 +4195,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/layouts/MainLayout.vue b/app/src/layouts/MainLayout.vue index 079021b..627c523 100644 --- a/app/src/layouts/MainLayout.vue +++ b/app/src/layouts/MainLayout.vue @@ -131,6 +131,7 @@ import { useDeviceStore } from 'src/stores/device'; import { useTaskStore } from 'src/stores/tasks'; import PowerControls from 'components/PowerControls.vue'; import TaskDrawerPanel from 'components/task/TaskDrawerPanel.vue'; +import { useUpdatesStore } from 'src/stores/updates'; const upperLinks: EssentialLinkProps[] = [ { @@ -165,6 +166,15 @@ const upperLinks: EssentialLinkProps[] = [ }, ]; +const lowerLinks = computed(() => [ + { + title: 'Update', + icon: 'system_update', + link: '/update', + badge: updatesStore.updatesAvailable ? 'Updates available' : '' + } +]) + const leftDrawerOpen = ref(true) const rightDrawerOpen = ref(false) const updateInfoDialog = ref(false) @@ -175,6 +185,9 @@ void deviceStore.ensureConnected() const taskStore = useTaskStore() void taskStore.ensureConnected() +const updatesStore = useUpdatesStore() +updatesStore.startPolling() + const runningTaskCount = computed(() => taskStore.runningTasks.length) const pausedTaskCount = computed(() => taskStore.tasks.filter((task) => task.status === 'paused').length) diff --git a/app/src/pages/UpdatePage.vue b/app/src/pages/UpdatePage.vue new file mode 100644 index 0000000..45f3889 --- /dev/null +++ b/app/src/pages/UpdatePage.vue @@ -0,0 +1,703 @@ + + + + + diff --git a/app/src/router/routes.ts b/app/src/router/routes.ts index b3ccb72..59f0f39 100644 --- a/app/src/router/routes.ts +++ b/app/src/router/routes.ts @@ -10,6 +10,7 @@ const routes: RouteRecordRaw[] = [ { path: 'scan/progress/:taskId?', component: () => import('pages/ScanProgressPage.vue') }, { path: 'setup', component: () => import('pages/SetupPage.vue') }, { path: 'settings', component: () => import('pages/SettingsPage.vue') }, + { path: 'update', component: () => import('pages/UpdatePage.vue') }, { path: 'logs', component: () => import('pages/LogsPage.vue') }, { path: 'projects', component: () => import('pages/ProjectsPage.vue') }, { path: 'donate', component: () => import('pages/DonationPage.vue') }, diff --git a/app/src/stores/updates.ts b/app/src/stores/updates.ts new file mode 100644 index 0000000..0282326 --- /dev/null +++ b/app/src/stores/updates.ts @@ -0,0 +1,77 @@ +import { defineStore } from 'pinia' +import type * as latestSdk from 'src/generated/api/latest/sdk.gen' +import type { UpdateStatusResponse } from 'src/generated/api/latest/types.gen' +import { apiClient, getApiSdk, resolveApiTarget } from 'src/services/apiClient' + +const UPDATE_STATUS_REFRESH_MS = 30 * 60 * 1000 + +type UpdateSdk = Pick + +let refreshTimer: ReturnType | null = null + +function unwrapResponse(response: unknown): T { + if (response && typeof response === 'object' && 'data' in response) { + return (response as { data: T }).data + } + return response as T +} + +export const useUpdatesStore = defineStore('updates', { + state: () => ({ + updatesAvailable: false, + loading: false, + lastFetchedAt: null as number | null + }), + + actions: { + applyStatus(status: UpdateStatusResponse) { + this.updatesAvailable = status.status === 'updates_available' + this.lastFetchedAt = Date.now() + }, + + async refresh() { + if (this.loading) { + return + } + + if (resolveApiTarget() === 'v0_8') { + this.updatesAvailable = false + return + } + + this.loading = true + try { + const sdk = getApiSdk() as UpdateSdk + const status = unwrapResponse( + await sdk.getUpdateStatus({ client: apiClient }) + ) + this.applyStatus(status) + } catch (error) { + // Keep the most recently known state if the device is temporarily unavailable. + console.debug('Could not refresh update availability.', error) + } finally { + this.loading = false + } + }, + + startPolling() { + if (refreshTimer) { + return + } + + void this.refresh() + refreshTimer = window.setInterval(() => { + void this.refresh() + }, UPDATE_STATUS_REFRESH_MS) + }, + + stopPolling() { + if (!refreshTimer) { + return + } + + window.clearInterval(refreshTimer) + refreshTimer = null + } + } +}) diff --git a/openapi_latest.json b/openapi_latest.json index 57e1166..ceede64 100644 --- a/openapi_latest.json +++ b/openapi_latest.json @@ -1540,6 +1540,100 @@ } } }, + "/system/update/status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get Update Status", + "operationId": "get_update_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/check": { + "post": { + "tags": [ + "system update" + ], + "summary": "Check For Updates", + "operationId": "check_for_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/apply": { + "post": { + "tags": [ + "system update" + ], + "summary": "Apply Updates", + "operationId": "apply_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateInstallResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/repair/openscan3": { + "post": { + "tags": [ + "system repair" + ], + "summary": "Repair Openscan3", + "operationId": "repair_openscan3", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, "/projects/": { "get": { "tags": [ @@ -3723,6 +3817,18 @@ "default": "json", "title": "Format" } + }, + { + "name": "release_cameras", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras.", + "default": true, + "title": "Release Cameras" + }, + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras." } ], "responses": { @@ -3813,7 +3919,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { @@ -5703,6 +5809,77 @@ ], "title": "MotorStatusResponse" }, + "OpenScanUpdatePackage": { + "properties": { + "id": { + "type": "string", + "enum": [ + "firmware", + "client", + "updater", + "system_config", + "camera_stack" + ], + "title": "Id" + }, + "installed_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Installed Version" + }, + "available_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Available Version" + }, + "update_available": { + "type": "boolean", + "title": "Update Available" + } + }, + "type": "object", + "required": [ + "id", + "installed_version", + "available_version", + "update_available" + ], + "title": "OpenScanUpdatePackage", + "description": "One optional OpenScan component update for the details view." + }, + "OpenScanUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "packages": { + "items": { + "$ref": "#/components/schemas/OpenScanUpdatePackage" + }, + "type": "array", + "title": "Packages" + } + }, + "type": "object", + "required": [ + "updates_available", + "packages" + ], + "title": "OpenScanUpdateSummary" + }, "PathMethod": { "type": "string", "enum": [ @@ -6400,6 +6577,29 @@ "type": "object", "title": "StackingTaskStatus" }, + "SystemUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "reboot_required_after_install": { + "type": "boolean", + "title": "Reboot Required After Install" + } + }, + "type": "object", + "required": [ + "updates_available", + "count", + "reboot_required_after_install" + ], + "title": "SystemUpdateSummary" + }, "Task": { "properties": { "id": { @@ -6583,6 +6783,91 @@ ], "title": "TriggerConfig" }, + "UpdateInstallResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "completed", + "install_failed", + "install_blocked" + ], + "title": "Status" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "reboot_required" + ], + "title": "UpdateInstallResponse", + "description": "Result of a synchronous user-requested update installation." + }, + "UpdateStatusResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "unknown", + "up_to_date", + "updates_available", + "status_unavailable", + "check_failed" + ], + "title": "Status" + }, + "checked_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checked At" + }, + "stale": { + "type": "boolean", + "title": "Stale" + }, + "release_channel": { + "type": "string", + "enum": [ + "stable", + "nightly", + "unknown" + ], + "title": "Release Channel" + }, + "openscan": { + "$ref": "#/components/schemas/OpenScanUpdateSummary" + }, + "system": { + "$ref": "#/components/schemas/SystemUpdateSummary" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "checked_at", + "stale", + "release_channel", + "openscan", + "system", + "reboot_required" + ], + "title": "UpdateStatusResponse", + "description": "Cached, user-facing software update status." + }, "ValidationError": { "properties": { "loc": { diff --git a/openapi_next.json b/openapi_next.json index 9a7c0a1..0fec19c 100644 --- a/openapi_next.json +++ b/openapi_next.json @@ -1599,6 +1599,100 @@ } } }, + "/system/update/status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get Update Status", + "operationId": "get_update_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/check": { + "post": { + "tags": [ + "system update" + ], + "summary": "Check For Updates", + "operationId": "check_for_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/apply": { + "post": { + "tags": [ + "system update" + ], + "summary": "Apply Updates", + "operationId": "apply_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateInstallResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/repair/openscan3": { + "post": { + "tags": [ + "system repair" + ], + "summary": "Repair Openscan3", + "operationId": "repair_openscan3", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, "/projects/": { "get": { "tags": [ @@ -4373,6 +4467,18 @@ "default": "json", "title": "Format" } + }, + { + "name": "release_cameras", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras.", + "default": true, + "title": "Release Cameras" + }, + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras." } ], "responses": { @@ -4463,7 +4569,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { @@ -6561,6 +6667,77 @@ ], "title": "MotorStatusResponse" }, + "OpenScanUpdatePackage": { + "properties": { + "id": { + "type": "string", + "enum": [ + "firmware", + "client", + "updater", + "system_config", + "camera_stack" + ], + "title": "Id" + }, + "installed_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Installed Version" + }, + "available_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Available Version" + }, + "update_available": { + "type": "boolean", + "title": "Update Available" + } + }, + "type": "object", + "required": [ + "id", + "installed_version", + "available_version", + "update_available" + ], + "title": "OpenScanUpdatePackage", + "description": "One optional OpenScan component update for the details view." + }, + "OpenScanUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "packages": { + "items": { + "$ref": "#/components/schemas/OpenScanUpdatePackage" + }, + "type": "array", + "title": "Packages" + } + }, + "type": "object", + "required": [ + "updates_available", + "packages" + ], + "title": "OpenScanUpdateSummary" + }, "PathMethod": { "type": "string", "enum": [ @@ -7258,6 +7435,29 @@ "type": "object", "title": "StackingTaskStatus" }, + "SystemUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "reboot_required_after_install": { + "type": "boolean", + "title": "Reboot Required After Install" + } + }, + "type": "object", + "required": [ + "updates_available", + "count", + "reboot_required_after_install" + ], + "title": "SystemUpdateSummary" + }, "Task": { "properties": { "id": { @@ -7548,6 +7748,91 @@ ], "title": "TriggerStatusResponse" }, + "UpdateInstallResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "completed", + "install_failed", + "install_blocked" + ], + "title": "Status" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "reboot_required" + ], + "title": "UpdateInstallResponse", + "description": "Result of a synchronous user-requested update installation." + }, + "UpdateStatusResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "unknown", + "up_to_date", + "updates_available", + "status_unavailable", + "check_failed" + ], + "title": "Status" + }, + "checked_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checked At" + }, + "stale": { + "type": "boolean", + "title": "Stale" + }, + "release_channel": { + "type": "string", + "enum": [ + "stable", + "nightly", + "unknown" + ], + "title": "Release Channel" + }, + "openscan": { + "$ref": "#/components/schemas/OpenScanUpdateSummary" + }, + "system": { + "$ref": "#/components/schemas/SystemUpdateSummary" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "checked_at", + "stale", + "release_channel", + "openscan", + "system", + "reboot_required" + ], + "title": "UpdateStatusResponse", + "description": "Cached, user-facing software update status." + }, "ValidationError": { "properties": { "loc": { diff --git a/openapi_update_status.json b/openapi_update_status.json new file mode 100644 index 0000000..aab59d3 --- /dev/null +++ b/openapi_update_status.json @@ -0,0 +1,108 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "OpenScan3 Update Status API", + "version": "1.0.0", + "description": "Stable update-progress endpoint, served independently of the versioned OpenScan API." + }, + "servers": [ + { + "url": "/" + } + ], + "paths": { + "/update-status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get update progress", + "description": "Returns the current or most recently completed update job and its log output.", + "operationId": "get_update_progress", + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProgressResponse" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "UpdateProgressResponse": { + "type": "object", + "required": [ + "ok", + "finished", + "message", + "lines", + "job" + ], + "properties": { + "ok": { + "type": "boolean", + "description": "Whether the update job completed successfully." + }, + "finished": { + "type": "boolean", + "description": "Whether the update job has reached a terminal state." + }, + "message": { + "type": "string", + "description": "Human-readable summary of the current update state." + }, + "lines": { + "type": "array", + "description": "Update command output, ordered from oldest to newest.", + "items": { + "type": "string" + } + }, + "job": { + "$ref": "#/components/schemas/UpdateProgressJob" + } + } + }, + "UpdateProgressJob": { + "type": "object", + "required": [ + "error", + "status", + "unit", + "updated_at" + ], + "properties": { + "error": { + "type": [ + "string", + "null" + ], + "description": "Error reported by the update job, if any." + }, + "status": { + "type": "string", + "examples": [ + "update_running", + "update_completed" + ] + }, + "unit": { + "type": "string", + "description": "Systemd unit responsible for the update job." + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + } + } + } +} diff --git a/openapi_v0.8.json b/openapi_v0.8.json index 8afa6ee..bae2118 100644 --- a/openapi_v0.8.json +++ b/openapi_v0.8.json @@ -3493,7 +3493,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { diff --git a/openapi_v0.9.json b/openapi_v0.9.json index 57e1166..ceede64 100644 --- a/openapi_v0.9.json +++ b/openapi_v0.9.json @@ -1540,6 +1540,100 @@ } } }, + "/system/update/status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get Update Status", + "operationId": "get_update_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/check": { + "post": { + "tags": [ + "system update" + ], + "summary": "Check For Updates", + "operationId": "check_for_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/apply": { + "post": { + "tags": [ + "system update" + ], + "summary": "Apply Updates", + "operationId": "apply_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateInstallResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/repair/openscan3": { + "post": { + "tags": [ + "system repair" + ], + "summary": "Repair Openscan3", + "operationId": "repair_openscan3", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, "/projects/": { "get": { "tags": [ @@ -3723,6 +3817,18 @@ "default": "json", "title": "Format" } + }, + { + "name": "release_cameras", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras.", + "default": true, + "title": "Release Cameras" + }, + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras." } ], "responses": { @@ -3813,7 +3919,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { @@ -5703,6 +5809,77 @@ ], "title": "MotorStatusResponse" }, + "OpenScanUpdatePackage": { + "properties": { + "id": { + "type": "string", + "enum": [ + "firmware", + "client", + "updater", + "system_config", + "camera_stack" + ], + "title": "Id" + }, + "installed_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Installed Version" + }, + "available_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Available Version" + }, + "update_available": { + "type": "boolean", + "title": "Update Available" + } + }, + "type": "object", + "required": [ + "id", + "installed_version", + "available_version", + "update_available" + ], + "title": "OpenScanUpdatePackage", + "description": "One optional OpenScan component update for the details view." + }, + "OpenScanUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "packages": { + "items": { + "$ref": "#/components/schemas/OpenScanUpdatePackage" + }, + "type": "array", + "title": "Packages" + } + }, + "type": "object", + "required": [ + "updates_available", + "packages" + ], + "title": "OpenScanUpdateSummary" + }, "PathMethod": { "type": "string", "enum": [ @@ -6400,6 +6577,29 @@ "type": "object", "title": "StackingTaskStatus" }, + "SystemUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "reboot_required_after_install": { + "type": "boolean", + "title": "Reboot Required After Install" + } + }, + "type": "object", + "required": [ + "updates_available", + "count", + "reboot_required_after_install" + ], + "title": "SystemUpdateSummary" + }, "Task": { "properties": { "id": { @@ -6583,6 +6783,91 @@ ], "title": "TriggerConfig" }, + "UpdateInstallResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "completed", + "install_failed", + "install_blocked" + ], + "title": "Status" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "reboot_required" + ], + "title": "UpdateInstallResponse", + "description": "Result of a synchronous user-requested update installation." + }, + "UpdateStatusResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "unknown", + "up_to_date", + "updates_available", + "status_unavailable", + "check_failed" + ], + "title": "Status" + }, + "checked_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checked At" + }, + "stale": { + "type": "boolean", + "title": "Stale" + }, + "release_channel": { + "type": "string", + "enum": [ + "stable", + "nightly", + "unknown" + ], + "title": "Release Channel" + }, + "openscan": { + "$ref": "#/components/schemas/OpenScanUpdateSummary" + }, + "system": { + "$ref": "#/components/schemas/SystemUpdateSummary" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "checked_at", + "stale", + "release_channel", + "openscan", + "system", + "reboot_required" + ], + "title": "UpdateStatusResponse", + "description": "Cached, user-facing software update status." + }, "ValidationError": { "properties": { "loc": {