diff --git a/entry/src/main/ets/api/index.ets b/entry/src/main/ets/api/index.ets index c456c52..0acbfe2 100644 --- a/entry/src/main/ets/api/index.ets +++ b/entry/src/main/ets/api/index.ets @@ -145,4 +145,5 @@ export async function initCarParameter(params: object) { method: http.RequestMethod.POST, xml: false, }) -} \ No newline at end of file +} + diff --git a/entry/src/main/ets/api/networkCamera.ets b/entry/src/main/ets/api/networkCamera.ets new file mode 100644 index 0000000..1ae7c88 --- /dev/null +++ b/entry/src/main/ets/api/networkCamera.ets @@ -0,0 +1,94 @@ +import http from '@ohos.net.http'; +import buffer from '@ohos.buffer'; +import image from '@ohos.multimedia.image'; + +const TAG = 'CameraService'; + +export async function ObtainNetworkCameraImages(): Promise { + const url = "http://192.168.1.125/snapshot.cgi?stream=1&username=admin&password=123456"; + let httpRequest = http.createHttp(); + + try { + console.info(TAG, 'Starting image request...'); + const response = await httpRequest.request(url, { + method: http.RequestMethod.GET, + connectTimeout: 10000, + readTimeout: 10000, + expectDataType: http.HttpDataType.ARRAY_BUFFER, + }); + + if (response.responseCode === 200) { + let arrayBuffer = response.result as ArrayBuffer; + + // 裁剪左半部分 + const croppedBase64 = await cropLeftHalf(arrayBuffer); + + return croppedBase64; + } else { + console.error(TAG, `HTTP Error: ${response.responseCode}`); + return null; + } + } catch (error) { + console.error(TAG, 'An error occurred while fetching the image.', JSON.stringify(error)); + return null; + } finally { + httpRequest.destroy(); + } +} + +async function cropLeftHalf(arrayBuffer: ArrayBuffer): Promise { + let imageSource: image.ImageSource | null = null; + let pixelMap: image.PixelMap | null = null; + + try { + // 1. 创建ImageSource + imageSource = image.createImageSource(arrayBuffer); + + // 2. 获取图片信息 + const imageInfo = await imageSource.getImageInfo(); + console.info(TAG, `Original image size: ${imageInfo.size.width}x${imageInfo.size.height}`); + + // 3. 计算并定义左半部分的裁剪区域 + const leftHalfWidth = Math.floor(imageInfo.size.width / 2); + const cropRegion: image.Region = { + size: { + width: leftHalfWidth, + height: imageInfo.size.height + }, + x: 0, + y: 0 + }; + + // 创建解码选项,并将裁剪区域放入其中 + const decodingOptions: image.DecodingOptions = { + desiredRegion: cropRegion + }; + + // 4. 创建像素映射并进行裁剪 + pixelMap = await imageSource.createPixelMap(decodingOptions); + + // 5. 将裁剪后的PixelMap转换为ArrayBuffer + const imagePacker = image.createImagePacker(); + const packedData = await imagePacker.packing(pixelMap, { + format: "image/jpeg", + quality: 90 + }); + + // 6. 转换为Base64 + const buf = buffer.from(packedData); + const base64 = buf.toString('base64'); + + const result = `data:image/jpeg;base64,${base64}`; + console.info(TAG, `Left half cropped successfully. Size: ${leftHalfWidth}x${imageInfo.size.height}`); + + return result; + + } catch (error) { + console.error(TAG, 'Image cropping failed:', JSON.stringify(error)); + return ""; + } finally { + // 7. 在 finally 块中安全地释放资源 + imageSource?.release(); + pixelMap?.release(); + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 7d2ce77..962d751 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -19,6 +19,7 @@ import Prompt from '@system.prompt'; import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker'; import { dConsole } from '../utils/LogWorker'; import CarLoadingComponent from './Index/Loading'; +import { ObtainNetworkCameraImages } from '../api/networkCamera'; @Entry @Component @@ -40,6 +41,7 @@ struct Index { @State isPlay: boolean = false; @State initWork: boolean = false @State status: string = "开始" + @State base64Img: string = "" // 请求网络表等待弹窗 customDialogController: CustomDialogController = new CustomDialogController({ builder: CarLoadingComponent(), @@ -62,6 +64,7 @@ struct Index { async aboutToAppear() { dConsole.log("权限首页 aboutToAppear") + this.base64Img = await ObtainNetworkCameraImages() || "" this.ratio = AppStorage.get('baseInfo')?.ratio || 1.4 this.angle = 0 AppStorage.set('lsh', '1111111111111') @@ -217,7 +220,7 @@ struct Index { HeaderComponent({ shortLogo: false }) - + CardComponent({ isSingle: this.singlePlay, singleClick: () => { diff --git a/entry/src/main/ets/pages/Judge/utils.ets b/entry/src/main/ets/pages/Judge/utils.ets index c804cf0..27d672c 100644 --- a/entry/src/main/ets/pages/Judge/utils.ets +++ b/entry/src/main/ets/pages/Judge/utils.ets @@ -6,11 +6,9 @@ import { DefaultJudgeConfigObj, ExtendType, Gps, - JudgeSound, LANE, MarkRule, PLCType, - ProcessDataEnumType, ProjectInfo, ProjectInfos, ProjectRoads, @@ -21,7 +19,6 @@ import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common'; import dayTs from '../../utils/Date'; import { dConsole } from '../../utils/LogWorker'; import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements'; -import { examJudgeSoundEnd } from './JudgeSDKUtils'; // 中心信号转换 @@ -863,23 +860,23 @@ export const CurrentProjectConversion = (code: number, projectsObj: object): str * @param sound - 评判音频对象 * @param avPlayer - 语音播放器实例 */ -export function PlayJudgeVoice(sound: JudgeSound, avPlayer: VoiceAnnounce) { - if (sound.type == 1) { - avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => { - examJudgeSoundEnd({ - xmdm: sound.xmdm, code: sound.code[0], type: sound.type - }); - dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({ - method: 'examJudgeSoundEnd', - itemno: sound.xmdm, - code: sound.code[0], - type: sound.type, - })); - }); - } else { - avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]); - } -} +// export function PlayJudgeVoice(sound: JudgeSound, avPlayer: VoiceAnnounce) { +// if (sound.type == 1) { +// avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => { +// examJudgeSoundEnd({ +// xmdm: sound.xmdm, code: sound.code[0], type: sound.type +// }); +// dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({ +// method: 'examJudgeSoundEnd', +// itemno: sound.xmdm, +// code: sound.code[0], +// type: sound.type, +// })); +// }); +// } else { +// avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]); +// } +// } /** * 检查差分 diff --git a/entry/src/main/ets/workers/DifferentialCorrection.ets b/entry/src/main/ets/workers/DifferentialCorrection.ets index 7f95cd6..3d8954b 100644 --- a/entry/src/main/ets/workers/DifferentialCorrection.ets +++ b/entry/src/main/ets/workers/DifferentialCorrection.ets @@ -1,6 +1,6 @@ // 处理worker线程的消息tcp拿差分改正数,udp给后置机 import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker'; -import { WorkerTag } from '../config'; +import { SerialPortTag, WorkerTag } from '../config'; import { CenterCallBackMsgType, EnvironmentConfigurationType, @@ -68,7 +68,7 @@ function getDataFn(config: EnvironmentConfigurationType) { if (data !== "" && config.carType !== "2") { // TODO // 需要观察 - // console.log(WorkerTag, "后置机消息", data) + console.log(WorkerTag, "后置机消息", data) const res = await SerialPortService.getData() if (res.length > 0) { const dataArray = data.split(","); @@ -76,7 +76,7 @@ function getDataFn(config: EnvironmentConfigurationType) { dataArray[28] = res[9].toString(); data = dataArray.join(","); } - // console.log(SerialPortTag, "处理完的档位信号", data) + console.log(SerialPortTag, "处理完的档位信号", data) workerPort.postMessage( JSON.stringify({ type: WorkerBackMessageType.ObtainUdpData,