From 65a1b3a81e86ece43c4b25b9b699fd924550457f Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 23 Oct 2026 15:15:00 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=208=20=E6=99=BA=E6=85=A7?= =?UTF-8?q?=E6=A0=A1=E5=9B=AD=E7=AE=A1=E7=90=86=E5=B9=B3=E5=8F=B0=EF=BC=9A?= =?UTF-8?q?5=20=E4=B8=AA=E4=BB=BB=E5=8A=A1=E7=9A=84=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E3=80=81=E8=87=AA=E7=BB=98=E7=B4=A0=E6=9D=90=E3=80=81WisdomCam?= =?UTF-8?q?pus=20=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 示例 p8-t1…t5(代码逐个累加):主界面、校园环境界面、环境采集与分析(路灯手动 / 自动控制、 LED 推送、自动推送火情、7 天温度图表)、校园安防(入侵提示、摄像机方向、拍照入库)、历史图片 (按日期查询、左右切换),各有评分规则 - 按书补全参考工程里空着的"推送LED信息""自动控制",给"自动推送火情"绑定 CheckedChanged (书上第 23 步写成了 ch_autoLamp);任务 5 每次查询前清空 Keys - 素材:项目 8 的 20 多张图片全部自绘,名字和尺寸与教材一致(project8.py 生成 SVG, build-gallery.sh 渲染成 PNG;源文件移到 svg/) - 数据库 WisdomCampus 按教材的表结构建(EnvironmentData、SecurityData、Users),预置 7 天环境数据 - 测试:参考答案全部通过;没绑定"自动推送火情"、开灯换错背景图片时报出对应原因 - 文档:教材 8 个项目全部有示例,共 23 个 Co-Authored-By: Claude Opus 5.5 --- README.md | 4 +- docs/设计方案.md | 17 +- runtime/Sim.WinForms/Resources/README.md | 4 +- .../Sim.WinForms/Resources/build-gallery.sh | 6 + .../Resources/gallery/arrow_left_normal.png | Bin 0 -> 1688 bytes .../Resources/gallery/arrow_right_normal.png | Bin 0 -> 1683 bytes .../Resources/gallery/bg_from1.png | Bin 0 -> 4550 bytes .../Resources/gallery/bg_from2.png | Bin 0 -> 4133 bytes .../Resources/gallery/bg_home.png | Bin 0 -> 36604 bytes .../gallery/btn_arrow_down_normal.png | Bin 0 -> 1214 bytes .../gallery/btn_arrow_down_press.png | Bin 0 -> 1247 bytes .../gallery/btn_arrow_left_normal.png | Bin 0 -> 1198 bytes .../gallery/btn_arrow_left_press.png | Bin 0 -> 1242 bytes .../gallery/btn_arrow_right_normal.png | Bin 0 -> 1196 bytes .../gallery/btn_arrow_right_press.png | Bin 0 -> 1223 bytes .../Resources/gallery/btn_arrow_up_normal.png | Bin 0 -> 1175 bytes .../Resources/gallery/btn_arrow_up_press.png | Bin 0 -> 1237 bytes .../Sim.WinForms/Resources/gallery/day_01.png | Bin 0 -> 24836 bytes .../Sim.WinForms/Resources/gallery/day_02.png | Bin 0 -> 17787 bytes .../Resources/gallery/ico_title.png | Bin 0 -> 3736 bytes .../Resources/gallery/icon_02.png | Bin 0 -> 6879 bytes .../Resources/gallery/icon_03.png | Bin 0 -> 6708 bytes .../Resources/gallery/icon_04.png | Bin 0 -> 3501 bytes .../Resources/gallery/icon_monitor.png | Bin 0 -> 6064 bytes .../Sim.WinForms/Resources/gallery/index.json | 24 +- .../Resources/gallery/panel_video_ctrl.png | Bin 0 -> 56223 bytes .../gallery/windowstate_closed_hover.png | Bin 0 -> 612 bytes runtime/Sim.WinForms/Resources/project8.py | 170 ++++++ .../Resources/svg/arrow_left_normal.svg | 6 + .../Resources/svg/arrow_right_normal.svg | 6 + .../Sim.WinForms/Resources/svg/bg_from1.svg | 7 + .../Sim.WinForms/Resources/svg/bg_from2.svg | 7 + .../Sim.WinForms/Resources/svg/bg_home.svg | 78 +++ .../Resources/svg/btn_arrow_down_normal.svg | 6 + .../Resources/svg/btn_arrow_down_press.svg | 6 + .../Resources/svg/btn_arrow_left_normal.svg | 6 + .../Resources/svg/btn_arrow_left_press.svg | 6 + .../Resources/svg/btn_arrow_right_normal.svg | 6 + .../Resources/svg/btn_arrow_right_press.svg | 6 + .../Resources/svg/btn_arrow_up_normal.svg | 6 + .../Resources/svg/btn_arrow_up_press.svg | 6 + runtime/Sim.WinForms/Resources/svg/day_01.svg | 79 +++ runtime/Sim.WinForms/Resources/svg/day_02.svg | 79 +++ .../Sim.WinForms/Resources/svg/ico_title.svg | 11 + .../Sim.WinForms/Resources/svg/icon_02.svg | 11 + .../Sim.WinForms/Resources/svg/icon_03.svg | 10 + .../Sim.WinForms/Resources/svg/icon_04.svg | 10 + .../Resources/svg/icon_monitor.svg | 10 + .../Resources/svg/panel_video_ctrl.svg | 8 + .../Resources/{ => svg}/switch_off.svg | 0 .../Resources/{ => svg}/switch_on.svg | 0 .../svg/windowstate_closed_hover.svg | 6 + samples/p8-t1-主界面/Main.Designer.cs | 142 +++++ samples/p8-t1-主界面/Main.cs | 34 ++ samples/p8-t1-主界面/Program.cs | 22 + .../Properties/Resources.Designer.cs | 39 ++ samples/p8-t1-主界面/checks.yaml | 14 + samples/p8-t1-主界面/meta.json | 4 + .../Environment.Designer.cs | 545 +++++++++++++++++ samples/p8-t2-校园环境界面/Environment.cs | 35 ++ samples/p8-t2-校园环境界面/Main.Designer.cs | 143 +++++ samples/p8-t2-校园环境界面/Main.cs | 46 ++ samples/p8-t2-校园环境界面/Program.cs | 22 + .../Properties/Resources.Designer.cs | 54 ++ samples/p8-t2-校园环境界面/checks.yaml | 38 ++ samples/p8-t2-校园环境界面/meta.json | 4 + samples/p8-t3-环境采集与分析/AppSet.cs | 25 + .../Environment.Designer.cs | 555 ++++++++++++++++++ samples/p8-t3-环境采集与分析/Environment.cs | 279 +++++++++ samples/p8-t3-环境采集与分析/Main.Designer.cs | 144 +++++ samples/p8-t3-环境采集与分析/Main.cs | 60 ++ samples/p8-t3-环境采集与分析/Program.cs | 22 + .../Properties/Resources.Designer.cs | 64 ++ .../p8-t3-环境采集与分析/SQLHelpers/SQLBLL.cs | 106 ++++ .../SQLHelpers/SQLHelper.cs | 112 ++++ samples/p8-t3-环境采集与分析/checks.yaml | 71 +++ samples/p8-t3-环境采集与分析/database.sql | 54 ++ samples/p8-t3-环境采集与分析/meta.json | 4 + samples/p8-t4-校园安防/AppSet.cs | 25 + .../p8-t4-校园安防/Environment.Designer.cs | 555 ++++++++++++++++++ samples/p8-t4-校园安防/Environment.cs | 279 +++++++++ samples/p8-t4-校园安防/Main.Designer.cs | 145 +++++ samples/p8-t4-校园安防/Main.cs | 72 +++ samples/p8-t4-校园安防/Program.cs | 22 + .../Properties/Resources.Designer.cs | 114 ++++ samples/p8-t4-校园安防/SQLHelpers/SQLBLL.cs | 106 ++++ .../p8-t4-校园安防/SQLHelpers/SQLHelper.cs | 112 ++++ samples/p8-t4-校园安防/Security.Designer.cs | 296 ++++++++++ samples/p8-t4-校园安防/Security.cs | 240 ++++++++ samples/p8-t4-校园安防/checks.yaml | 46 ++ samples/p8-t4-校园安防/database.sql | 54 ++ samples/p8-t4-校园安防/meta.json | 4 + samples/p8-t5-历史图片/AppSet.cs | 25 + .../p8-t5-历史图片/Environment.Designer.cs | 555 ++++++++++++++++++ samples/p8-t5-历史图片/Environment.cs | 279 +++++++++ samples/p8-t5-历史图片/Main.Designer.cs | 145 +++++ samples/p8-t5-历史图片/Main.cs | 72 +++ samples/p8-t5-历史图片/Program.cs | 22 + .../Properties/Resources.Designer.cs | 129 ++++ samples/p8-t5-历史图片/SQLHelpers/SQLBLL.cs | 106 ++++ .../p8-t5-历史图片/SQLHelpers/SQLHelper.cs | 112 ++++ samples/p8-t5-历史图片/Security.Designer.cs | 297 ++++++++++ samples/p8-t5-历史图片/Security.cs | 252 ++++++++ .../SecurityCameraData.Designer.cs | 246 ++++++++ samples/p8-t5-历史图片/SecurityCameraData.cs | 129 ++++ samples/p8-t5-历史图片/checks.yaml | 55 ++ samples/p8-t5-历史图片/database.sql | 54 ++ samples/p8-t5-历史图片/meta.json | 4 + server/test/grading.test.ts | 25 +- 109 files changed, 7807 insertions(+), 9 deletions(-) create mode 100644 runtime/Sim.WinForms/Resources/build-gallery.sh create mode 100644 runtime/Sim.WinForms/Resources/gallery/arrow_left_normal.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/arrow_right_normal.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/bg_from1.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/bg_from2.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/bg_home.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_down_normal.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_down_press.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_left_normal.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_left_press.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_right_normal.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_right_press.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_up_normal.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/btn_arrow_up_press.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/day_01.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/day_02.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/ico_title.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/icon_02.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/icon_03.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/icon_04.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/icon_monitor.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/panel_video_ctrl.png create mode 100644 runtime/Sim.WinForms/Resources/gallery/windowstate_closed_hover.png create mode 100644 runtime/Sim.WinForms/Resources/project8.py create mode 100644 runtime/Sim.WinForms/Resources/svg/arrow_left_normal.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/arrow_right_normal.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/bg_from1.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/bg_from2.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/bg_home.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_down_normal.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_down_press.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_left_normal.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_left_press.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_right_normal.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_right_press.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_up_normal.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/btn_arrow_up_press.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/day_01.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/day_02.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/ico_title.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/icon_02.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/icon_03.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/icon_04.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/icon_monitor.svg create mode 100644 runtime/Sim.WinForms/Resources/svg/panel_video_ctrl.svg rename runtime/Sim.WinForms/Resources/{ => svg}/switch_off.svg (100%) rename runtime/Sim.WinForms/Resources/{ => svg}/switch_on.svg (100%) create mode 100644 runtime/Sim.WinForms/Resources/svg/windowstate_closed_hover.svg create mode 100644 samples/p8-t1-主界面/Main.Designer.cs create mode 100644 samples/p8-t1-主界面/Main.cs create mode 100644 samples/p8-t1-主界面/Program.cs create mode 100644 samples/p8-t1-主界面/Properties/Resources.Designer.cs create mode 100644 samples/p8-t1-主界面/checks.yaml create mode 100644 samples/p8-t1-主界面/meta.json create mode 100644 samples/p8-t2-校园环境界面/Environment.Designer.cs create mode 100644 samples/p8-t2-校园环境界面/Environment.cs create mode 100644 samples/p8-t2-校园环境界面/Main.Designer.cs create mode 100644 samples/p8-t2-校园环境界面/Main.cs create mode 100644 samples/p8-t2-校园环境界面/Program.cs create mode 100644 samples/p8-t2-校园环境界面/Properties/Resources.Designer.cs create mode 100644 samples/p8-t2-校园环境界面/checks.yaml create mode 100644 samples/p8-t2-校园环境界面/meta.json create mode 100644 samples/p8-t3-环境采集与分析/AppSet.cs create mode 100644 samples/p8-t3-环境采集与分析/Environment.Designer.cs create mode 100644 samples/p8-t3-环境采集与分析/Environment.cs create mode 100644 samples/p8-t3-环境采集与分析/Main.Designer.cs create mode 100644 samples/p8-t3-环境采集与分析/Main.cs create mode 100644 samples/p8-t3-环境采集与分析/Program.cs create mode 100644 samples/p8-t3-环境采集与分析/Properties/Resources.Designer.cs create mode 100644 samples/p8-t3-环境采集与分析/SQLHelpers/SQLBLL.cs create mode 100644 samples/p8-t3-环境采集与分析/SQLHelpers/SQLHelper.cs create mode 100644 samples/p8-t3-环境采集与分析/checks.yaml create mode 100644 samples/p8-t3-环境采集与分析/database.sql create mode 100644 samples/p8-t3-环境采集与分析/meta.json create mode 100644 samples/p8-t4-校园安防/AppSet.cs create mode 100644 samples/p8-t4-校园安防/Environment.Designer.cs create mode 100644 samples/p8-t4-校园安防/Environment.cs create mode 100644 samples/p8-t4-校园安防/Main.Designer.cs create mode 100644 samples/p8-t4-校园安防/Main.cs create mode 100644 samples/p8-t4-校园安防/Program.cs create mode 100644 samples/p8-t4-校园安防/Properties/Resources.Designer.cs create mode 100644 samples/p8-t4-校园安防/SQLHelpers/SQLBLL.cs create mode 100644 samples/p8-t4-校园安防/SQLHelpers/SQLHelper.cs create mode 100644 samples/p8-t4-校园安防/Security.Designer.cs create mode 100644 samples/p8-t4-校园安防/Security.cs create mode 100644 samples/p8-t4-校园安防/checks.yaml create mode 100644 samples/p8-t4-校园安防/database.sql create mode 100644 samples/p8-t4-校园安防/meta.json create mode 100644 samples/p8-t5-历史图片/AppSet.cs create mode 100644 samples/p8-t5-历史图片/Environment.Designer.cs create mode 100644 samples/p8-t5-历史图片/Environment.cs create mode 100644 samples/p8-t5-历史图片/Main.Designer.cs create mode 100644 samples/p8-t5-历史图片/Main.cs create mode 100644 samples/p8-t5-历史图片/Program.cs create mode 100644 samples/p8-t5-历史图片/Properties/Resources.Designer.cs create mode 100644 samples/p8-t5-历史图片/SQLHelpers/SQLBLL.cs create mode 100644 samples/p8-t5-历史图片/SQLHelpers/SQLHelper.cs create mode 100644 samples/p8-t5-历史图片/Security.Designer.cs create mode 100644 samples/p8-t5-历史图片/Security.cs create mode 100644 samples/p8-t5-历史图片/SecurityCameraData.Designer.cs create mode 100644 samples/p8-t5-历史图片/SecurityCameraData.cs create mode 100644 samples/p8-t5-历史图片/checks.yaml create mode 100644 samples/p8-t5-历史图片/database.sql create mode 100644 samples/p8-t5-历史图片/meta.json diff --git a/README.md b/README.md index 2a0f0fd..3456c68 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,8 @@ Docker Compose,HTTPS 由服务器上的 Nginx Proxy Manager 负责。推送到 已完成: - **虚拟实训台**:按教材实训台布局图排列(红外对射、警示灯、LED 屏、照明灯、人体红外、温湿度、光照、烟雾、火焰、ADAM 模块)。每个浏览器会话一台,状态由服务器统一保存:传感器读数由网页上的滑块和开关设定,经服务器推给学生程序;灯、继电器、LED 屏由学生程序控制。 -- 新控件:CheckBox、RadioButton(事件顺序与 WinForms 一致)、ListBox、PictureBox、DataGridView、DateTimePicker、TrackBar、Windows Media Player,教材控件库的 Lamp、Alarm。 -- 示例工程(按书上代码整理):项目 1 任务 1–2、项目 2 任务 1–3、项目 3 任务 1–2、项目 4 任务 1–3、项目 5 任务 1–3、项目 6 任务 2–3、项目 7 任务 1–3,共 18 个(项目 6 任务 1 在数据库页面上完成)。网址带 `?sample=示例编号` 可直接打开指定示例。 +- 新控件:CheckBox、RadioButton(事件顺序与 WinForms 一致)、ListBox、PictureBox、DataGridView、DateTimePicker、TrackBar、Windows Media Player、Chart(图表),教材控件库的 Lamp、Alarm;Panel 停靠布局、背景图片、无边框窗体。 +- 示例工程(按书上代码整理):项目 1 任务 1–2、项目 2 任务 1–3、项目 3 任务 1–2、项目 4 任务 1–3、项目 5 任务 1–3、项目 6 任务 2–3、项目 7 任务 1–3、项目 8 任务 1–5,共 23 个(项目 6 任务 1 在数据库页面上完成)。网址带 `?sample=示例编号` 可直接打开指定示例。 - 代码编辑器(Monaco):C# 高亮、编译错误波浪线、点错误跳到对应行、F5 运行 / Shift+F5 停止、草稿自动保存在浏览器本地。 - 窗体设计器(仿 VS,界面中文):工具箱、拖放与改大小、属性窗口、事件窗口、双击生成事件处理方法、撤销 / 重做;读写 VS 格式的 Designer.cs。 - 多窗体:新建、删除窗体;运行时多个窗口可切换前后。 diff --git a/docs/设计方案.md b/docs/设计方案.md index 8991a3e..983fbde 100644 --- a/docs/设计方案.md +++ b/docs/设计方案.md @@ -215,7 +215,7 @@ IOT/ | 5 灾情监测 | 火焰(Timer)、烟雾(Thread)、灾情记录与推送 | Thread(含 Suspend / Resume / Abort)、跨线程改界面、ListBox、FormClosing | 已完成 | | 6 数据存储 | 建库建表、采集入库与增删改、按时间段查询 | SQL 窗口(代替 SSMS)、SqlClient 仿冒(SQLite)、DataGridView、DateTimePicker | 已完成 | | 7 情景控制 | 智慧教室、寝室、会议室三种情景联动 | TrackBar、资源图片、PictureBox 当按钮、mp3 播放、虚拟时钟 | 已完成 | -| 8 管理平台 | 主界面、校园环境(自动控制、7 天温度图表)、校园安防(抓拍入库、历史图片) | Panel Dock、无边框窗体、透明背景、Chart、ShowDialog、图片存数据库 | | +| 8 管理平台 | 主界面、校园环境(自动控制、7 天温度图表)、校园安防(抓拍入库、历史图片) | Panel Dock、无边框窗体、透明背景、Chart、ShowDialog、图片存数据库 | 已完成 | 每个实验以数据形式存放(目前在 `samples/`,以后迁到 `content/`),由以下部分组成: @@ -237,7 +237,7 @@ flowchart TB P0["阶段 0 · 技术验证(已完成 2026-10-22)
教材项目 2 任务 1 原样运行;实测编译、延迟、内存"] P1["阶段 1 · MVP(进行中,约 3 个月)
虚拟实训台 ✔、代码编辑器 ✔、窗体设计器 ✔、多窗体 ✔
教材示例:项目 1–3 全部 ✔,项目 4–5 中平台已支持的 3 个任务 ✔
部署(沙箱、Docker Compose、GitHub Actions)✔"] P2["阶段 2 · 教学闭环(进行中,约 2 个月)
账号与班级 ✔、作品保存在服务器 ✔、自动评分 ✔、布置与提交作业 ✔
评阅(看代码、运行、老师评分、评语)✔、成绩表与导出 ✔;一个班试用"] - P3["阶段 3 · 扩展(进行中)
教材项目 4–8:摄像头 ✔、线程 ✔、SQLite 模拟数据库 ✔、虚拟时钟 ✔、图表"] + P3["阶段 3 · 扩展(进行中)
教材项目 4–8:摄像头 ✔、线程 ✔、SQLite 模拟数据库 ✔、虚拟时钟 ✔、图表 ✔"] P4["阶段 4 · 进阶(之后)
校园街景场景、故障注入题库、导出 VS 工程"] P0 -->|"关口:链路跑通,延迟和资源占用可接受"| P1 P1 -->|"关口:教材项目 1–3 能在平台上完整做完"| P2 @@ -298,6 +298,19 @@ flowchart TB - **TrackBar**:拖动、点轨道(LargeChange)、方向键(SmallChange),先 ValueChanged 再 Scroll,竖向时最小值在下面;设计器工具箱加"滑动条""媒体播放器"。评分规则加 `value`(滑动条的值)、`media`(播放了某个文件)检查。 - 示例:书上任务 1 手动开关灯的判断写反(参考工程是对的),任务 3 漏了填充串口列表,示例里都已改正;任务 3 的"每 5 分钟整点拍照"依赖定时器正好在 0 秒触发,自动评分不检查这一项,由老师评阅。编译检查修正:`System.AppDomain.CurrentDomain.BaseDirectory`(带命名空间)也放行。 +- 2026-10-23:项目 8 智慧校园管理平台(5 个任务,每个任务一个示例,代码逐个累加),至此教材 8 个项目全部完成,共 23 个示例。 + - **新建类**:实验页"+ 新建类",可以带文件夹(`SQLHelpers/SQLBLL`),文件夹成为命名空间的一段,模板和 VS 2012 一样;可以删除自己建的类。 + - **停靠布局**:Dock(上、下、左、右、填充)和 WinForms 一样按 Controls 倒序依次停靠,Panel 的边框、GroupBox 的标题占的地方扣掉;窗体改大小、控件显示隐藏、加入移出时重新布局。设计器里改了停靠或大小也立即按同样的规则排好。 + - **背景图片**:BackgroundImage + BackgroundImageLayout(平铺、居中、拉伸、缩放),窗体、面板、图片框都可以设,设计器里从项目资源选。**背景色沿用父控件**:没设置背景色的标签、面板、分组框等画父控件的背景色(不是父控件的背景图片),和 WinForms 一样,所以书上要把放在背景图上的控件设成 Transparent。分组框的标题处边框断开、透出背景(书上分组框放在深色背景上、标题是白字)。文本框的 BackColor 生效。 + - **无边框窗体**:FormBorderStyle = None 时没有标题栏;**运行区自动缩放**:窗体比运行区大时(项目 8 的窗体有 1043×791)整体按比例缩小,右上角显示缩放比例;"放大"让运行区占满整个网页(窗体在左、实训台在右),Esc 还原。 + - **图表**(`System.Windows.Forms.DataVisualization.Charting.Chart`):ChartAreas、Legends、Series(AddXY、Points、ChartType 等)、DataSource + DataBind(DataTable / DataView / DataSet,按 XValueMember、YValueMembers 取列),浏览器用 Chart.js 画,配色是 WinForms 默认的 BrightPastel。设计器工具箱加"图表"(和 VS 一样带 ChartArea1、Legend1、Series1),属性窗口"系列和图例"打开对话框编辑系列(名称、图表类型、图例、图例文字、X / Y 值字段)和图例,按 VS 的格式和顺序写回 Designer.cs,对话框不管的属性原样保留。 + - **路径的反斜杠**:书上写 `BaseDirectory + "Camera\\"`,Linux 上反斜杠会成为文件名的一部分。编译时把传给 System.IO(File、Directory、Path、各种 Stream)和 Image / Bitmap 读写文件方法的路径参数包上 `WindowsPaths.Fix`,反斜杠换成斜杠(和线程、时钟的改写一样不换行、编辑器里看到的是原代码)。 + - **其他**:Paint 事件(VS 双击面板生成的空 `panel1_Paint` 能编译,平台不触发);图片框把鼠标按下、松开发给程序(书上方向键按下时转动摄像机、换成按下的图片);数据库里参数化的日期字符串比较时也转换格式(书上拼出的 `"2024/1/23 23:59:59"` 有两个空格)。 + - **素材**:项目 8 用到的 20 多张图片(标题、校园背景、三个入口图标、亮灯 / 灭灯的路灯场景、面板背景、监控图标、方向盘和方向键、翻页箭头、关闭按钮)全部自绘,名字和尺寸与教材一致(`runtime/Sim.WinForms/Resources/project8.py` 生成 SVG,`build-gallery.sh` 渲染成 PNG)。 + - **数据库 WisdomCampus**:平台按教材的表结构建(EnvironmentData、SecurityData、Users),预置 7 天环境数据,"数据分析"的图表一打开就有内容。学生第一次运行带预置数据库的实验时自动建好自己还没有的库(已有的库不动)。 + - **评分规则**新增:`visible`(连同所在容器都可见)、`window`(某个窗体打开着 / 已关闭)、`exited`(程序已退出)、`image` / `background` 写素材名(如 `background: day_01`,按图片内容核对显示的是不是这张素材)、`points`(图表每个系列的数据点数);"点击"图片框时和浏览器一样先发鼠标按下、松开。 + - **示例**:书上任务 3 第 23 步把"自动推送火情"的处理写到了 ch_autoLamp 上,参考工程里"推送LED信息""自动控制"是空方法、"自动推送火情"没有绑定事件,示例按书的意思补全;任务 5 每次查询前清空 Keys(书上没清空,重复查询时照片和时间对不上)。任务 2 只做界面,为了能看效果加上了打开、返回窗体。 + **其他改进**: - 2026-10-22:代码编辑器的语言功能:代码补全(输入 `btn_Open.` 列出按钮的属性、方法、事件,只列出平台仿真了的成员)、悬停提示、参数提示(`MessageBox.Show(` 列出重载,标出正在填的参数)、停止输入 1 秒后自动检查编译错误(提示和点"运行"时一样)。语言服务是一个常驻进程,每个浏览器标签页一份工程,只更新有变化的文件。实测(限制 2 核):50 个标签页同时检查 1.2 秒内全部完成,同时补全 0.7 秒;内存约 260 MB。 diff --git a/runtime/Sim.WinForms/Resources/README.md b/runtime/Sim.WinForms/Resources/README.md index 668d4eb..501d895 100644 --- a/runtime/Sim.WinForms/Resources/README.md +++ b/runtime/Sim.WinForms/Resources/README.md @@ -1,7 +1,7 @@ # 项目资源素材库 -学生在"项目资源"里添加的图片和声音(`Properties.Resources.xxx`),名字和教材一致,全部由平台自绘或合成(不使用教材配套资料里的素材)。 +学生在"项目资源"里添加的图片和声音(`Properties.Resources.xxx`),名字和尺寸与教材一致,全部由平台自绘或合成(不使用教材配套资料里的素材)。 - `gallery/`:发布给运行器和网页的文件,`index.json` 是清单(名字、文件、中文说明、类型)。 -- `*.svg`:图片的源文件,改了以后用 `rsvg-convert xxx.svg -o gallery/xxx.png` 重新生成。 +- `svg/`:图片的源文件;`project8.py` 生成项目 8 的那些 SVG。改了以后运行 `python3 project8.py && sh build-gallery.sh` 重新生成 PNG(需要 rsvg-convert 和思源黑体)。 - `gallery/ring.mp3`:用 ffmpeg 合成的门铃声(叮—咚),命令见提交记录。 diff --git a/runtime/Sim.WinForms/Resources/build-gallery.sh b/runtime/Sim.WinForms/Resources/build-gallery.sh new file mode 100644 index 0000000..32adb61 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/build-gallery.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# 把 svg/ 下的素材渲染成 gallery/ 下的 PNG(尺寸取 SVG 自己的 width / height)。需要 rsvg-convert 和思源黑体等中文字体。 +cd "$(dirname "$0")" +for f in svg/*.svg; do + rsvg-convert "$f" -o "gallery/$(basename "$f" .svg).png" +done diff --git a/runtime/Sim.WinForms/Resources/gallery/arrow_left_normal.png b/runtime/Sim.WinForms/Resources/gallery/arrow_left_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..ae79c8bee063ce623b169084f6afb5808c0680fd GIT binary patch literal 1688 zcmV;J250$+P)7O^Y=Psz@^Vz{ z52Kb__Kv&TS!%7H-)?7ip84L+&OGzXv+#l!JXcsuZhJbA0!#yv04HDvUV2<-7#IZl z03Xl=bO3*t*(urWB?Fm28W0y_I|ION;0E9Y9!cpP@&wy}EFcF+kksZAdVmI?1$bz* zF&Tn0fIQ%332lYr0ZF`*Lz}KJ|D!{RW!t1Ip3yy+ch}3xW9t3`WHE?c3)ZKYo12lqpl< zpIlQECC=e+_$n(aI}9{!M~J?!Ezld%7R0W{RQB!LH~;9-qdOEuF*<}pp{qg9JxoFV z7B7gyhY!EDbLYCcD3w4 zUeF4jN$g>nkl5{ZYfVkfhP=GIWqRdpZEd#;3JOkibaV_#Htj&f)t-7^TEWsc^YQWV zw%Xd-5|_)RyUS{6X=%yJ%lp#j^Zg~;_G3~ABY2ujOS5Lpnp|63`$2kodb(bDeSLjH zK|#US0|NsiGVN*z(xhFMq(v}PRdu-C?j51TR#jD9TDEN28I#3=*bh8KE7&Q+!t&+I zldfL9`blzf@*JJwN2gDp{&vlpH5W!kMx=#b!w|H@Y6TnKD5$FHIDh_p>GbK-XK2et zMn)bUIdbHy&6_v>Xw*&=1ZmO=ehGu@-MiP7kdTn1y*@lV9N52q|B2nZcQ+cf5hY;- zKlf-|yVo%ojcjdg?b@Q>eQ)xqjsVoNRw7@uM7)Uu3Yiu=H`Cp^?LP! zYL=3clD98jytvM4wVHW)`2_#yA6miPvaEPKp8o9Y>|?iX-MXb$UQ|@HvaYUfQ(Rn} z+4G2R^bf7EE}53@-@hNo&dx4xYHIpPuYB?1#W@WP4O^3vlFU5C2-2h#>_swteSHs? zE?s)+^5x5QdgYm!nVD|4`=gYU6h*e}#{@-Aw1R&}97aoJXlQ6;#flZ@&YU@OL9aY5 zEp6_#Yu7%`%F2=*L+eKqr`C&UO+{=IrE~V|*rZb*oI5>5PjCPe&yXrBD?6M{XV;P?OEN4LOV9{Y6va_oT)gnyxpVIB?(Sg; z=6*o4^5_ZfL&SB>dZ(zauD%xt1ibnA`B^rbEvOHQq9_ugmLQH@#`x@dOTr^Yc_wCY z;J|^KrKP3E1_uXa#jmu~>s<^Lm+nNIvYUF$(%9JOZ*FdGUAuN|hTU#gKm_8qZr%Eg z!6Ds?NQ)S={S4>nWB_Xn7>yWJRULcw>~R4cI&`Q>Le%mCa8s{fJlF1BAl0DpiN*_5 zgen}*t*b%8hGGI40;={0XtH?Pc{W8i6JiO{BO1YvfS-A`hWB;g5>aH^#*&G52jQ5! z%D6t7wp3;4&dRs7R5S zAfAaxGYFd}6$3qpjld0_kpyuq$p}AuF5-MP7WxVP1V9>Qhe`E5@=*BaNGE`B2YU(r i$Rp}J=oh@;f6CuWyT1VeKG0000P)}>w zg9)vvjSY>7jftB04~U8W(uBkU`a@GIG}=ftQb=P8L=b30Q;-HKjpeGfEpLb6<*3jf zMk%-Kz3t9YtbBgko!RG^@9o^oGtbPz9CQ4yu$XK+28aU|0?|Mu5C%N=xXu_b0t^Cu zKo8Ij{Ap&RWZR1c5`lOiT&JC3;0|ybZ~+riT8BKrHXsRD3q(n>`GkI;31|Zz88s$D z@G2k;ctL_Ke>?Mq**mOEofZf20I-fT}6yopW2L1~5 zVLgJ=fi1v19nZ?b1|%Rx`@5k&7%WyG3s@bB1Cv>Xc;j6JIg*DWcspXcnQbfv766^W zR1Q{fI*_clMKi!6g6!VG2wnkX7;Ml?unaMB`yI%v0gODEdY%?uM|5wW1QPrPFkf18 z%x6B3>92x6!HI~#UpI=PIEsslQ;Um>Qx!#V7_k)svA{}Sg}x%KdBA%Z2p1JaaWpkG zeH0ZH6%F8ayZiI=^GmK=x$?VSn;|d=l%f%P`+CEP7>tdN9Xpo%L@YpLWaNU27cUkZ zIB?))BX)x%0v}VTmS78F)gv9d-R>wVDmr-l`0-cGu&+W>gVwb460pXoxAyk-p8Wj$ z*X(w?-OHiPX4|@T>*}besNSlos{2O$_`!}?Xt=%nYgBY1q8CH-_V$j|)z$sDbLY;L z4u|9Usbv<6#p-lAlM)gVJeMzD4k;E6kqJa1VG^w_9WTpUU0q#YYHI4oE|*J7lqD}O z@6GGiukWy0t!AZ~maA{51usT_T1J!3&d#Bfl$5g_9UUE7b6-wOOiWv}FI~DcwzjtR(6(*cWc4<$ zEUJ21axz1yn~I8x?#Rfrj>NaFf zpFX|j@ZrO`R;zWI&w+t~zQV%7771=VQ!mtlJ%||8bV^H0H}2oR|1FEfGA+vL@9*!~ zvuDpIot>RS5?uKe>}Cc=>aw!3Ejc+kJG9E~-Mi+AblvTH9*YQZka&Hz}lWXb%RnwobL5)u-$${QOSn=&#oz8D@J9yh_g z*R-admi|C&MoU9c6i0J&^Fd!?D=RB+IGxUNlf(|8%2R92!*?|9>0;BSP0=@R-aHf= z8>^Manz(S`!dKbZ+1JL$$EEG?tN2-cLrd^&8J-kHaa_H6^~0E$m__Qc@$vCTXU?4Y zeBZu(-^%dihiRMVT7q5Z+-#o8#+alf*elqU z$;imaP(eY#*^?(v{$z%I6^&XqeZ|skh%*(sDJ(2(85kItoCDo%cmLkKdy7g+O3X~! zO}fL!U(;XmY!#4g#H*qxj-yA9CIg&0b*e>Ds2B{_0L@+$C|me8B2WD^;R4Eh6$V-! zR-+2OXE~!lrN0V+mVzUQ(QbvT7MaY~z;FI41he+-K^!MoCZk0ratjDJ)djoQzl&Hl z8s362iFV+dU@C@^-S~ysDY_MLGEe%kr3plAI-9!pE#L+roVL}Izq*T9fxNz>?PmS!_EkK;`F?0?@2fre^@Iau7TFBU@T!}b793jD$KiohqJ|d`Kk$FHo5pm4G z?>Q+Q^dlAmx0xje#MQ(i;_&5&{aHN>;r$7KG|c?S1GGQ#u=DRn9v(zE=*IgakC4wn d&oRd{%0IQdq_fszZP)++002ovPDHLkV1la@He>(* literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/bg_from1.png b/runtime/Sim.WinForms/Resources/gallery/bg_from1.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3b58f50bab6e455e18d63cb3fdde4e2bfe896c GIT binary patch literal 4550 zcmeI0{ZkW08poGAVgk5@F-w`Krs@CAp}s~@=Bs1fxKP#t$)K!c4udw*_~%*pJ(?o zv)`vMB0R)q_x{}g0GrdNPM!teJ(zjazQ4=7lK5+^+&t~N6dH08n6~?UR>NHYJ|dnz z`Stm0)iNO`!zCL%tdyfBR-d(fjQF(k#?poFz5kYa=Vy0~;Ix(eC7i6bofPQaeOgSWo zP41b7;~b-uK~X&F7~A-As-SOfz`e>Osec_LB)3m>n;=b0R0+L>Zal*j@VSz#;amgS z&`PlaeVdJKVibXeo-QUP5TWc^zr(EKM~-a7WIy)NH6V_^quS-NtZ$WbFSOdi8%DFkUHDPP>rY-qZ^#Y$#bmr zq6``i6Icy^sj2%!+_=Byzt0(Xazj97rrcoQ7KlE(wK%aN`Z-24zV$%%*O~yXo6onx z&4JX=J&5jfr5;b#BTY|9OE1Vzh%9W#N1!!SeayRvGEL9KyL;eDr29;$6X(N9kWz}i z21C}u6)a5!i^hui7%PBvcV~r*WnLs7mwj;mDA_(mr!F<_lUk;17reC2%@BO0B^SlEd z=Y=?on)4wlPxY{VNS7_E8{qoIxYU)-4}dgzFL{%1=%7q5zmjO!I^M)RJDaKl&M-p4 z>Kid9wH+3^=VAj1NHO=d!j9UDIEj#eji-T zTT90ngLG|YEBE^IObbd zQ+&_L7!n`guY9U_?e!t}P{tS@S+vIRUeUZls8;hIaQoQZUD{{JX;)32tIiwNR55{V zMh7rePZc|WUuEyE_rSwKM{uy}f|bRvB*F3$EEHHMuux#3z(RqA0t*HIj}+M4E^ia# z&nNM*FF7hxN+9T$M|j^HZEW-jn#9{wLG+3B@j|+IC^sSTrM)xwF2ts^1T__r$9{ZE zVE)MmpK1}Yqr9uKhoO&dW@QmUKaQDwDdjQFQ*kdSC-slndFUrm%E1}!Z{=&1{Gk%L zEtpZ;y4GT)eBVvNB)rer)B7;0vCWvM>VLQRt}KBdblDK@2Cawo7boYeKTq>#nC7Qt zXvy8L+jp47l)8ala{D&PlR@5EoXvpWmP(IVKwK>OS8C zQB7-Fls@1mP+fH!+2Y>~){+{*C!iG)CZp0ZRR72WRsO~+QBD|UmFNh{_(okBTD-g} zC@3|E5p1mrMhp(#IKJ;M!0$h0lm1hCM8u?t1%8)?qFxug#gDnCbtK0wD3el`$KJd< zr*I80jt#TbVmnQ^jJomDPH^p@{WL#NE=+VkawrMJhht<{bH`!fB zP!5Ag96c_Nuq^;@yp7L<>s4G7lQl_Ry|@D)dxPs@%qn+rRoV`19B9u_AOi@iHI32w zK|SQCL=a>83VJ=9x@K4792+3K(!%cSy|y`xZ;3PTMqVt*)%7>Vg}zM`nOco*5IDg> zYmt{YnePH=8q$Q@gt=8>U8*aw(i)#@YtOkEZeEfFW|14Gx)MG*m(`+)7%p2eeV_Db z<}#a~(t$>^80neY@{h@NRS&W?Wnit)CaQ z3pRt7*u-B%;W-k_Xo2_v=WbM_p9sFC8+kZ0ttcNTO%DU}6k78Z#PINGl+zLo9eJHE nOv~$?QYQYX=3zGThox*_g*)n@$b#B#Z=DVbKS}?`cmMhy-0gqs literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/bg_from2.png b/runtime/Sim.WinForms/Resources/gallery/bg_from2.png new file mode 100644 index 0000000000000000000000000000000000000000..6f95b81c49fa2524ea7c4070fb56c8e77e66979b GIT binary patch literal 4133 zcmeH~|5wsk8pl6mwO5Z%#Q6I90Ui6WG#TPS8Ks0d`6q##-2Bl`dVIB@YoKsW$EngC!|?eF&5Jnnt3Cv9eLTu5*L0B+BJ^Bcn5&kFl%j5PB?&UsfC|im9frxAK5@CKKX8L$nFAN0UxfWA^ zX_jit779pOQ?Dw&3bS3~*CFiwS4sO;ONUd5k46>3=Vc729ZkjUHEM%#5ZQGW7{EPa z&wCgxGJeiY&Vyn&yWM)ts%vaTZR*_OC(O!EUEyjgvqfT2M)SK;)94hPlqVP0;(L%1 zjX_-~-w!C0BXATB56{&M^V|4kS1@jsco%19Q#0}s%d+9_VqCN5E9?T*n^o55MHBbk zQ<9qnRN~Er{As8s*)!w=dAa8YtiGfqrdA@y_sF#9rDH(G=_yL=XTigqcSTQsUap!Q z-YlIR-kN$eG&rI{B_Av?n?;h*syb^}Z?9ZKM20igOR$F9T|9Izov>KGIK&M-Q3LkV z7M$Kh%f$sAkhcOhb8vB<48QGS(xLtk1y}-gi3rip%n^a#KCVCDENo`cqu!_-d+CXCA zv1c+j=3W?RO1gfNDj_;Iz3-{`aXUoa{ae#b7$w7i=TK5a>kuLLM%StiWqQe?iEcSz zC`c&RvW&i*nZ@yq31UkX=DbBw1wQ%=n3=AVP%z&Bew{J|HyzFbvp3X_hbjt+UyZe> z?1R+XxzH(t!lWcT!}u63?xK>Iz)GYO2MtCGZ<1(o+avsOIZbB43$7Swi$e4#N=Zp3w)U@Qv(gp9Zt#-rWm2dGIz^1D3mBu>RR(NAph)5Dq?lplHI!oDV7i(6U} zHNxBs^!`=5qY^^N)GPZ0$y|$X@C>B(sMf?`-f}mmX>Tguv@yz}`Pn3bZoRjBgzgU1 z`r!?bKZM)^e)uFDc=E@;0&ztj18o8Oa-;sd=e$?xuA_G^>@4quWhWhWzQIm)*r|#; z-C(Cl?udimAc~s5FFnq&21VSJ2g$ua?q|D&Wn9w!iiikGalP`04`S;g`-;3(J)A|j zHuaGcfQ-*b>tq+GO@R^fZa#>UD1HtYDNj_m)>R&vo7F;oVQN{GN7&G@zUyI%?c=|1 zIzDh1TKDj@zqf2=LJs+b+&t~IR9jOhivy%L^W-7XyU2eq*L`^ zgS&NT4c+0FNEO+ANQtQN_o1y!5|q|Z|6cGapKRORQ#FT<9Y@jX&-u{IlWZ?B$yadw zo^?f66>>+lBr7bj7zG1c>z=frApMzTd!ZfFS^h2mEg!3Qsb$dwI0u10I6V3|GO63K z1|H*`aICQ|%kcJH0?Nw5G9ISi06SsFfo@`)TKGJL0ov0X+!?9{`edQf6J;D1%!+wL z_kv2W&yx@sW`3=DHjS-tg4f!xBGB*{jwVuMP)ni07r=A|HQ>blhF41~9WeG_2YC&H zqAao4So5?Q>aCIC!1FMDXx*{{>u?N8{vFqbGa2s@Dcs8z$+H)WtGfI7VmXq-)arEj zM%kegxv}gpgh(|LAPwC!gG-* z5aa1R6l5BUKS%b&YXK-cC8l4HhXV*%21dht#wc!!f=_A9i)~{?-Y6Hid zsPds%ZFZh9qGVIn*pt(p{lEq>ILDz4OTB>WRZO?w&ze1?yI(Rn%|@uD{$a$S#TI;6 o_N+Xa-ambc{3}-5>cJ&|s2UGtg-2eap literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/bg_home.png b/runtime/Sim.WinForms/Resources/gallery/bg_home.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc2a3f8d1d8d6e0aeeb0dc5e15f30d518bdc5e4 GIT binary patch literal 36604 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 PWzFE}>gTe~DWM4fQ2;)W literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_down_normal.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_down_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d338b9d2212e0d24e28b0b4fd041e3e193a082 GIT binary patch literal 1214 zcmV;v1VQ_WP)or8r4~v8nPhpNz=+S9}LyDKbK)^w5yuu z#TJhwuB!-?`&N`Jfh3A~xt48XbbJc^14GobtlO4t9X$}*)mto?9IkXEjz{7tIyf@s zIF7^I!f_lnI6Ue^;wjo1ONL#UwZ&7-vCbY%qlRmv`Ov7&qMbcjTRhcVG_zP|k7n8S zbDL#h**1%I_RuS__tQJqENDSGj0qAKgdWgmE6Y}vdqpmg7a=jvpT+1B8OYMn}M-tbqE?rjinmjAY%SwnWiGj-Tt)z3jG=#EP_r`j+*TEdCwm8n$J}>Ym$)-D z>O|tHU$Z{B3vXxa@Qqso2GxzCyLJmrH*oX!zl<3x(~y_Y8cT*>bOUaSb~hH>Ra-pO z9PRAUG^#(hS$cNFh{ThpU6rCW+T9q5r|6yG(Pti_X1^J2?MNKUr@iQrym&QHC5!wy zNfI`^5?JFeEm?y39VH9X%8rSHnrUVJoUt+u@4UUU@0kpc#PeLj&e&%Uy!Cptke=%nAB)B0wC&jj!mS3deD?Jim^0)Tr~87z cpy@{EUy5bw=q2Lk?f?J)07*qoM6N<$g0!hR3;+NC literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_down_press.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_down_press.png new file mode 100644 index 0000000000000000000000000000000000000000..413961ecbc866d79d1d001ea002b5afc218cca28 GIT binary patch literal 1247 zcmV<51R(o~P)fS?h=xsWNQ}3=USD(Ni3~4v z_f@JU>qzKy)2)X-&q&+_)pX?K%FIH@mqb-rJRu9#ACkj-tFeCPV8Mo+7q1`H!9MOC zFOly~xd_jH5c6UjTS^jqcQC37#6G^Sp|&lr;n$Z2+EjxcIyX}0o=LHSjFv+Y4K!_@ zOi0ZB>fqiTt(iHR`Otas`cc&&hfd!MJh2%7#8LuI-wU`^({cFR<^H3Yxy2n`=W;oI?gd=`$1D?yXyDD~CXxc>HTzz!xea9OP&HXc?|6y4US>dgr@dpvvTl=(g%}0W zt)DRHrn^(F!n$J(xHIJ@szF0tSNrxX8tN8py*1(U6xxkz0SCd&hl(eu(^deWJv}`l zrFQj5+_i)lEMn+B7C`s0078BtuW-mOEb@azOJB=KT!xcj$C*e(qO)AAjH%Al@{hW% z!i9js5KtJ}5BRf0mKWE4z`w|^t5{mRYB~_p1l>J{t(4fLd^+Wz%S9shlbF?P06>Y? zf%axUO1#;VW_fN_vk|$U%;Lp#MhHPU<(xbf*O|1OFd8+{a`rJ)odW>M6^2vIe)#17 zYV$}GZB3;pSJJyr863yXKgMX(%r?}R3?M)$1t)~?Tu1fWcna@yK89|l)6bR)XnUg+ zvXej*2tMCmii$EP0Kl|3-tGDuKmV1=B?U?dw{2om+a?n}!N|=5@YA0fKKd>Sd%mPC z!KLnDMwFiJ75h^DhK=<*2c6VD-V~Zlh-}rSEeImB zu|M=E$zZ?#YD4YNLOkacLo?~2a}PGUW2yW@I~NqmKvQTkAu;RAgL`Y<&dlX}U*|7H zT1?PSddG_8J5%m8UZUps?%=d468>IeLrr@&X9aX#?%!rwq&;cT%|A>i-jTSR=bEUd zyOHq+GPRCm9%Dg<3+TGqw?{P`ErNsB#56&Vr5K6p4jBM^PD@oplPi+pG%V6D3)acT zm+HD#(<}HB=;`SZXANm92z?sB#`*9hxIO9>w4rb~yy860#J{E>;}~F?xs?C_002ov JPDHLkV1h*6U9kWF literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_left_normal.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_left_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..21fe7d06851607425b75460621fc9c9678f0fc03 GIT binary patch literal 1198 zcmV;f1X25mP)<3ZZRM14%`isu2)vl9+fwG(m1?w2gtAMlVQO|&<-YrSg% z_V|J|JTIKJiNdbR@>0h`#Ty|CLRv3149rKCFg7u*>XiOL4f@t$_rWWw3#MtBEMJ+X$);}2o1Q>e?ePz{u zNe-91;CbQfqkGCF*>210(~sYn#7CdB;r!QLoNhap)+5^`RP8R4tO9rTK47;uEVdr_P*%8q;!mOScvit0p%VcJZ;j6B1@O|)y)L2E?PP~8Y2xPmI6PA=imdIU2 z-DY8ol*o2##_TSST)hugwWkvAzVkXnQOp|#0CveH0oclM92jF@1x2q-%ruF~nI@Tw zX}X@twg2(Gc=o_ksry1o;$Eq-c$^S6$8j8H6jd`b83`eH|6vVPqkxV@z0zvN)1F+O>_$J zQO@OZ={(O3FDx$Q41A_`KaL)G6+F)a0B$e+g^y2n;MVMX*0{OI5-dD7%3O&Rw*1bY}E3#xOQ9rO<@Y4y~IMMocUUhhLCc<=@7(aaIfDZsH$p=QlX!-T}#Neh4>+JbVR8h7QCqF!nU#?xp zV^zD;dX$)kYro&nR%oIrt)a(1-12`PzTg{VtJ^k1_NmyfS@R_^0Um& z%$>P?;HN12hu_;hbI$$lJ?A@TEfwWnr+sygZ)C zJ|vw(dslx|oRbELiq~i2Zezx9k$H=$0N|6jo~v-7$(C$64C zcgjOV`a~>mCa@zfCMp8cxV^F(h~lB`FfLX(Yn@=LhoaPWkmEeG}*#|?GIuK zbI#Z9eWPLRH@bEazI5%FZjrh(Lq*R_1^`h*!kM8Wug+cdt)2bH5)xkQ?%iX8HMWjy z@tQVWze@rHau{k~%|;++{oxEw(Kej#u^rMF?(8pFN2qhw(lef?W_q(-#WH?5REQH5 z8h-dFKcP?5kkB)htC|jJd4jOLtG_B{(QS99JQ=B@G^paokMohOrq9HkDKF728tk~z zTe(VT+O*;3gg+}2HNLyUi*NUDf+8*XPR-jm(f%;0zW~9&eJyLzqzwQ-B9Vw3<(|ji z-wr6r`fLR?B|dx+$^l(I*TiFvBNrwyI?YqYsm#XlonyM;6FF>N$a|u?+t9g7NflII znvGB2)>ha5KC*D+!XzHf*(u2YK<6$*AvK2&4MmBrQtxO2AW!7X#Z&$g~`vlp*h>nvTj}W&+#$*5xjWZQM5v3G@ z5VEo8X8ZOafaumz0vearjH!z2=b?1>twQv@tE z|A#-_NBIjL^xaEb4o$J}PGDMBiF0_x_QbRf|JK(qXR^jK_lmp*-8;c)*HOtO%A#?}j2ev0nl2Rp{BB#z>%07*qoM6N<$ Ef?ms9)&Kwi literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_right_normal.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_right_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..6be3ff7fa03908f8708f23e875a4a238371284ac GIT binary patch literal 1196 zcmV;d1XKHoP)EsuZA<{J*d@3%QrQb(z^l~Se@00^-b0Wz&RFx0eX z&q^WdkbDy^`NJMj;JnG?>a$MSt~+Fj*d;*%fP`jfikhHtRTDXm9n_6vYolkk|DJ#y zfxdc{<=brnUs>%ccRXBL0)gi<&NWOE3yaGb9iLWp!?$VI6_KdS57_W{WJgc#{Uc>8G*9o9l|y7mBDCyTf%U z4wHIdS-$=88kZ#7Z5cOo^2~XB`L!SKymtm;*Cz@(9@#FTcE@%}XbXTv!;q;SvIS&xX6jRosZ#{Uq_*+2~bKg zbZrEZO@ynmA}7=?iTLBjOxgZJubpDzRIGQ}?YbajF6uk=V95r&eZq_Ktz`fJN-4g$ z+>J|}ft)@;;Ng@dLsqbhAr{%Lkjr|Bt7Q8(udE#@_|yC)#s2U zLI}1nl#|48kqLxK0 z&a%jSLeq5sLZMDIq2bio&+e+neS4q5(@#E;!?UtN2%YB`2D6H)S%t!G-HPMn$Dd+q zW-dMEd0{UaUv9{^NlGm`%gIdQs-hA>H%y3mGWF*2U->|~Tl%?MRwUP{m*#f*kSxMJc6CI zJ5ai5V?i(_p<(#<>)NW3Jd$xjM{v-4zc1jfz(7mRU3G;bt%2UCqNs^`hQ-%f3}0yQ zlY%})M_{1E7mBD8GYji(q9&%-ny8*|bEdVkUVs<7!*wFho)ZMF>QPsPb8~44vfU`U zk!lks72QaVts2QAue`KpXkEaRF8A~`@EqT=x@zrq%93%r5f;}PVO>*HjmA|?U|A+? zCe5}~HfB>^U`oMYP>h?lT_DUh01vGV$3U%VC%-b}cDwaL*7+9(`Hh;0_T!8I0000< KMNUMnLSTZ-8BMtW literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_right_press.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_right_press.png new file mode 100644 index 0000000000000000000000000000000000000000..f71714bec06f16d2d71f7f728a0251e4a709c750 GIT binary patch literal 1223 zcmV;&1UUPNP)~$0p$V}HTDF7;Qo5!_+JYq}O&=sez&5_nrnI_r=w)|y zuE&R71iP1^e&6PI&hPg*=gjZ-JBPrfItK=%yacJ_+zD|`O8|fnXBr^46L}cfS6iEM z6NluQ(A_iGkg`aNK>71CDX%`Gd&s=WWB>>VmR2ZPToFytbjTHn@wROZH9czrp6%_g z(k#}IFzAM>cY=9ivp#5+C+%FB*$4-ds4kmL$b$W+uu@61*;SR}+Zy;r6YyZ8?D_&tGoSOuDygtjvE;XRbj1l_Hwhxp68X zG3V<&jW4v^KSuBWh@QK2NHfXa6F1A(3Fh51HkT{!G?rMH{6K(a%M-qOmTd7397@gE9mvOpJ*lxpSjpy zzXCLD+H!R=n3pXZk97Zq_`D4OkOYEHw?B&4Hu-Y`IS7XCD0xYPwg3Q$#bTmr`R;vj zEhJ^Cvt_M&gyHz^VpJ3gi@`W>^d}Xkex1weCo>y|H;-$2fEUntE>@|USI-3lfXRCn z-t3&lA5#VZfDqulR~5YTvXa$Lvpi5!g5h7l7D^nlen$7KPRk66FW6}QW*WcU)>mx% zs`K$tq#$d1Pz^>1!FtL$SvPAi$t@57<}?Ryotnnbn6_fu{!9S%n=}7YHN|8A<&;uz zLI{5t;95ip;f_Nb<~U?BD403`uUqGQnd0*u#SheDba)=U*Af|hf?hL42%lt>VnPuu z$1SWV&x7_|#dxgr-}QA4&Ed13)vSJsXmRfF3FfEC;R4C$m6@IK`dQZhDGNn1y#baQ zp^->Lw>Y^H4koiYg-ZmS++Vr^vuuu!zmMmH0YEsY!LV>S5{c*(07MUOf39qHfgp44 z9NkuoqQK$_q)d)?qkrSa-!uQSWf8(rU8XMhyiOai)Y`T+)b#k7ee=n}M9yqYR}$Iu zRAGYq7$0qV{l#7YSh*TRX0_CX?hZ^Wh(1*pRyn@??KEm1_hH~x65}(LE0`jgcqMdK zlZkU++4ewli2g9pGH0;X6SvC!y5+k0q?O1V?0;f1na|7*b~M(urv(CwPmGjB_jZkz z`qS;yjTFhm&hS)1V)j>i8fy;UKbE%rojyNs&;tFWZ@f^x9``@wBWi)yg=RF7@b{ax z)*M?sCxfCF1}iO_9821C<1dp+U~E>-@l4bfvyt&pnc4^5*jhW1eo;Ae=3;-nW_k_^ z9$urS1VhysnKe8z00h0Zrid0-B-3l!WKb6D_T_BMBzI>8AQp>>^QN=~gjN73T{2IB lJGTQuY9tbg=-K?2^$(^a;t)_D2Gall002ovPDHLkV1f~SMQ8v3 literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_up_normal.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_up_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..a474d8676bab7bae11e89686cc781d6ae5de84b4 GIT binary patch literal 1175 zcmV;I1Zew-P)~{umu!|x@~A6fds;vmG%uw`q0Kc zH0h7jN(>7LsR{o>lcuS`wzNs94>d^FU9+$|Xa&|?i%39hLnRf8D-c0rpO_!a&)Wxf z*Rt%gi{<+?Gxyx{x#!Ng_Z$iZs&8z}<`St!Ld+wC&>jGwDDx>mEr~8nebU^#QHUQZ zpTU*EXe-BBeY$R(a627}%W0<^cGeC6lB~*tD3Nth=B!prOi}fo_gha6z7)_O9&NH% zm|h#p9IN(Lx=KAoU>PQ>t*U8QefkgP=9ff8RsU8s^|RBhZ%yV4CatSO(T*S=7ZWRM zrfHg_P?@Gl63eS*kdKT0NX%CdEWpQmA|n%mAj$=UG9`!-36D$&0Y2W7H?qjcgrI8L zOT$u9HI0NvCd8|eSVvZvKRntLbKK4`bnh16mBDDMjb)Bil$GQ?CWH{&zB7&6ccwuI$qTJ4_fQQ5)g@uQXKX!{VI=RU$~-lG6E6REeaANT*5 z%L#PYZFT_VG);pLf~@Jbu=p5XebWbBHvj-f%1d#+^9(qS1M z?=Io5`NdpJVw#jmnSK~dxhP19HrMA^(Vn4X!1B*_4P1N--(yQ>Wc_V3%~D057b zWK7S@W&z5Cm}G@^($b_LO01%4TMQcNYfyaXAc_wiM0eL&c#3l$8&5L&lzl^e&6aUh z)vzwgtee@G0sveajt?i6SNH4=&D5i%RdQ`O&I8G-P0@^tbMuddLawUaiV%Xi`GlbA z+SXDP+fp3(pS002ovPDHLkV1k*jE$ILN literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/btn_arrow_up_press.png b/runtime/Sim.WinForms/Resources/gallery/btn_arrow_up_press.png new file mode 100644 index 0000000000000000000000000000000000000000..572bcea452f711f81b066d6505a1763feee01ac4 GIT binary patch literal 1237 zcmV;`1S)lCLo-b^NW(XO*3Numaieh(RIHHK=-?CtQ&{$tRm^1M5)!S_eurGW4 z`O1TUo$%}jvCxcTdwzu1l+0=(vCbSkP}QClc=6huc1@=(oxVcHzj2lmXt`8LM|0U! zL}u0xM;i9Frq^it;PTbmZJJJ6&JP!@83q8MxQO$^MGnmnj&@$}Z%ePGc6g=RTNzCV z-tUHs>`wzrmn!La|AmRDNV(_WTb@6Gv>j>&>*)38E9(UVk~{4kcPj~tbS%zMAQ}CL zPPaY?*t4dC0NB67f&DuiIYsGyz(F*fmUi9r?gIb@011<}-kose<&wtJZ>o52*9HJU zd9j2qx`U7Pa}W$ns(IDLfmQ(Bw5O*>qSV^s3){28j(awyU;xlq;ly#z#;ognVFfmZ zy%+lWWID&C%8+J@ul7XWJSqSf z4<7(;N3@ovSu|8kM`}QC%Fk)$+EdmI8nz z@UyQJhUW<~X6LCy2*>Wi(7fGdwF3*^(x!UP4F@xaUvx*-omlRUa699pjr(8gP5}Wx zVn%CC$*iVI`nthXS;y-ovzkK9V~cYsU}Jstpp9B*noFl55?c}4Czix494eiTGFYFy zbD(NyaX#Y}BWBQ+&e6?|P+VLSOqF#smrg}wW`2L9!E-9Tmhu1S(zU*m2IyD4<8I}C z!108asCiyf64WHZPd6U$oLlKxMVGJlR~RNa7d2_w9}}w67gn-d6SZU-86Q=sc`W@H za{?}^>!x>~rVA%UfqOzRF%gP05>5yT0JvrvF*a0JSGVGOoJs!yd#2w5VXEj*00000NkvXXu0mjf^0Psi literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/day_01.png b/runtime/Sim.WinForms/Resources/gallery/day_01.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd420fff343ace16c0c030a6e9188895a99eea1 GIT binary patch literal 24836 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 Cy*U>E literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/icon_02.png b/runtime/Sim.WinForms/Resources/gallery/icon_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7d54f28108f932b07a82b8ffefe7ff3e00285e43 GIT binary patch literal 6879 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 literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/icon_03.png b/runtime/Sim.WinForms/Resources/gallery/icon_03.png new file mode 100644 index 0000000000000000000000000000000000000000..e5cae4c3ecd059e8b4342f6c6029bde07221e57e GIT binary patch literal 6708 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 OfR5&4jS4k5`hNhB{)RIE literal 0 HcmV?d00001 diff --git a/runtime/Sim.WinForms/Resources/gallery/index.json b/runtime/Sim.WinForms/Resources/gallery/index.json index bcac970..3f1d233 100644 --- a/runtime/Sim.WinForms/Resources/gallery/index.json +++ b/runtime/Sim.WinForms/Resources/gallery/index.json @@ -1,5 +1,27 @@ [ { "name": "switch_on", "file": "switch_on.png", "label": "开关:开", "kind": "image" }, { "name": "switch_off", "file": "switch_off.png", "label": "开关:关", "kind": "image" }, - { "name": "ring", "file": "ring.mp3", "label": "铃声", "kind": "audio" } + { "name": "ring", "file": "ring.mp3", "label": "铃声", "kind": "audio" }, + { "name": "ico_title", "file": "ico_title.png", "label": "标题:智慧校园", "kind": "image" }, + { "name": "bg_home", "file": "bg_home.png", "label": "主界面背景:校园", "kind": "image" }, + { "name": "icon_02", "file": "icon_02.png", "label": "图标:校园环境", "kind": "image" }, + { "name": "icon_03", "file": "icon_03.png", "label": "图标:校园安防", "kind": "image" }, + { "name": "icon_04", "file": "icon_04.png", "label": "图标:退出", "kind": "image" }, + { "name": "day_01", "file": "day_01.png", "label": "路灯场景:亮灯", "kind": "image" }, + { "name": "day_02", "file": "day_02.png", "label": "路灯场景:灭灯", "kind": "image" }, + { "name": "bg_from1", "file": "bg_from1.png", "label": "面板背景(宽)", "kind": "image" }, + { "name": "bg_from2", "file": "bg_from2.png", "label": "面板背景(窄)", "kind": "image" }, + { "name": "icon_monitor", "file": "icon_monitor.png", "label": "监控:无画面", "kind": "image" }, + { "name": "panel_video_ctrl", "file": "panel_video_ctrl.png", "label": "监控:方向盘底座", "kind": "image" }, + { "name": "btn_arrow_up_normal", "file": "btn_arrow_up_normal.png", "label": "方向键:上", "kind": "image" }, + { "name": "btn_arrow_up_press", "file": "btn_arrow_up_press.png", "label": "方向键:上(按下)", "kind": "image" }, + { "name": "btn_arrow_down_normal", "file": "btn_arrow_down_normal.png", "label": "方向键:下", "kind": "image" }, + { "name": "btn_arrow_down_press", "file": "btn_arrow_down_press.png", "label": "方向键:下(按下)", "kind": "image" }, + { "name": "btn_arrow_left_normal", "file": "btn_arrow_left_normal.png", "label": "方向键:左", "kind": "image" }, + { "name": "btn_arrow_left_press", "file": "btn_arrow_left_press.png", "label": "方向键:左(按下)", "kind": "image" }, + { "name": "btn_arrow_right_normal", "file": "btn_arrow_right_normal.png", "label": "方向键:右", "kind": "image" }, + { "name": "btn_arrow_right_press", "file": "btn_arrow_right_press.png", "label": "方向键:右(按下)", "kind": "image" }, + { "name": "arrow_left_normal", "file": "arrow_left_normal.png", "label": "翻页:上一张", "kind": "image" }, + { "name": "arrow_right_normal", "file": "arrow_right_normal.png", "label": "翻页:下一张", "kind": "image" }, + { "name": "windowstate_closed_hover", "file": "windowstate_closed_hover.png", "label": "关闭按钮", "kind": "image" } ] diff --git a/runtime/Sim.WinForms/Resources/gallery/panel_video_ctrl.png b/runtime/Sim.WinForms/Resources/gallery/panel_video_ctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..117831a4a805cb81041754a884f225666539ffea GIT binary patch literal 56223 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\n{body}\n\n', + encoding="utf-8", + ) + + +# ---------- 标题图:智慧校园 ---------- +save("ico_title", 226, 54, f""" + + + + + + + 智慧校园 +""") + +# ---------- 校园建筑:主界面背景、路灯场景共用的元素 ---------- +def building(x, y, w, h, color, window="#cfe3f5", rows=4, cols=6, roof="#b36b45"): + parts = [f'', + f''] + gap_x = w / cols + gap_y = (h - 30) / rows + for r in range(rows): + for c in range(cols): + parts.append(f'') + return "\n".join(parts) + + +def tree(x, y, s=1.0, color="#4f9a45"): + return (f'' + f'' + f'') + + +save("bg_home", 1440, 748, f""" + + + + + + + + + + + + + + {building(380, 260, 680, 300, "#f2e3c9")} + + + + {building(1080, 360, 220, 200, "#e8d6bd", rows=3, cols=4)} + {building(150, 380, 210, 180, "#e8d6bd", rows=3, cols=4)} + + + {tree(120, 600, 1.1)}{tree(330, 620, 0.9)}{tree(1130, 610, 1.0)}{tree(1350, 600, 1.2)} + +""") + + +def street(lit): + sky = ('' if lit + else '') + window = "#ffd37a" if lit else "#cfe3f5" + lamps = [] + for x in (180, 520, 860, 1200): + lamps.append(f'' + f'' + f'') + if lit: + lamps.append(f'' + f'') + else: + lamps.append(f'') + return f""" + {sky} + + {'' if lit else ''} + {building(80, 220, 560, 330, "#e9d8bf", window=window, rows=5, cols=7)} + {building(760, 260, 580, 290, "#dcc7a8", window=window, rows=4, cols=7)} + + + {''.join(f'' for x in range(30, 1440, 140))} + {''.join(lamps)} + {tree(700, 560, 0.8, "#3f7f45")}{tree(1390, 560, 0.9, "#3f7f45")} +""" + + +save("day_01", 1440, 716, street(lit=True)) +save("day_02", 1440, 716, street(lit=False)) + +# ---------- 主界面的三个功能图标 ---------- +def tile(name, color, icon, label): + save(name, 180, 210, f""" + + + {icon} + {label} +""") + + +tile("icon_02", "#2e9e5b", """ + + + """, "校园环境") +tile("icon_03", "#2f7fe0", """ + + """, "校园安防") +tile("icon_04", "#e2803a", """ + + """, "退 出") + +# ---------- 面板背景(半透明深蓝) ---------- +for name, width in (("bg_from1", 555), ("bg_from2", 425)): + save(name, width, 670, f""" + + + +""") + +# ---------- 监控:无画面时的图标、方向盘底座、方向键 ---------- +save("icon_monitor", 280, 280, """ + + + + + + +""") + +save("panel_video_ctrl", 500, 500, """ + + + + +""") + +ROTATE = {"up": 0, "right": 90, "down": 180, "left": 270} +for direction, angle in ROTATE.items(): + for state, (fill, stroke) in {"normal": ("#ffffff", "#5b6472"), "press": ("#2f7fe0", "#ffffff")}.items(): + save(f"btn_arrow_{direction}_{state}", 28, 28, f""" + + +""") + +for direction, angle in (("left", 270), ("right", 90)): + save(f"arrow_{direction}_normal", 60, 60, f""" + + +""") + +save("windowstate_closed_hover", 36, 36, """ + + +""") diff --git a/runtime/Sim.WinForms/Resources/svg/arrow_left_normal.svg b/runtime/Sim.WinForms/Resources/svg/arrow_left_normal.svg new file mode 100644 index 0000000..f62878e --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/arrow_left_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/arrow_right_normal.svg b/runtime/Sim.WinForms/Resources/svg/arrow_right_normal.svg new file mode 100644 index 0000000..711557f --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/arrow_right_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/bg_from1.svg b/runtime/Sim.WinForms/Resources/svg/bg_from1.svg new file mode 100644 index 0000000..c4454a1 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/bg_from1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/bg_from2.svg b/runtime/Sim.WinForms/Resources/svg/bg_from2.svg new file mode 100644 index 0000000..4d7feee --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/bg_from2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/bg_home.svg b/runtime/Sim.WinForms/Resources/svg/bg_home.svg new file mode 100644 index 0000000..9bc0a17 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/bg_home.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_down_normal.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_down_normal.svg new file mode 100644 index 0000000..4eb09ad --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_down_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_down_press.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_down_press.svg new file mode 100644 index 0000000..208587d --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_down_press.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_left_normal.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_left_normal.svg new file mode 100644 index 0000000..cc40767 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_left_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_left_press.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_left_press.svg new file mode 100644 index 0000000..aec3fa1 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_left_press.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_right_normal.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_right_normal.svg new file mode 100644 index 0000000..9da15cc --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_right_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_right_press.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_right_press.svg new file mode 100644 index 0000000..2a25d34 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_right_press.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_up_normal.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_up_normal.svg new file mode 100644 index 0000000..c58eb21 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_up_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/btn_arrow_up_press.svg b/runtime/Sim.WinForms/Resources/svg/btn_arrow_up_press.svg new file mode 100644 index 0000000..2b22a43 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/btn_arrow_up_press.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/day_01.svg b/runtime/Sim.WinForms/Resources/svg/day_01.svg new file mode 100644 index 0000000..540d394 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/day_01.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/day_02.svg b/runtime/Sim.WinForms/Resources/svg/day_02.svg new file mode 100644 index 0000000..1635baa --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/day_02.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/ico_title.svg b/runtime/Sim.WinForms/Resources/svg/ico_title.svg new file mode 100644 index 0000000..a6db8c0 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/ico_title.svg @@ -0,0 +1,11 @@ + + + + + + + + + 智慧校园 + + diff --git a/runtime/Sim.WinForms/Resources/svg/icon_02.svg b/runtime/Sim.WinForms/Resources/svg/icon_02.svg new file mode 100644 index 0000000..b5090ce --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/icon_02.svg @@ -0,0 +1,11 @@ + + + + + + + + + 校园环境 + + diff --git a/runtime/Sim.WinForms/Resources/svg/icon_03.svg b/runtime/Sim.WinForms/Resources/svg/icon_03.svg new file mode 100644 index 0000000..4510677 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/icon_03.svg @@ -0,0 +1,10 @@ + + + + + + + + 校园安防 + + diff --git a/runtime/Sim.WinForms/Resources/svg/icon_04.svg b/runtime/Sim.WinForms/Resources/svg/icon_04.svg new file mode 100644 index 0000000..a27efdc --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/icon_04.svg @@ -0,0 +1,10 @@ + + + + + + + + 退 出 + + diff --git a/runtime/Sim.WinForms/Resources/svg/icon_monitor.svg b/runtime/Sim.WinForms/Resources/svg/icon_monitor.svg new file mode 100644 index 0000000..dab38b8 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/icon_monitor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/svg/panel_video_ctrl.svg b/runtime/Sim.WinForms/Resources/svg/panel_video_ctrl.svg new file mode 100644 index 0000000..629f50c --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/panel_video_ctrl.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/runtime/Sim.WinForms/Resources/switch_off.svg b/runtime/Sim.WinForms/Resources/svg/switch_off.svg similarity index 100% rename from runtime/Sim.WinForms/Resources/switch_off.svg rename to runtime/Sim.WinForms/Resources/svg/switch_off.svg diff --git a/runtime/Sim.WinForms/Resources/switch_on.svg b/runtime/Sim.WinForms/Resources/svg/switch_on.svg similarity index 100% rename from runtime/Sim.WinForms/Resources/switch_on.svg rename to runtime/Sim.WinForms/Resources/svg/switch_on.svg diff --git a/runtime/Sim.WinForms/Resources/svg/windowstate_closed_hover.svg b/runtime/Sim.WinForms/Resources/svg/windowstate_closed_hover.svg new file mode 100644 index 0000000..be70646 --- /dev/null +++ b/runtime/Sim.WinForms/Resources/svg/windowstate_closed_hover.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/samples/p8-t1-主界面/Main.Designer.cs b/samples/p8-t1-主界面/Main.Designer.cs new file mode 100644 index 0000000..4a5eed4 --- /dev/null +++ b/samples/p8-t1-主界面/Main.Designer.cs @@ -0,0 +1,142 @@ +namespace 智慧校园 +{ + partial class Main + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.pic_exit = new System.Windows.Forms.PictureBox(); + this.pic_security = new System.Windows.Forms.PictureBox(); + this.pic_environment = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(147)))), ((int)(((byte)(237))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1018, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(57, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(197, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.BackgroundImage = global::智慧校园.Properties.Resources.bg_home; + this.panel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel2.Controls.Add(this.pic_exit); + this.panel2.Controls.Add(this.pic_security); + this.panel2.Controls.Add(this.pic_environment); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1018, 516); + this.panel2.TabIndex = 1; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // pic_exit + // + this.pic_exit.BackColor = System.Drawing.Color.Transparent; + this.pic_exit.Image = global::智慧校园.Properties.Resources.icon_04; + this.pic_exit.Location = new System.Drawing.Point(660, 124); + this.pic_exit.Name = "pic_exit"; + this.pic_exit.Size = new System.Drawing.Size(180, 210); + this.pic_exit.TabIndex = 6; + this.pic_exit.TabStop = false; + this.pic_exit.Click += new System.EventHandler(this.pic_exit_Click); + // + // pic_security + // + this.pic_security.BackColor = System.Drawing.Color.Transparent; + this.pic_security.Image = global::智慧校园.Properties.Resources.icon_03; + this.pic_security.Location = new System.Drawing.Point(404, 124); + this.pic_security.Name = "pic_security"; + this.pic_security.Size = new System.Drawing.Size(180, 210); + this.pic_security.TabIndex = 5; + this.pic_security.TabStop = false; + // + // pic_environment + // + this.pic_environment.BackColor = System.Drawing.Color.Transparent; + this.pic_environment.Image = global::智慧校园.Properties.Resources.icon_02; + this.pic_environment.Location = new System.Drawing.Point(133, 124); + this.pic_environment.Name = "pic_environment"; + this.pic_environment.Size = new System.Drawing.Size(180, 210); + this.pic_environment.TabIndex = 4; + this.pic_environment.TabStop = false; + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1018, 616); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_exit; + private System.Windows.Forms.PictureBox pic_security; + private System.Windows.Forms.PictureBox pic_environment; + } +} + diff --git a/samples/p8-t1-主界面/Main.cs b/samples/p8-t1-主界面/Main.cs new file mode 100644 index 0000000..ff92a94 --- /dev/null +++ b/samples/p8-t1-主界面/Main.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +namespace 智慧校园 +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { + + } + + private void pic_exit_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t1-主界面/Program.cs b/samples/p8-t1-主界面/Program.cs new file mode 100644 index 0000000..2fd691b --- /dev/null +++ b/samples/p8-t1-主界面/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace 智慧校园 +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + } +} diff --git a/samples/p8-t1-主界面/Properties/Resources.Designer.cs b/samples/p8-t1-主界面/Properties/Resources.Designer.cs new file mode 100644 index 0000000..fcccaeb --- /dev/null +++ b/samples/p8-t1-主界面/Properties/Resources.Designer.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// +// 项目资源(平台素材库)。在"项目资源"里添加或移除,不要手动修改这个文件。 +// +//------------------------------------------------------------------------------ + +namespace 智慧校园.Properties { + + /// + /// 项目资源:Properties.Resources.资源名 + /// + internal class Resources { + + /// 标题:智慧校园 + internal static System.Drawing.Bitmap ico_title { + get { return global::Sim.Host.ProjectResources.Image("ico_title.png"); } + } + + /// 主界面背景:校园 + internal static System.Drawing.Bitmap bg_home { + get { return global::Sim.Host.ProjectResources.Image("bg_home.png"); } + } + + /// 图标:校园环境 + internal static System.Drawing.Bitmap icon_02 { + get { return global::Sim.Host.ProjectResources.Image("icon_02.png"); } + } + + /// 图标:校园安防 + internal static System.Drawing.Bitmap icon_03 { + get { return global::Sim.Host.ProjectResources.Image("icon_03.png"); } + } + + /// 图标:退出 + internal static System.Drawing.Bitmap icon_04 { + get { return global::Sim.Host.ProjectResources.Image("icon_04.png"); } + } + } +} diff --git a/samples/p8-t1-主界面/checks.yaml b/samples/p8-t1-主界面/checks.yaml new file mode 100644 index 0000000..b562e3a --- /dev/null +++ b/samples/p8-t1-主界面/checks.yaml @@ -0,0 +1,14 @@ +# 评分规则:书上评价表的功能项。每项单独启动一次程序,按步骤操作,核对结果。 +# 格式说明见 server/src/grading/checks.ts +- title: 主界面显示标题和三个功能入口 + steps: + - expect: { control: pictureBox1, image: ico_title, desc: 显示"智慧校园"标题图(ico_title) } + - expect: { control: panel2, background: bg_home, desc: 背景是校园图片(bg_home) } + - expect: { control: pic_environment, image: icon_02, desc: 显示"校园环境"图标(icon_02) } + - expect: { control: pic_security, image: icon_03, desc: 显示"校园安防"图标(icon_03) } + - expect: { control: pic_exit, image: icon_04, desc: 显示"退出"图标(icon_04) } + +- title: 实现退出功能 + steps: + - click: pic_exit + - expect: { exited: true, desc: 点"退出"后关闭主窗体、程序退出 } diff --git a/samples/p8-t1-主界面/meta.json b/samples/p8-t1-主界面/meta.json new file mode 100644 index 0000000..48957c3 --- /dev/null +++ b/samples/p8-t1-主界面/meta.json @@ -0,0 +1,4 @@ +{ + "title": "项目8 任务1 制作管理平台的主界面", + "source": "教材书 p157–159,界面和代码取自配套参考工程;图片是平台素材库里自绘的同名素材(尺寸和教材一致)" +} diff --git a/samples/p8-t2-校园环境界面/Environment.Designer.cs b/samples/p8-t2-校园环境界面/Environment.Designer.cs new file mode 100644 index 0000000..5ac17cc --- /dev/null +++ b/samples/p8-t2-校园环境界面/Environment.Designer.cs @@ -0,0 +1,545 @@ +namespace 智慧校园 +{ + partial class Environment + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Legend legend4 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panel_bg = new System.Windows.Forms.Panel(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panel_form = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.pic_lampOpen = new System.Windows.Forms.PictureBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.txt_autoLight = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.ch_autoLamp = new System.Windows.Forms.CheckBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.btn_ledEnvironment2 = new System.Windows.Forms.Button(); + this.ch_autoLedFire = new System.Windows.Forms.CheckBox(); + this.btn_ledSendMsg = new System.Windows.Forms.Button(); + this.txt_ledMsg = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.btn_dataAnalyse = new System.Windows.Forms.Button(); + this.btn_ledEnvironment1 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.txt_humidity = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txt_fire = new System.Windows.Forms.TextBox(); + this.txt_temperature = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txt_smoke = new System.Windows.Forms.TextBox(); + this.txt_light = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lb_return = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + this.panel_bg.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + this.panel_form.SuspendLayout(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).BeginInit(); + this.groupBox3.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1043, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(44, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(226, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.Controls.Add(this.panel_bg); + this.panel2.Controls.Add(this.panel3); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1043, 691); + this.panel2.TabIndex = 1; + // + // panel_bg + // + this.panel_bg.BackgroundImage = global::智慧校园.Properties.Resources.day_02; + this.panel_bg.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel_bg.Controls.Add(this.chart1); + this.panel_bg.Controls.Add(this.panel_form); + this.panel_bg.Controls.Add(this.panel5); + this.panel_bg.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_bg.Location = new System.Drawing.Point(0, 39); + this.panel_bg.Name = "panel_bg"; + this.panel_bg.Size = new System.Drawing.Size(1043, 652); + this.panel_bg.TabIndex = 1; + // + // chart1 + // + chartArea2.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea2); + legend3.Name = "MaxLegend"; + legend3.TitleForeColor = System.Drawing.Color.DimGray; + legend4.Name = "AVGLegend"; + legend4.TitleForeColor = System.Drawing.Color.DimGray; + this.chart1.Legends.Add(legend3); + this.chart1.Legends.Add(legend4); + this.chart1.Location = new System.Drawing.Point(44, 172); + this.chart1.Name = "chart1"; + series3.ChartArea = "ChartArea1"; + series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series3.Legend = "MaxLegend"; + series3.LegendText = "最大值"; + series3.Name = "MaxSeries"; + series3.XValueMember = "_Time"; + series3.YValueMembers = "MaxTemperature"; + series4.ChartArea = "ChartArea1"; + series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series4.Legend = "AVGLegend"; + series4.LegendText = "平均值"; + series4.Name = "AVGSeries"; + series4.XValueMember = "_Time"; + series4.YValueMembers = "AVGTemperature"; + this.chart1.Series.Add(series3); + this.chart1.Series.Add(series4); + this.chart1.Size = new System.Drawing.Size(455, 327); + this.chart1.TabIndex = 3; + this.chart1.Text = "chart1"; + // + // panel_form + // + this.panel_form.BackColor = System.Drawing.Color.Transparent; + this.panel_form.BackgroundImage = global::智慧校园.Properties.Resources.bg_from2; + this.panel_form.Controls.Add(this.groupBox2); + this.panel_form.Controls.Add(this.groupBox3); + this.panel_form.Dock = System.Windows.Forms.DockStyle.Right; + this.panel_form.Location = new System.Drawing.Point(617, 0); + this.panel_form.Name = "panel_form"; + this.panel_form.Size = new System.Drawing.Size(426, 552); + this.panel_form.TabIndex = 2; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.pic_lampOpen); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.txt_autoLight); + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.ch_autoLamp); + this.groupBox2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox2.ForeColor = System.Drawing.Color.White; + this.groupBox2.Location = new System.Drawing.Point(22, 21); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(392, 150); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "路灯控制"; + // + // pic_lampOpen + // + this.pic_lampOpen.BackgroundImage = global::智慧校园.Properties.Resources.switch_off; + this.pic_lampOpen.Location = new System.Drawing.Point(103, 103); + this.pic_lampOpen.Name = "pic_lampOpen"; + this.pic_lampOpen.Size = new System.Drawing.Size(48, 24); + this.pic_lampOpen.TabIndex = 5; + this.pic_lampOpen.TabStop = false; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(33, 105); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(59, 17); + this.label10.TabIndex = 4; + this.label10.Text = "灯光控制:"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(278, 58); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(17, 17); + this.label9.TabIndex = 3; + this.label9.Text = "lx"; + // + // txt_autoLight + // + this.txt_autoLight.Location = new System.Drawing.Point(128, 55); + this.txt_autoLight.Name = "txt_autoLight"; + this.txt_autoLight.Size = new System.Drawing.Size(144, 23); + this.txt_autoLight.TabIndex = 2; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(33, 58); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(92, 17); + this.label7.TabIndex = 1; + this.label7.Text = "设定开灯光照值"; + // + // ch_autoLamp + // + this.ch_autoLamp.AutoSize = true; + this.ch_autoLamp.Location = new System.Drawing.Point(35, 30); + this.ch_autoLamp.Name = "ch_autoLamp"; + this.ch_autoLamp.Size = new System.Drawing.Size(75, 21); + this.ch_autoLamp.TabIndex = 0; + this.ch_autoLamp.Text = "自动控制"; + this.ch_autoLamp.UseVisualStyleBackColor = true; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.btn_ledEnvironment2); + this.groupBox3.Controls.Add(this.ch_autoLedFire); + this.groupBox3.Controls.Add(this.btn_ledSendMsg); + this.groupBox3.Controls.Add(this.txt_ledMsg); + this.groupBox3.Controls.Add(this.label8); + this.groupBox3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox3.ForeColor = System.Drawing.Color.White; + this.groupBox3.Location = new System.Drawing.Point(22, 209); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(392, 316); + this.groupBox3.TabIndex = 4; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "LED推送"; + // + // btn_ledEnvironment2 + // + this.btn_ledEnvironment2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment2.Location = new System.Drawing.Point(234, 217); + this.btn_ledEnvironment2.Name = "btn_ledEnvironment2"; + this.btn_ledEnvironment2.Size = new System.Drawing.Size(145, 32); + this.btn_ledEnvironment2.TabIndex = 11; + this.btn_ledEnvironment2.Text = "推送天气信息"; + this.btn_ledEnvironment2.UseVisualStyleBackColor = false; + // + // ch_autoLedFire + // + this.ch_autoLedFire.AutoSize = true; + this.ch_autoLedFire.Location = new System.Drawing.Point(265, 35); + this.ch_autoLedFire.Name = "ch_autoLedFire"; + this.ch_autoLedFire.Size = new System.Drawing.Size(99, 21); + this.ch_autoLedFire.TabIndex = 4; + this.ch_autoLedFire.Text = "自动推送火情"; + this.ch_autoLedFire.UseVisualStyleBackColor = true; + // + // btn_ledSendMsg + // + this.btn_ledSendMsg.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_ledSendMsg.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledSendMsg.Location = new System.Drawing.Point(26, 217); + this.btn_ledSendMsg.Name = "btn_ledSendMsg"; + this.btn_ledSendMsg.Size = new System.Drawing.Size(145, 32); + this.btn_ledSendMsg.TabIndex = 2; + this.btn_ledSendMsg.Text = "推送LED信息"; + this.btn_ledSendMsg.UseVisualStyleBackColor = false; + // + // txt_ledMsg + // + this.txt_ledMsg.Location = new System.Drawing.Point(23, 62); + this.txt_ledMsg.Multiline = true; + this.txt_ledMsg.Name = "txt_ledMsg"; + this.txt_ledMsg.Size = new System.Drawing.Size(356, 130); + this.txt_ledMsg.TabIndex = 1; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(20, 36); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(54, 17); + this.label8.TabIndex = 0; + this.label8.Text = "LED信息"; + // + // panel5 + // + this.panel5.Controls.Add(this.btn_dataAnalyse); + this.panel5.Controls.Add(this.btn_ledEnvironment1); + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.txt_humidity); + this.panel5.Controls.Add(this.label1); + this.panel5.Controls.Add(this.label5); + this.panel5.Controls.Add(this.txt_fire); + this.panel5.Controls.Add(this.txt_temperature); + this.panel5.Controls.Add(this.label2); + this.panel5.Controls.Add(this.label4); + this.panel5.Controls.Add(this.txt_smoke); + this.panel5.Controls.Add(this.txt_light); + this.panel5.Controls.Add(this.label3); + this.panel5.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel5.Location = new System.Drawing.Point(0, 552); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(1043, 100); + this.panel5.TabIndex = 1; + // + // btn_dataAnalyse + // + this.btn_dataAnalyse.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_dataAnalyse.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_dataAnalyse.Location = new System.Drawing.Point(792, 35); + this.btn_dataAnalyse.Name = "btn_dataAnalyse"; + this.btn_dataAnalyse.Size = new System.Drawing.Size(119, 32); + this.btn_dataAnalyse.TabIndex = 23; + this.btn_dataAnalyse.Text = "数据分析"; + this.btn_dataAnalyse.UseVisualStyleBackColor = false; + // + // btn_ledEnvironment1 + // + this.btn_ledEnvironment1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment1.Location = new System.Drawing.Point(910, 35); + this.btn_ledEnvironment1.Name = "btn_ledEnvironment1"; + this.btn_ledEnvironment1.Size = new System.Drawing.Size(121, 32); + this.btn_ledEnvironment1.TabIndex = 15; + this.btn_ledEnvironment1.Text = "推送天气信息"; + this.btn_ledEnvironment1.UseVisualStyleBackColor = false; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("微软雅黑", 18F); + this.label6.Location = new System.Drawing.Point(12, 31); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(110, 31); + this.label6.TabIndex = 11; + this.label6.Text = "环境数据"; + // + // txt_humidity + // + this.txt_humidity.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_humidity.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_humidity.Location = new System.Drawing.Point(716, 36); + this.txt_humidity.Name = "txt_humidity"; + this.txt_humidity.Size = new System.Drawing.Size(70, 32); + this.txt_humidity.TabIndex = 22; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label1.Location = new System.Drawing.Point(132, 38); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 25); + this.label1.TabIndex = 12; + this.label1.Text = "火焰"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label5.Location = new System.Drawing.Point(660, 39); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(50, 25); + this.label5.TabIndex = 21; + this.label5.Text = "湿度"; + // + // txt_fire + // + this.txt_fire.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_fire.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_fire.Location = new System.Drawing.Point(188, 35); + this.txt_fire.Name = "txt_fire"; + this.txt_fire.Size = new System.Drawing.Size(70, 32); + this.txt_fire.TabIndex = 13; + // + // txt_temperature + // + this.txt_temperature.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_temperature.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_temperature.Location = new System.Drawing.Point(584, 35); + this.txt_temperature.Name = "txt_temperature"; + this.txt_temperature.Size = new System.Drawing.Size(70, 32); + this.txt_temperature.TabIndex = 20; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label2.Location = new System.Drawing.Point(264, 36); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(50, 25); + this.label2.TabIndex = 14; + this.label2.Text = "烟雾"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label4.Location = new System.Drawing.Point(528, 38); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(50, 25); + this.label4.TabIndex = 19; + this.label4.Text = "温度"; + // + // txt_smoke + // + this.txt_smoke.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_smoke.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_smoke.Location = new System.Drawing.Point(320, 33); + this.txt_smoke.Name = "txt_smoke"; + this.txt_smoke.Size = new System.Drawing.Size(70, 32); + this.txt_smoke.TabIndex = 16; + // + // txt_light + // + this.txt_light.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_light.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_light.Location = new System.Drawing.Point(452, 32); + this.txt_light.Name = "txt_light"; + this.txt_light.Size = new System.Drawing.Size(70, 32); + this.txt_light.TabIndex = 18; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label3.Location = new System.Drawing.Point(396, 35); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(50, 25); + this.label3.TabIndex = 17; + this.label3.Text = "光照"; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel3.Controls.Add(this.lb_return); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(0, 0); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1043, 39); + this.panel3.TabIndex = 0; + this.panel3.Paint += new System.Windows.Forms.PaintEventHandler(this.panel3_Paint); + // + // lb_return + // + this.lb_return.AutoSize = true; + this.lb_return.Location = new System.Drawing.Point(25, 12); + this.lb_return.Name = "lb_return"; + this.lb_return.Size = new System.Drawing.Size(83, 12); + this.lb_return.TabIndex = 0; + this.lb_return.Text = "< 返回主窗体"; + this.lb_return.Click += new System.EventHandler(this.lb_return_Click); + // + // Environment + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1043, 791); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Environment"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Environment"; + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel_bg.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.panel_form.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).EndInit(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lb_return; + private System.Windows.Forms.Panel panel_bg; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel_form; + private System.Windows.Forms.Button btn_dataAnalyse; + private System.Windows.Forms.Button btn_ledEnvironment1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txt_humidity; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txt_fire; + private System.Windows.Forms.TextBox txt_temperature; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txt_smoke; + private System.Windows.Forms.TextBox txt_light; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.PictureBox pic_lampOpen; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox txt_autoLight; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox ch_autoLamp; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button btn_ledEnvironment2; + private System.Windows.Forms.CheckBox ch_autoLedFire; + private System.Windows.Forms.Button btn_ledSendMsg; + private System.Windows.Forms.TextBox txt_ledMsg; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + } +} \ No newline at end of file diff --git a/samples/p8-t2-校园环境界面/Environment.cs b/samples/p8-t2-校园环境界面/Environment.cs new file mode 100644 index 0000000..9b386a7 --- /dev/null +++ b/samples/p8-t2-校园环境界面/Environment.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace 智慧校园 +{ + public partial class Environment : Form + { + public Environment() + { + InitializeComponent(); + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void lb_return_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void panel3_Paint(object sender, PaintEventArgs e) + { + + } + } +} diff --git a/samples/p8-t2-校园环境界面/Main.Designer.cs b/samples/p8-t2-校园环境界面/Main.Designer.cs new file mode 100644 index 0000000..4b2afe5 --- /dev/null +++ b/samples/p8-t2-校园环境界面/Main.Designer.cs @@ -0,0 +1,143 @@ +namespace 智慧校园 +{ + partial class Main + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.pic_exit = new System.Windows.Forms.PictureBox(); + this.pic_security = new System.Windows.Forms.PictureBox(); + this.pic_environment = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(147)))), ((int)(((byte)(237))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1018, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(57, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(197, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.BackgroundImage = global::智慧校园.Properties.Resources.bg_home; + this.panel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel2.Controls.Add(this.pic_exit); + this.panel2.Controls.Add(this.pic_security); + this.panel2.Controls.Add(this.pic_environment); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1018, 516); + this.panel2.TabIndex = 1; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // pic_exit + // + this.pic_exit.BackColor = System.Drawing.Color.Transparent; + this.pic_exit.Image = global::智慧校园.Properties.Resources.icon_04; + this.pic_exit.Location = new System.Drawing.Point(660, 124); + this.pic_exit.Name = "pic_exit"; + this.pic_exit.Size = new System.Drawing.Size(180, 210); + this.pic_exit.TabIndex = 6; + this.pic_exit.TabStop = false; + this.pic_exit.Click += new System.EventHandler(this.pic_exit_Click); + // + // pic_security + // + this.pic_security.BackColor = System.Drawing.Color.Transparent; + this.pic_security.Image = global::智慧校园.Properties.Resources.icon_03; + this.pic_security.Location = new System.Drawing.Point(404, 124); + this.pic_security.Name = "pic_security"; + this.pic_security.Size = new System.Drawing.Size(180, 210); + this.pic_security.TabIndex = 5; + this.pic_security.TabStop = false; + // + // pic_environment + // + this.pic_environment.BackColor = System.Drawing.Color.Transparent; + this.pic_environment.Image = global::智慧校园.Properties.Resources.icon_02; + this.pic_environment.Location = new System.Drawing.Point(133, 124); + this.pic_environment.Name = "pic_environment"; + this.pic_environment.Size = new System.Drawing.Size(180, 210); + this.pic_environment.TabIndex = 4; + this.pic_environment.TabStop = false; + this.pic_environment.Click += new System.EventHandler(this.pic_environment_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1018, 616); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_exit; + private System.Windows.Forms.PictureBox pic_security; + private System.Windows.Forms.PictureBox pic_environment; + } +} + diff --git a/samples/p8-t2-校园环境界面/Main.cs b/samples/p8-t2-校园环境界面/Main.cs new file mode 100644 index 0000000..094140b --- /dev/null +++ b/samples/p8-t2-校园环境界面/Main.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +namespace 智慧校园 +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void pic_environment_Click(object sender, EventArgs e) + { + try + { + new Environment().Show(); + + } + catch + { + } + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { + + } + + private void pic_exit_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t2-校园环境界面/Program.cs b/samples/p8-t2-校园环境界面/Program.cs new file mode 100644 index 0000000..2fd691b --- /dev/null +++ b/samples/p8-t2-校园环境界面/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace 智慧校园 +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + } +} diff --git a/samples/p8-t2-校园环境界面/Properties/Resources.Designer.cs b/samples/p8-t2-校园环境界面/Properties/Resources.Designer.cs new file mode 100644 index 0000000..b8bb5c1 --- /dev/null +++ b/samples/p8-t2-校园环境界面/Properties/Resources.Designer.cs @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// +// 项目资源(平台素材库)。在"项目资源"里添加或移除,不要手动修改这个文件。 +// +//------------------------------------------------------------------------------ + +namespace 智慧校园.Properties { + + /// + /// 项目资源:Properties.Resources.资源名 + /// + internal class Resources { + + /// 标题:智慧校园 + internal static System.Drawing.Bitmap ico_title { + get { return global::Sim.Host.ProjectResources.Image("ico_title.png"); } + } + + /// 主界面背景:校园 + internal static System.Drawing.Bitmap bg_home { + get { return global::Sim.Host.ProjectResources.Image("bg_home.png"); } + } + + /// 图标:校园环境 + internal static System.Drawing.Bitmap icon_02 { + get { return global::Sim.Host.ProjectResources.Image("icon_02.png"); } + } + + /// 图标:校园安防 + internal static System.Drawing.Bitmap icon_03 { + get { return global::Sim.Host.ProjectResources.Image("icon_03.png"); } + } + + /// 图标:退出 + internal static System.Drawing.Bitmap icon_04 { + get { return global::Sim.Host.ProjectResources.Image("icon_04.png"); } + } + + /// 路灯场景:灭灯 + internal static System.Drawing.Bitmap day_02 { + get { return global::Sim.Host.ProjectResources.Image("day_02.png"); } + } + + /// 面板背景(窄) + internal static System.Drawing.Bitmap bg_from2 { + get { return global::Sim.Host.ProjectResources.Image("bg_from2.png"); } + } + + /// 开关:关 + internal static System.Drawing.Bitmap switch_off { + get { return global::Sim.Host.ProjectResources.Image("switch_off.png"); } + } + } +} diff --git a/samples/p8-t2-校园环境界面/checks.yaml b/samples/p8-t2-校园环境界面/checks.yaml new file mode 100644 index 0000000..a26c7ff --- /dev/null +++ b/samples/p8-t2-校园环境界面/checks.yaml @@ -0,0 +1,38 @@ +# 评分规则:书上评价表的功能项。每项单独启动一次程序,按步骤操作,核对结果。 +# 格式说明见 server/src/grading/checks.ts +- title: 主界面能打开"校园环境"界面 + steps: + - click: pic_environment + - expect: { window: Environment, desc: 点"校园环境"打开 Environment 窗体 } + - expect: { control: panel_bg, background: day_02, desc: 背景是路灯场景(day_02) } + +- title: 界面有环境数据栏 + steps: + - click: pic_environment + - expect: { control: txt_fire, visible: true } + - expect: { control: txt_smoke, visible: true } + - expect: { control: txt_light, visible: true } + - expect: { control: txt_temperature, visible: true } + - expect: { control: txt_humidity, visible: true } + - expect: { control: btn_dataAnalyse, text: 数据分析 } + - expect: { control: btn_ledEnvironment1, text: 推送天气信息 } + +- title: 界面有路灯控制、LED 推送和图表 + steps: + - click: pic_environment + - expect: { control: ch_autoLamp, text: 自动控制 } + - expect: { control: txt_autoLight, visible: true } + - expect: { control: pic_lampOpen, background: switch_off, desc: 灯光控制显示"关"的开关图片(switch_off) } + - expect: { control: ch_autoLedFire, text: 自动推送火情 } + - expect: { control: txt_ledMsg, visible: true } + - expect: { control: btn_ledSendMsg, text: 推送LED信息 } + - expect: { control: btn_ledEnvironment2, text: 推送天气信息 } + - expect: { control: chart1, visible: true } + +- title: 能返回主窗体 + steps: + - click: pic_environment + - expect: { window: Environment } + - click: lb_return + - expect: { window: Environment, open: false, desc: 点"<返回主窗体"关闭 Environment 窗体 } + - expect: { window: Main, desc: 主窗体还在 } diff --git a/samples/p8-t2-校园环境界面/meta.json b/samples/p8-t2-校园环境界面/meta.json new file mode 100644 index 0000000..618662c --- /dev/null +++ b/samples/p8-t2-校园环境界面/meta.json @@ -0,0 +1,4 @@ +{ + "title": "项目8 任务2 制作\"校园环境\"界面", + "source": "教材书 p159–164,界面和代码取自配套参考工程;图片是平台素材库里自绘的同名素材(尺寸和教材一致);本任务只做界面,为了能看效果,加上了主界面\"校园环境\"打开窗体和\"<返回主窗体\"关闭窗体(书上在任务 3 第 10、22 步)" +} diff --git a/samples/p8-t3-环境采集与分析/AppSet.cs b/samples/p8-t3-环境采集与分析/AppSet.cs new file mode 100644 index 0000000..394d13f --- /dev/null +++ b/samples/p8-t3-环境采集与分析/AppSet.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园 +{ + class AppSet + { + //串口设置 + public static string ADAM4017_COM = "COM2"; + public static string ADAM4150_COM = "COM3"; + public static string LED_COM = "COM5"; + public static string ZigBee_COM = "COM4"; + + //摄像机参数 + public static string Camera_Ip = "192.168.1.100"; + public static string Camera_Uid = "admin"; + public static string Camera_Pwd = ""; + + //数据库连接字符串 + public static string SqlConn = "Data Source=.;Initial Catalog=WisdomCampus;User ID=sa;Password=123"; + } +} diff --git a/samples/p8-t3-环境采集与分析/Environment.Designer.cs b/samples/p8-t3-环境采集与分析/Environment.Designer.cs new file mode 100644 index 0000000..856107d --- /dev/null +++ b/samples/p8-t3-环境采集与分析/Environment.Designer.cs @@ -0,0 +1,555 @@ +namespace 智慧校园 +{ + partial class Environment + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Legend legend4 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panel_bg = new System.Windows.Forms.Panel(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panel_form = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.pic_lampOpen = new System.Windows.Forms.PictureBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.txt_autoLight = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.ch_autoLamp = new System.Windows.Forms.CheckBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.btn_ledEnvironment2 = new System.Windows.Forms.Button(); + this.ch_autoLedFire = new System.Windows.Forms.CheckBox(); + this.btn_ledSendMsg = new System.Windows.Forms.Button(); + this.txt_ledMsg = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.btn_dataAnalyse = new System.Windows.Forms.Button(); + this.btn_ledEnvironment1 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.txt_humidity = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txt_fire = new System.Windows.Forms.TextBox(); + this.txt_temperature = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txt_smoke = new System.Windows.Forms.TextBox(); + this.txt_light = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lb_return = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + this.panel_bg.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + this.panel_form.SuspendLayout(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).BeginInit(); + this.groupBox3.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1043, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(44, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(226, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.Controls.Add(this.panel_bg); + this.panel2.Controls.Add(this.panel3); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1043, 691); + this.panel2.TabIndex = 1; + // + // panel_bg + // + this.panel_bg.BackgroundImage = global::智慧校园.Properties.Resources.day_02; + this.panel_bg.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel_bg.Controls.Add(this.chart1); + this.panel_bg.Controls.Add(this.panel_form); + this.panel_bg.Controls.Add(this.panel5); + this.panel_bg.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_bg.Location = new System.Drawing.Point(0, 39); + this.panel_bg.Name = "panel_bg"; + this.panel_bg.Size = new System.Drawing.Size(1043, 652); + this.panel_bg.TabIndex = 1; + // + // chart1 + // + chartArea2.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea2); + legend3.Name = "MaxLegend"; + legend3.TitleForeColor = System.Drawing.Color.DimGray; + legend4.Name = "AVGLegend"; + legend4.TitleForeColor = System.Drawing.Color.DimGray; + this.chart1.Legends.Add(legend3); + this.chart1.Legends.Add(legend4); + this.chart1.Location = new System.Drawing.Point(44, 172); + this.chart1.Name = "chart1"; + series3.ChartArea = "ChartArea1"; + series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series3.Legend = "MaxLegend"; + series3.LegendText = "最大值"; + series3.Name = "MaxSeries"; + series3.XValueMember = "_Time"; + series3.YValueMembers = "MaxTemperature"; + series4.ChartArea = "ChartArea1"; + series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series4.Legend = "AVGLegend"; + series4.LegendText = "平均值"; + series4.Name = "AVGSeries"; + series4.XValueMember = "_Time"; + series4.YValueMembers = "AVGTemperature"; + this.chart1.Series.Add(series3); + this.chart1.Series.Add(series4); + this.chart1.Size = new System.Drawing.Size(455, 327); + this.chart1.TabIndex = 3; + this.chart1.Text = "chart1"; + // + // panel_form + // + this.panel_form.BackColor = System.Drawing.Color.Transparent; + this.panel_form.BackgroundImage = global::智慧校园.Properties.Resources.bg_from2; + this.panel_form.Controls.Add(this.groupBox2); + this.panel_form.Controls.Add(this.groupBox3); + this.panel_form.Dock = System.Windows.Forms.DockStyle.Right; + this.panel_form.Location = new System.Drawing.Point(617, 0); + this.panel_form.Name = "panel_form"; + this.panel_form.Size = new System.Drawing.Size(426, 552); + this.panel_form.TabIndex = 2; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.pic_lampOpen); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.txt_autoLight); + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.ch_autoLamp); + this.groupBox2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox2.ForeColor = System.Drawing.Color.White; + this.groupBox2.Location = new System.Drawing.Point(22, 21); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(392, 150); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "路灯控制"; + // + // pic_lampOpen + // + this.pic_lampOpen.BackgroundImage = global::智慧校园.Properties.Resources.switch_off; + this.pic_lampOpen.Location = new System.Drawing.Point(103, 103); + this.pic_lampOpen.Name = "pic_lampOpen"; + this.pic_lampOpen.Size = new System.Drawing.Size(48, 24); + this.pic_lampOpen.TabIndex = 5; + this.pic_lampOpen.TabStop = false; + this.pic_lampOpen.Click += new System.EventHandler(this.pic_lampOpen_Click); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(33, 105); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(59, 17); + this.label10.TabIndex = 4; + this.label10.Text = "灯光控制:"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(278, 58); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(17, 17); + this.label9.TabIndex = 3; + this.label9.Text = "lx"; + // + // txt_autoLight + // + this.txt_autoLight.Location = new System.Drawing.Point(128, 55); + this.txt_autoLight.Name = "txt_autoLight"; + this.txt_autoLight.Size = new System.Drawing.Size(144, 23); + this.txt_autoLight.TabIndex = 2; + this.txt_autoLight.TextChanged += new System.EventHandler(this.txt_autoLight_TextChanged); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(33, 58); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(92, 17); + this.label7.TabIndex = 1; + this.label7.Text = "设定开灯光照值"; + // + // ch_autoLamp + // + this.ch_autoLamp.AutoSize = true; + this.ch_autoLamp.Location = new System.Drawing.Point(35, 30); + this.ch_autoLamp.Name = "ch_autoLamp"; + this.ch_autoLamp.Size = new System.Drawing.Size(75, 21); + this.ch_autoLamp.TabIndex = 0; + this.ch_autoLamp.Text = "自动控制"; + this.ch_autoLamp.UseVisualStyleBackColor = true; + this.ch_autoLamp.CheckedChanged += new System.EventHandler(this.ch_autoLamp_CheckedChanged); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.btn_ledEnvironment2); + this.groupBox3.Controls.Add(this.ch_autoLedFire); + this.groupBox3.Controls.Add(this.btn_ledSendMsg); + this.groupBox3.Controls.Add(this.txt_ledMsg); + this.groupBox3.Controls.Add(this.label8); + this.groupBox3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox3.ForeColor = System.Drawing.Color.White; + this.groupBox3.Location = new System.Drawing.Point(22, 209); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(392, 316); + this.groupBox3.TabIndex = 4; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "LED推送"; + // + // btn_ledEnvironment2 + // + this.btn_ledEnvironment2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment2.Location = new System.Drawing.Point(234, 217); + this.btn_ledEnvironment2.Name = "btn_ledEnvironment2"; + this.btn_ledEnvironment2.Size = new System.Drawing.Size(145, 32); + this.btn_ledEnvironment2.TabIndex = 11; + this.btn_ledEnvironment2.Text = "推送天气信息"; + this.btn_ledEnvironment2.UseVisualStyleBackColor = false; + this.btn_ledEnvironment2.Click += new System.EventHandler(this.btn_ledEnvironment2_Click); + // + // ch_autoLedFire + // + this.ch_autoLedFire.AutoSize = true; + this.ch_autoLedFire.Location = new System.Drawing.Point(265, 35); + this.ch_autoLedFire.Name = "ch_autoLedFire"; + this.ch_autoLedFire.Size = new System.Drawing.Size(99, 21); + this.ch_autoLedFire.TabIndex = 4; + this.ch_autoLedFire.Text = "自动推送火情"; + this.ch_autoLedFire.UseVisualStyleBackColor = true; + this.ch_autoLedFire.CheckedChanged += new System.EventHandler(this.ch_autoLedFire_CheckedChanged); + // + // btn_ledSendMsg + // + this.btn_ledSendMsg.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_ledSendMsg.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledSendMsg.Location = new System.Drawing.Point(26, 217); + this.btn_ledSendMsg.Name = "btn_ledSendMsg"; + this.btn_ledSendMsg.Size = new System.Drawing.Size(145, 32); + this.btn_ledSendMsg.TabIndex = 2; + this.btn_ledSendMsg.Text = "推送LED信息"; + this.btn_ledSendMsg.UseVisualStyleBackColor = false; + this.btn_ledSendMsg.Click += new System.EventHandler(this.btn_ledSendMsg_Click); + // + // txt_ledMsg + // + this.txt_ledMsg.Location = new System.Drawing.Point(23, 62); + this.txt_ledMsg.Multiline = true; + this.txt_ledMsg.Name = "txt_ledMsg"; + this.txt_ledMsg.Size = new System.Drawing.Size(356, 130); + this.txt_ledMsg.TabIndex = 1; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(20, 36); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(54, 17); + this.label8.TabIndex = 0; + this.label8.Text = "LED信息"; + // + // panel5 + // + this.panel5.Controls.Add(this.btn_dataAnalyse); + this.panel5.Controls.Add(this.btn_ledEnvironment1); + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.txt_humidity); + this.panel5.Controls.Add(this.label1); + this.panel5.Controls.Add(this.label5); + this.panel5.Controls.Add(this.txt_fire); + this.panel5.Controls.Add(this.txt_temperature); + this.panel5.Controls.Add(this.label2); + this.panel5.Controls.Add(this.label4); + this.panel5.Controls.Add(this.txt_smoke); + this.panel5.Controls.Add(this.txt_light); + this.panel5.Controls.Add(this.label3); + this.panel5.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel5.Location = new System.Drawing.Point(0, 552); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(1043, 100); + this.panel5.TabIndex = 1; + // + // btn_dataAnalyse + // + this.btn_dataAnalyse.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_dataAnalyse.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_dataAnalyse.Location = new System.Drawing.Point(792, 35); + this.btn_dataAnalyse.Name = "btn_dataAnalyse"; + this.btn_dataAnalyse.Size = new System.Drawing.Size(119, 32); + this.btn_dataAnalyse.TabIndex = 23; + this.btn_dataAnalyse.Text = "数据分析"; + this.btn_dataAnalyse.UseVisualStyleBackColor = false; + this.btn_dataAnalyse.Click += new System.EventHandler(this.btn_dataAnalyse_Click); + // + // btn_ledEnvironment1 + // + this.btn_ledEnvironment1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment1.Location = new System.Drawing.Point(910, 35); + this.btn_ledEnvironment1.Name = "btn_ledEnvironment1"; + this.btn_ledEnvironment1.Size = new System.Drawing.Size(121, 32); + this.btn_ledEnvironment1.TabIndex = 15; + this.btn_ledEnvironment1.Text = "推送天气信息"; + this.btn_ledEnvironment1.UseVisualStyleBackColor = false; + this.btn_ledEnvironment1.Click += new System.EventHandler(this.btn_ledEnvironment1_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("微软雅黑", 18F); + this.label6.Location = new System.Drawing.Point(12, 31); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(110, 31); + this.label6.TabIndex = 11; + this.label6.Text = "环境数据"; + // + // txt_humidity + // + this.txt_humidity.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_humidity.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_humidity.Location = new System.Drawing.Point(716, 36); + this.txt_humidity.Name = "txt_humidity"; + this.txt_humidity.Size = new System.Drawing.Size(70, 32); + this.txt_humidity.TabIndex = 22; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label1.Location = new System.Drawing.Point(132, 38); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 25); + this.label1.TabIndex = 12; + this.label1.Text = "火焰"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label5.Location = new System.Drawing.Point(660, 39); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(50, 25); + this.label5.TabIndex = 21; + this.label5.Text = "湿度"; + // + // txt_fire + // + this.txt_fire.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_fire.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_fire.Location = new System.Drawing.Point(188, 35); + this.txt_fire.Name = "txt_fire"; + this.txt_fire.Size = new System.Drawing.Size(70, 32); + this.txt_fire.TabIndex = 13; + // + // txt_temperature + // + this.txt_temperature.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_temperature.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_temperature.Location = new System.Drawing.Point(584, 35); + this.txt_temperature.Name = "txt_temperature"; + this.txt_temperature.Size = new System.Drawing.Size(70, 32); + this.txt_temperature.TabIndex = 20; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label2.Location = new System.Drawing.Point(264, 36); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(50, 25); + this.label2.TabIndex = 14; + this.label2.Text = "烟雾"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label4.Location = new System.Drawing.Point(528, 38); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(50, 25); + this.label4.TabIndex = 19; + this.label4.Text = "温度"; + // + // txt_smoke + // + this.txt_smoke.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_smoke.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_smoke.Location = new System.Drawing.Point(320, 33); + this.txt_smoke.Name = "txt_smoke"; + this.txt_smoke.Size = new System.Drawing.Size(70, 32); + this.txt_smoke.TabIndex = 16; + // + // txt_light + // + this.txt_light.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_light.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_light.Location = new System.Drawing.Point(452, 32); + this.txt_light.Name = "txt_light"; + this.txt_light.Size = new System.Drawing.Size(70, 32); + this.txt_light.TabIndex = 18; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label3.Location = new System.Drawing.Point(396, 35); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(50, 25); + this.label3.TabIndex = 17; + this.label3.Text = "光照"; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel3.Controls.Add(this.lb_return); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(0, 0); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1043, 39); + this.panel3.TabIndex = 0; + this.panel3.Paint += new System.Windows.Forms.PaintEventHandler(this.panel3_Paint); + // + // lb_return + // + this.lb_return.AutoSize = true; + this.lb_return.Location = new System.Drawing.Point(25, 12); + this.lb_return.Name = "lb_return"; + this.lb_return.Size = new System.Drawing.Size(83, 12); + this.lb_return.TabIndex = 0; + this.lb_return.Text = "< 返回主窗体"; + this.lb_return.Click += new System.EventHandler(this.lb_return_Click); + // + // Environment + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1043, 791); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Environment"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Environment"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Environment_FormClosed); + this.Load += new System.EventHandler(this.Environment_Load); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel_bg.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.panel_form.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).EndInit(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lb_return; + private System.Windows.Forms.Panel panel_bg; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel_form; + private System.Windows.Forms.Button btn_dataAnalyse; + private System.Windows.Forms.Button btn_ledEnvironment1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txt_humidity; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txt_fire; + private System.Windows.Forms.TextBox txt_temperature; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txt_smoke; + private System.Windows.Forms.TextBox txt_light; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.PictureBox pic_lampOpen; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox txt_autoLight; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox ch_autoLamp; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button btn_ledEnvironment2; + private System.Windows.Forms.CheckBox ch_autoLedFire; + private System.Windows.Forms.Button btn_ledSendMsg; + private System.Windows.Forms.TextBox txt_ledMsg; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + } +} \ No newline at end of file diff --git a/samples/p8-t3-环境采集与分析/Environment.cs b/samples/p8-t3-环境采集与分析/Environment.cs new file mode 100644 index 0000000..c136074 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/Environment.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +using DeviceCtrlLibrary.Model; +using 智慧校园.SQLHelpers; +using System.Threading; + +namespace 智慧校园 +{ + public partial class Environment : Form + { + public Environment() + { + InitializeComponent(); + } + //用于各类耗时长的操作(SQL、数据采集、设备控制等) + Thread thread; + //用于异步通行 + SynchronizationContext _main; + //结果模型 + ADAM4017ResModel ResModel_4017; + ADAM4150ResModel ResModel_4150; + //设置自动控制路灯的光照值 + double environmentLight, setLight; + //按钮状态标志 + bool IsAuto_Lamp = false; + bool IsAuto_FireMsg = false; + bool IsLampOpen = false; + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void lb_return_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void Environment_Load(object sender, EventArgs e) + { + try + { + + //隐藏曲线图 + chart1.Visible = false; + thread = new Thread(new ThreadStart(Tick)); + _main = WindowsFormsSynchronizationContext.Current; + thread.Start(); + } + catch + { + } + + } + private void Tick() + { + try + { + while (true) + { + //数据采集 + ResModel_4017 = DeviceCtrlHelper.adam4017Helper.SetData(); + Thread.Sleep(500); + ResModel_4150 = DeviceCtrlHelper.adam4150Helper.SetData(); + + //UI显示数据 + + _main.Send(_ => + { + try //防止无数据出错 + { + txt_fire.Text = (ResModel_4150.fireValue ? "发生火情" : "正常"); + txt_smoke.Text = (ResModel_4150.smokeValue ? "发生烟情" : "正常"); + txt_light.Text = ResModel_4017.lightValue; + txt_temperature.Text = ResModel_4017.temperatureValue; + txt_humidity.Text = ResModel_4017.humidityValue; + } + catch { } + }, null); + + //自动路灯控制 + double.TryParse(ResModel_4017.lightValue, out environmentLight); + if (IsAuto_Lamp && environmentLight < setLight) + { + LampOnOff(1, true); + } + else if (IsAuto_Lamp && !(environmentLight < setLight)) + { + LampOnOff(1, false); + } + + //自动推送火情LED信息控制 + if (IsAuto_FireMsg) + { + if (ResModel_4150.fireValue && ResModel_4150.smokeValue) + DeviceCtrlHelper.ledHelper.SendLedString("发生严重火灾 "); + else if (ResModel_4150.fireValue) + DeviceCtrlHelper.ledHelper.SendLedString("发现火情 "); + else if (ResModel_4150.smokeValue) + DeviceCtrlHelper.ledHelper.SendLedString("发现烟情 "); + } + + //执行数据上传 + SQLBLL.EnvironmentUpData(ResModel_4150.fireValue, ResModel_4150.smokeValue, ResModel_4017.lightValue, ResModel_4017.temperatureValue, ResModel_4017.humidityValue); + + Thread.Sleep(5000); + } + } + catch + { + } + } + private void LampOnOff(int RelayNum, bool IsOpen) + { + try + { + //开启路灯 + DeviceCtrlHelper.zigBeeHelper.OnOff(RelayNum, IsOpen); + + //切换UI背景 + _main.Send(_ => + { + if (IsOpen) + { + pic_lampOpen.BackgroundImage = Properties.Resources.switch_on; + panel_bg.BackgroundImage = Properties.Resources.day_01; + } + else + { + panel_bg.BackgroundImage = Properties.Resources.day_02; + pic_lampOpen.BackgroundImage = Properties.Resources.switch_off; + } + }, null); + } + catch + { + } + } + + private void Environment_FormClosed(object sender, FormClosedEventArgs e) + { + try + { + thread.Suspend(); + thread = null; + + } + catch + { + } + + + } + + private void btn_dataAnalyse_Click(object sender, EventArgs e) + { + try + { + if (btn_dataAnalyse.Text.Equals("数据分析")) + { + //绑定图标数据 + chart1.DataSource = SQLBLL.GetEnvironmentGraphData(); + //更新图标数据 + chart1.DataBind(); + chart1.Visible = true; + btn_dataAnalyse.Text = "关闭图表"; + } + else if (btn_dataAnalyse.Text.Equals("关闭图表")) + { + chart1.Visible = false; + btn_dataAnalyse.Text = "数据分析"; + } + } + catch + { + } + + } + + private void pic_lampOpen_Click(object sender, EventArgs e) + { + //手动路灯控制 + try + { + if (!IsLampOpen) + { + LampOnOff(1, true); + + } + else + { + LampOnOff(1, false); + + } + + IsLampOpen = !IsLampOpen; + } + catch + { + } + } + + private void btn_ledEnvironment1_Click(object sender, EventArgs e) + { + try + { + //推送LED天气信息 + if (ResModel_4017 != null && ResModel_4150 != null) + DeviceCtrlHelper.ledHelper.SendLedString("当前温度:" + ResModel_4017.temperatureValue + "℃ 湿度:" + ResModel_4017.humidityValue + "%"); + } + catch + { + } + } + + private void btn_ledEnvironment2_Click(object sender, EventArgs e) + { + try + { + //推送LED天气信息 + if (ResModel_4017 != null && ResModel_4150 != null) + DeviceCtrlHelper.ledHelper.SendLedString("当前温度:" + ResModel_4017.temperatureValue + "℃ 湿度:" + ResModel_4017.humidityValue + "%"); + } + catch + { + } + } + + private void panel3_Paint(object sender, PaintEventArgs e) + { + + } + + private void txt_autoLight_TextChanged(object sender, EventArgs e) + { + try + { + //获取光照比较值 + double.TryParse(txt_autoLight.Text,out setLight); + + } + + catch + { + } + } + + private void btn_ledSendMsg_Click(object sender, EventArgs e) + { + try + { + //推送LED信息 + DeviceCtrlHelper.ledHelper.SendLedString(txt_ledMsg.Text); + } + catch + { + } + } + + private void ch_autoLamp_CheckedChanged(object sender, EventArgs e) + { + //自动控制路灯 + IsAuto_Lamp = ch_autoLamp.Checked; + } + + private void ch_autoLedFire_CheckedChanged(object sender, EventArgs e) + { + //自动推送火情 + IsAuto_FireMsg = ch_autoLedFire.Checked; + } + } +} diff --git a/samples/p8-t3-环境采集与分析/Main.Designer.cs b/samples/p8-t3-环境采集与分析/Main.Designer.cs new file mode 100644 index 0000000..d3e22a1 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/Main.Designer.cs @@ -0,0 +1,144 @@ +namespace 智慧校园 +{ + partial class Main + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.pic_exit = new System.Windows.Forms.PictureBox(); + this.pic_security = new System.Windows.Forms.PictureBox(); + this.pic_environment = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(147)))), ((int)(((byte)(237))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1018, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(57, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(197, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.BackgroundImage = global::智慧校园.Properties.Resources.bg_home; + this.panel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel2.Controls.Add(this.pic_exit); + this.panel2.Controls.Add(this.pic_security); + this.panel2.Controls.Add(this.pic_environment); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1018, 516); + this.panel2.TabIndex = 1; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // pic_exit + // + this.pic_exit.BackColor = System.Drawing.Color.Transparent; + this.pic_exit.Image = global::智慧校园.Properties.Resources.icon_04; + this.pic_exit.Location = new System.Drawing.Point(660, 124); + this.pic_exit.Name = "pic_exit"; + this.pic_exit.Size = new System.Drawing.Size(180, 210); + this.pic_exit.TabIndex = 6; + this.pic_exit.TabStop = false; + this.pic_exit.Click += new System.EventHandler(this.pic_exit_Click); + // + // pic_security + // + this.pic_security.BackColor = System.Drawing.Color.Transparent; + this.pic_security.Image = global::智慧校园.Properties.Resources.icon_03; + this.pic_security.Location = new System.Drawing.Point(404, 124); + this.pic_security.Name = "pic_security"; + this.pic_security.Size = new System.Drawing.Size(180, 210); + this.pic_security.TabIndex = 5; + this.pic_security.TabStop = false; + // + // pic_environment + // + this.pic_environment.BackColor = System.Drawing.Color.Transparent; + this.pic_environment.Image = global::智慧校园.Properties.Resources.icon_02; + this.pic_environment.Location = new System.Drawing.Point(133, 124); + this.pic_environment.Name = "pic_environment"; + this.pic_environment.Size = new System.Drawing.Size(180, 210); + this.pic_environment.TabIndex = 4; + this.pic_environment.TabStop = false; + this.pic_environment.Click += new System.EventHandler(this.pic_environment_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1018, 616); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Main_Load); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_exit; + private System.Windows.Forms.PictureBox pic_security; + private System.Windows.Forms.PictureBox pic_environment; + } +} + diff --git a/samples/p8-t3-环境采集与分析/Main.cs b/samples/p8-t3-环境采集与分析/Main.cs new file mode 100644 index 0000000..4265988 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/Main.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +namespace 智慧校园 +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void pic_environment_Click(object sender, EventArgs e) + { + try + { + new Environment().Show(); + + } + catch + { + } + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { + + } + + private void Main_Load(object sender, EventArgs e) + { + try + { + //实例化工具类 + DeviceCtrlHelper.adam4017Helper.Open(AppSet.ADAM4017_COM); + DeviceCtrlHelper.adam4150Helper.Open(AppSet.ADAM4150_COM); + DeviceCtrlHelper.zigBeeHelper.Open(AppSet.ZigBee_COM); + DeviceCtrlHelper.ledHelper.OpenLedCom(AppSet.LED_COM); + } + catch { } + } + + private void pic_exit_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t3-环境采集与分析/Program.cs b/samples/p8-t3-环境采集与分析/Program.cs new file mode 100644 index 0000000..2fd691b --- /dev/null +++ b/samples/p8-t3-环境采集与分析/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace 智慧校园 +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + } +} diff --git a/samples/p8-t3-环境采集与分析/Properties/Resources.Designer.cs b/samples/p8-t3-环境采集与分析/Properties/Resources.Designer.cs new file mode 100644 index 0000000..e666e83 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/Properties/Resources.Designer.cs @@ -0,0 +1,64 @@ +//------------------------------------------------------------------------------ +// +// 项目资源(平台素材库)。在"项目资源"里添加或移除,不要手动修改这个文件。 +// +//------------------------------------------------------------------------------ + +namespace 智慧校园.Properties { + + /// + /// 项目资源:Properties.Resources.资源名 + /// + internal class Resources { + + /// 标题:智慧校园 + internal static System.Drawing.Bitmap ico_title { + get { return global::Sim.Host.ProjectResources.Image("ico_title.png"); } + } + + /// 主界面背景:校园 + internal static System.Drawing.Bitmap bg_home { + get { return global::Sim.Host.ProjectResources.Image("bg_home.png"); } + } + + /// 图标:校园环境 + internal static System.Drawing.Bitmap icon_02 { + get { return global::Sim.Host.ProjectResources.Image("icon_02.png"); } + } + + /// 图标:校园安防 + internal static System.Drawing.Bitmap icon_03 { + get { return global::Sim.Host.ProjectResources.Image("icon_03.png"); } + } + + /// 图标:退出 + internal static System.Drawing.Bitmap icon_04 { + get { return global::Sim.Host.ProjectResources.Image("icon_04.png"); } + } + + /// 路灯场景:亮灯 + internal static System.Drawing.Bitmap day_01 { + get { return global::Sim.Host.ProjectResources.Image("day_01.png"); } + } + + /// 路灯场景:灭灯 + internal static System.Drawing.Bitmap day_02 { + get { return global::Sim.Host.ProjectResources.Image("day_02.png"); } + } + + /// 面板背景(窄) + internal static System.Drawing.Bitmap bg_from2 { + get { return global::Sim.Host.ProjectResources.Image("bg_from2.png"); } + } + + /// 开关:开 + internal static System.Drawing.Bitmap switch_on { + get { return global::Sim.Host.ProjectResources.Image("switch_on.png"); } + } + + /// 开关:关 + internal static System.Drawing.Bitmap switch_off { + get { return global::Sim.Host.ProjectResources.Image("switch_off.png"); } + } + } +} diff --git a/samples/p8-t3-环境采集与分析/SQLHelpers/SQLBLL.cs b/samples/p8-t3-环境采集与分析/SQLHelpers/SQLBLL.cs new file mode 100644 index 0000000..c737537 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/SQLHelpers/SQLBLL.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园.SQLHelpers +{ + class SQLBLL + { + + public static SQLRes SecurityUpData(Image img)//把图片保存到数据库 + { + SQLRes sqlRes = new SQLRes(); + byte[] imgByte = null; + + using (MemoryStream ms = new MemoryStream())//图片转换为二进制数组 + { + img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); + imgByte = new byte[ms.Length]; + imgByte = ms.ToArray(); + } + + string sqlStr = "INSERT INTO SecurityData (EvenTime,EvenImage) VALUES (@time,@img)"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time", DateTime.Now.ToString()), new SqlParameter("img", imgByte) }; + + if (SQLHelper.Exec(sqlStr, sqlParameter) >= 1) + { + sqlRes.Result = true; + sqlRes.Msg = "成功!"; + } + else + { + sqlRes.Result = false; + sqlRes.Msg = "失败!"; + } + + return sqlRes; + } + + public static Dictionary GetSecurityData(DateTime startDate, DateTime endDate) + { + Dictionary ImgDictionary = new Dictionary(); + + if (string.IsNullOrWhiteSpace(startDate.Month.ToString()) && string.IsNullOrWhiteSpace(endDate.Month .ToString())) + { + return ImgDictionary; + } + //选择查询日期日期 + string sql = "SELECT * FROM SecurityData WHERE EvenTime between @time_start and @time_end"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time_start", startDate.Year + "/" + startDate.Month + "/" + startDate.Day), new SqlParameter("time_end", endDate.Year + "/" + endDate.Month + "/" + endDate.Day+" 23:59:59" )}; + + DataSet ds = SQLHelper.getData(sql, sqlParameter); + + for (int i = 0; i < ds.Tables[0].Rows.Count; i++) + { + ImgDictionary.Add(ds.Tables[0].Rows[i]["EvenTime"].ToString(), Image.FromStream(new MemoryStream((byte[])ds.Tables[0].Rows[i]["EvenImage"]))); + } + + return ImgDictionary; + } + + public static SQLRes EnvironmentUpData(bool fire, bool smoke, string light, string temperature, string humidity) + { + + SQLRes sqlRes = new SQLRes(); + + string sqlStr = "INSERT INTO EnvironmentData (Fire ,Smoke ,Temperature ,Humidity , Light, _Time) VALUES (@fire,@smoke,@temperature,@humidity,@light,@time)"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time", DateTime.Now.ToString()), new SqlParameter("fire", fire), new SqlParameter("smoke", smoke), new SqlParameter("temperature", temperature), new SqlParameter("humidity", humidity), new SqlParameter("light", light) }; + + if (SQLHelper.Exec(sqlStr, sqlParameter) >= 1) + { + sqlRes.Result = true; + sqlRes.Msg = "成功!"; + } + else + { + sqlRes.Result = false; + sqlRes.Msg = "失败!"; + } + + return sqlRes; + + } + + public static DataTable GetEnvironmentGraphData() + { + string sqlStr = "SELECT TOP 7 CONVERT(varchar(10),_Time,120) AS _Time, ROUND(Max(Temperature),2) AS MaxTemperature, ROUND(AVG(Temperature),2) AS AVGTemperature FROM EnvironmentData GROUP BY CONVERT(varchar(10),_Time,120) ORDER BY CONVERT(varchar(10),_Time,120) DESC "; + return SQLHelper.getData(sqlStr, null).Tables[0]; + } + + + } + + class SQLRes + { + public string Msg { get; set; } + public bool Result { get; set; } + } + + } + diff --git a/samples/p8-t3-环境采集与分析/SQLHelpers/SQLHelper.cs b/samples/p8-t3-环境采集与分析/SQLHelpers/SQLHelper.cs new file mode 100644 index 0000000..d37157e --- /dev/null +++ b/samples/p8-t3-环境采集与分析/SQLHelpers/SQLHelper.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园.SQLHelpers +{ + class SQLHelper + { + public static string strConn = AppSet.SqlConn; + + public static bool SaveData(string sql, DataTable dt) + { + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlDataAdapter sda = new SqlDataAdapter(sql, conn); + SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(sda); + sda.Update(dt); + conn.Close(); + return true; + } + catch (Exception e) + { + string Error = e.Message; + return false; + } + } + + public static DataSet getData(string sql, params SqlParameter[] para) + { + DataSet ds = new DataSet(); + + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlCommand cmd = new SqlCommand(sql, conn); + if (para != null) + { + foreach (SqlParameter item in para) + { + cmd.Parameters.Add(item); + } + } + SqlDataAdapter sda = new SqlDataAdapter(cmd); + sda.Fill(ds); + cmd.Parameters.Clear(); + conn.Close(); + } + catch(Exception e) + { + string Error = e.Message; + } + + return ds; + } + + public static DataSet getData(SqlCommand cmd) + { + DataSet ds = new DataSet(); + + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + cmd.Connection = conn; + + SqlDataAdapter sda = new SqlDataAdapter(cmd); + sda.Fill(ds); + cmd.Parameters.Clear(); + conn.Close(); + } + catch (Exception e) + { + string Error = e.Message; + } + + return ds; + } + + public static int Exec(string sql, params SqlParameter[] para) + { + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlCommand cmd = new SqlCommand(sql, conn); + if (para != null) + { + foreach (SqlParameter item in para) + { + cmd.Parameters.Add(item); + } + } + int iRsult = cmd.ExecuteNonQuery(); + conn.Close(); + return iRsult; + } + catch (Exception e) + { + string Error = e.Message; + return -1; + } + } + } + } + diff --git a/samples/p8-t3-环境采集与分析/checks.yaml b/samples/p8-t3-环境采集与分析/checks.yaml new file mode 100644 index 0000000..67646a9 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/checks.yaml @@ -0,0 +1,71 @@ +# 评分规则:书上评价表的功能项。每项单独启动一次程序,按步骤操作,核对结果。 +# 格式说明见 server/src/grading/checks.ts +# 采集线程每 5.5 秒左右采集一次,所以等待时间写 8s。 +- title: 能实时显示环境数据和火情、烟情 + steps: + - click: pic_environment + - board: { temperature: 28, humidity: 55, light: 650 } + - expect: { control: txt_temperature, text: '28', within: 8s } + - expect: { control: txt_humidity, text: '55', within: 8s } + - expect: { control: txt_light, text: '650', within: 8s } + - expect: { control: txt_fire, text: 正常, within: 8s } + - board: { fire: true, smoke: true } + - expect: { control: txt_fire, text: 发生火情, within: 8s } + - expect: { control: txt_smoke, text: 发生烟情, within: 8s } + +- title: 路灯能手动控制 + steps: + - click: pic_environment + - click: pic_lampOpen + - expect: { zigbee: 1, on: true, desc: 点灯光开关打开路灯 } + - expect: { control: pic_lampOpen, background: switch_on, desc: 开关换成"开"的图片(switch_on) } + - expect: { control: panel_bg, background: day_01, desc: 背景换成亮灯的场景(day_01) } + - click: pic_lampOpen + - expect: { zigbee: 1, on: false, desc: 再点一次关闭路灯 } + - expect: { control: pic_lampOpen, background: switch_off } + - expect: { control: panel_bg, background: day_02 } + +- title: 路灯能根据光照度自动控制 + steps: + - click: pic_environment + - text: { control: txt_autoLight, value: '400' } + - click: ch_autoLamp + - board: { light: 200 } + - expect: { zigbee: 1, on: true, within: 8s, desc: 光照低于设定值 400 时自动打开路灯 } + - expect: { control: panel_bg, background: day_01 } + - board: { light: 800 } + - expect: { zigbee: 1, on: false, within: 8s, desc: 光照高于设定值时自动关闭路灯 } + +- title: 能推送天气信息和自定义信息到 LED 屏 + steps: + - board: { temperature: 26, humidity: 50 } + - click: pic_environment + - expect: { control: txt_temperature, text: '26', within: 8s } + - click: btn_ledEnvironment1 + - expect: { led: 当前温度:26℃ 湿度:50%, desc: 显示"当前温度:26℃ 湿度:50%"(点下方的"推送天气信息") } + - text: { control: txt_ledMsg, value: 欢迎参观智慧校园 } + - click: btn_ledSendMsg + - expect: { led: 欢迎参观智慧校园, desc: 显示输入的文字(点"推送LED信息") } + - click: btn_ledEnvironment2 + - expect: { led: 当前温度:26℃, desc: 显示天气信息(点右边的"推送天气信息") } + +- title: 能自动推送火情到 LED 屏 + steps: + - click: pic_environment + - click: ch_autoLedFire + - board: { fire: true } + - expect: { led: 发现火情, within: 8s, desc: 显示"发现火情"(勾选"自动推送火情"后有火焰) } + - board: { smoke: true } + - expect: { led: 发生严重火灾, within: 8s, desc: 显示"发生严重火灾"(火焰和烟雾都有) } + +- title: 图表能正确显示数据 + steps: + - click: pic_environment + - expect: { control: chart1, visible: false, desc: 刚打开时图表隐藏 } + - click: btn_dataAnalyse + - expect: { control: chart1, visible: true, desc: 点"数据分析"显示图表 } + - expect: { control: chart1, points: 7, desc: 显示最近 7 天的最高温度和平均温度 } + - expect: { control: btn_dataAnalyse, text: 关闭图表 } + - click: btn_dataAnalyse + - expect: { control: chart1, visible: false, desc: 点"关闭图表"隐藏图表 } + - expect: { control: btn_dataAnalyse, text: 数据分析 } diff --git a/samples/p8-t3-环境采集与分析/database.sql b/samples/p8-t3-环境采集与分析/database.sql new file mode 100644 index 0000000..2e5eeba --- /dev/null +++ b/samples/p8-t3-环境采集与分析/database.sql @@ -0,0 +1,54 @@ +-- 实验的初始数据库 WisdomCampus(教材"综合实训"附带的库):环境数据表 EnvironmentData、报警图片表 SecurityData、用户表 Users。 +-- EnvironmentData 预置了 7 天的历史数据,"数据分析"的图表一打开就有内容;SecurityData 是空的,拍照或有人入侵时才有记录。 +-- 学生可以在数据库页面"恢复实验初始数据";评分时每个检查项用一份新的。 +CREATE DATABASE WisdomCampus +GO +USE WisdomCampus +GO +CREATE TABLE Users (Id int IDENTITY(1,1) PRIMARY KEY, UserName nvarchar(50) NOT NULL, Password nvarchar(50) NOT NULL) +CREATE TABLE EnvironmentData (Id int IDENTITY(1,1) PRIMARY KEY, Fire bit NOT NULL, Smoke bit NOT NULL, Temperature float NULL, Humidity float NULL, Light float NULL, _Time datetime NOT NULL) +CREATE TABLE SecurityData (Id int IDENTITY(1,1) PRIMARY KEY, EvenTime datetime NOT NULL, EvenImage image NOT NULL) +GO +INSERT INTO Users (UserName, Password) VALUES ('admin', '123') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.9, 58, 258, '2026-10-14 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.1, 53, 475, '2026-10-14 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.8, 51, 761, '2026-10-14 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 22.5, 49, 733, '2026-10-14 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 54, 528, '2026-10-14 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.1, 57, 283, '2026-10-14 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.9, 59, 261, '2026-10-15 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 53, 499, '2026-10-15 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.8, 52, 764, '2026-10-15 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 23.5, 47, 778, '2026-10-15 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.8, 52, 503, '2026-10-15 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 56, 218, '2026-10-15 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 13.9, 63, 258, '2026-10-16 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.6, 60, 477, '2026-10-16 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.8, 51, 741, '2026-10-16 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.5, 54, 796, '2026-10-16 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 55, 488, '2026-10-16 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.6, 59, 214, '2026-10-16 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 11.9, 67, 234, '2026-10-17 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.1, 63, 544, '2026-10-17 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.3, 60, 804, '2026-10-17 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.5, 54, 801, '2026-10-17 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.8, 59, 524, '2026-10-17 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.1, 58, 286, '2026-10-17 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.4, 59, 250, '2026-10-18 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 55, 533, '2026-10-18 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.3, 50, 749, '2026-10-18 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 24, 48, 766, '2026-10-18 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.8, 54, 534, '2026-10-18 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.1, 53, 241, '2026-10-18 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.4, 54, 253, '2026-10-19 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.1, 50, 474, '2026-10-19 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 22.3, 48, 778, '2026-10-19 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 26, 46, 783, '2026-10-19 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 23.3, 50, 520, '2026-10-19 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.6, 50, 213, '2026-10-19 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.9, 62, 230, '2026-10-20 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.6, 52, 471, '2026-10-20 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 53, 751, '2026-10-20 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.5, 48, 747, '2026-10-20 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 55, 527, '2026-10-20 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.1, 57, 220, '2026-10-20 18:00:00') diff --git a/samples/p8-t3-环境采集与分析/meta.json b/samples/p8-t3-环境采集与分析/meta.json new file mode 100644 index 0000000..0cd6ae3 --- /dev/null +++ b/samples/p8-t3-环境采集与分析/meta.json @@ -0,0 +1,4 @@ +{ + "title": "项目8 任务3 实现\"校园环境\"数据采集及数据分析功能", + "source": "教材书 p164–174,界面和代码取自配套参考工程;图片是平台素材库里自绘的同名素材(尺寸和教材一致);按书补全了参考工程里空着的\"推送LED信息\"\"自动控制\",给\"自动推送火情\"复选框加上 CheckedChanged(书上第 23 步把控件名写成了 ch_autoLamp);数据库 WisdomCampus 是平台按教材的表结构建的,预置 7 天环境数据" +} diff --git a/samples/p8-t4-校园安防/AppSet.cs b/samples/p8-t4-校园安防/AppSet.cs new file mode 100644 index 0000000..394d13f --- /dev/null +++ b/samples/p8-t4-校园安防/AppSet.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园 +{ + class AppSet + { + //串口设置 + public static string ADAM4017_COM = "COM2"; + public static string ADAM4150_COM = "COM3"; + public static string LED_COM = "COM5"; + public static string ZigBee_COM = "COM4"; + + //摄像机参数 + public static string Camera_Ip = "192.168.1.100"; + public static string Camera_Uid = "admin"; + public static string Camera_Pwd = ""; + + //数据库连接字符串 + public static string SqlConn = "Data Source=.;Initial Catalog=WisdomCampus;User ID=sa;Password=123"; + } +} diff --git a/samples/p8-t4-校园安防/Environment.Designer.cs b/samples/p8-t4-校园安防/Environment.Designer.cs new file mode 100644 index 0000000..856107d --- /dev/null +++ b/samples/p8-t4-校园安防/Environment.Designer.cs @@ -0,0 +1,555 @@ +namespace 智慧校园 +{ + partial class Environment + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Legend legend4 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panel_bg = new System.Windows.Forms.Panel(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panel_form = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.pic_lampOpen = new System.Windows.Forms.PictureBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.txt_autoLight = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.ch_autoLamp = new System.Windows.Forms.CheckBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.btn_ledEnvironment2 = new System.Windows.Forms.Button(); + this.ch_autoLedFire = new System.Windows.Forms.CheckBox(); + this.btn_ledSendMsg = new System.Windows.Forms.Button(); + this.txt_ledMsg = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.btn_dataAnalyse = new System.Windows.Forms.Button(); + this.btn_ledEnvironment1 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.txt_humidity = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txt_fire = new System.Windows.Forms.TextBox(); + this.txt_temperature = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txt_smoke = new System.Windows.Forms.TextBox(); + this.txt_light = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lb_return = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + this.panel_bg.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + this.panel_form.SuspendLayout(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).BeginInit(); + this.groupBox3.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1043, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(44, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(226, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.Controls.Add(this.panel_bg); + this.panel2.Controls.Add(this.panel3); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1043, 691); + this.panel2.TabIndex = 1; + // + // panel_bg + // + this.panel_bg.BackgroundImage = global::智慧校园.Properties.Resources.day_02; + this.panel_bg.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel_bg.Controls.Add(this.chart1); + this.panel_bg.Controls.Add(this.panel_form); + this.panel_bg.Controls.Add(this.panel5); + this.panel_bg.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_bg.Location = new System.Drawing.Point(0, 39); + this.panel_bg.Name = "panel_bg"; + this.panel_bg.Size = new System.Drawing.Size(1043, 652); + this.panel_bg.TabIndex = 1; + // + // chart1 + // + chartArea2.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea2); + legend3.Name = "MaxLegend"; + legend3.TitleForeColor = System.Drawing.Color.DimGray; + legend4.Name = "AVGLegend"; + legend4.TitleForeColor = System.Drawing.Color.DimGray; + this.chart1.Legends.Add(legend3); + this.chart1.Legends.Add(legend4); + this.chart1.Location = new System.Drawing.Point(44, 172); + this.chart1.Name = "chart1"; + series3.ChartArea = "ChartArea1"; + series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series3.Legend = "MaxLegend"; + series3.LegendText = "最大值"; + series3.Name = "MaxSeries"; + series3.XValueMember = "_Time"; + series3.YValueMembers = "MaxTemperature"; + series4.ChartArea = "ChartArea1"; + series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series4.Legend = "AVGLegend"; + series4.LegendText = "平均值"; + series4.Name = "AVGSeries"; + series4.XValueMember = "_Time"; + series4.YValueMembers = "AVGTemperature"; + this.chart1.Series.Add(series3); + this.chart1.Series.Add(series4); + this.chart1.Size = new System.Drawing.Size(455, 327); + this.chart1.TabIndex = 3; + this.chart1.Text = "chart1"; + // + // panel_form + // + this.panel_form.BackColor = System.Drawing.Color.Transparent; + this.panel_form.BackgroundImage = global::智慧校园.Properties.Resources.bg_from2; + this.panel_form.Controls.Add(this.groupBox2); + this.panel_form.Controls.Add(this.groupBox3); + this.panel_form.Dock = System.Windows.Forms.DockStyle.Right; + this.panel_form.Location = new System.Drawing.Point(617, 0); + this.panel_form.Name = "panel_form"; + this.panel_form.Size = new System.Drawing.Size(426, 552); + this.panel_form.TabIndex = 2; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.pic_lampOpen); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.txt_autoLight); + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.ch_autoLamp); + this.groupBox2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox2.ForeColor = System.Drawing.Color.White; + this.groupBox2.Location = new System.Drawing.Point(22, 21); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(392, 150); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "路灯控制"; + // + // pic_lampOpen + // + this.pic_lampOpen.BackgroundImage = global::智慧校园.Properties.Resources.switch_off; + this.pic_lampOpen.Location = new System.Drawing.Point(103, 103); + this.pic_lampOpen.Name = "pic_lampOpen"; + this.pic_lampOpen.Size = new System.Drawing.Size(48, 24); + this.pic_lampOpen.TabIndex = 5; + this.pic_lampOpen.TabStop = false; + this.pic_lampOpen.Click += new System.EventHandler(this.pic_lampOpen_Click); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(33, 105); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(59, 17); + this.label10.TabIndex = 4; + this.label10.Text = "灯光控制:"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(278, 58); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(17, 17); + this.label9.TabIndex = 3; + this.label9.Text = "lx"; + // + // txt_autoLight + // + this.txt_autoLight.Location = new System.Drawing.Point(128, 55); + this.txt_autoLight.Name = "txt_autoLight"; + this.txt_autoLight.Size = new System.Drawing.Size(144, 23); + this.txt_autoLight.TabIndex = 2; + this.txt_autoLight.TextChanged += new System.EventHandler(this.txt_autoLight_TextChanged); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(33, 58); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(92, 17); + this.label7.TabIndex = 1; + this.label7.Text = "设定开灯光照值"; + // + // ch_autoLamp + // + this.ch_autoLamp.AutoSize = true; + this.ch_autoLamp.Location = new System.Drawing.Point(35, 30); + this.ch_autoLamp.Name = "ch_autoLamp"; + this.ch_autoLamp.Size = new System.Drawing.Size(75, 21); + this.ch_autoLamp.TabIndex = 0; + this.ch_autoLamp.Text = "自动控制"; + this.ch_autoLamp.UseVisualStyleBackColor = true; + this.ch_autoLamp.CheckedChanged += new System.EventHandler(this.ch_autoLamp_CheckedChanged); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.btn_ledEnvironment2); + this.groupBox3.Controls.Add(this.ch_autoLedFire); + this.groupBox3.Controls.Add(this.btn_ledSendMsg); + this.groupBox3.Controls.Add(this.txt_ledMsg); + this.groupBox3.Controls.Add(this.label8); + this.groupBox3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox3.ForeColor = System.Drawing.Color.White; + this.groupBox3.Location = new System.Drawing.Point(22, 209); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(392, 316); + this.groupBox3.TabIndex = 4; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "LED推送"; + // + // btn_ledEnvironment2 + // + this.btn_ledEnvironment2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment2.Location = new System.Drawing.Point(234, 217); + this.btn_ledEnvironment2.Name = "btn_ledEnvironment2"; + this.btn_ledEnvironment2.Size = new System.Drawing.Size(145, 32); + this.btn_ledEnvironment2.TabIndex = 11; + this.btn_ledEnvironment2.Text = "推送天气信息"; + this.btn_ledEnvironment2.UseVisualStyleBackColor = false; + this.btn_ledEnvironment2.Click += new System.EventHandler(this.btn_ledEnvironment2_Click); + // + // ch_autoLedFire + // + this.ch_autoLedFire.AutoSize = true; + this.ch_autoLedFire.Location = new System.Drawing.Point(265, 35); + this.ch_autoLedFire.Name = "ch_autoLedFire"; + this.ch_autoLedFire.Size = new System.Drawing.Size(99, 21); + this.ch_autoLedFire.TabIndex = 4; + this.ch_autoLedFire.Text = "自动推送火情"; + this.ch_autoLedFire.UseVisualStyleBackColor = true; + this.ch_autoLedFire.CheckedChanged += new System.EventHandler(this.ch_autoLedFire_CheckedChanged); + // + // btn_ledSendMsg + // + this.btn_ledSendMsg.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_ledSendMsg.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledSendMsg.Location = new System.Drawing.Point(26, 217); + this.btn_ledSendMsg.Name = "btn_ledSendMsg"; + this.btn_ledSendMsg.Size = new System.Drawing.Size(145, 32); + this.btn_ledSendMsg.TabIndex = 2; + this.btn_ledSendMsg.Text = "推送LED信息"; + this.btn_ledSendMsg.UseVisualStyleBackColor = false; + this.btn_ledSendMsg.Click += new System.EventHandler(this.btn_ledSendMsg_Click); + // + // txt_ledMsg + // + this.txt_ledMsg.Location = new System.Drawing.Point(23, 62); + this.txt_ledMsg.Multiline = true; + this.txt_ledMsg.Name = "txt_ledMsg"; + this.txt_ledMsg.Size = new System.Drawing.Size(356, 130); + this.txt_ledMsg.TabIndex = 1; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(20, 36); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(54, 17); + this.label8.TabIndex = 0; + this.label8.Text = "LED信息"; + // + // panel5 + // + this.panel5.Controls.Add(this.btn_dataAnalyse); + this.panel5.Controls.Add(this.btn_ledEnvironment1); + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.txt_humidity); + this.panel5.Controls.Add(this.label1); + this.panel5.Controls.Add(this.label5); + this.panel5.Controls.Add(this.txt_fire); + this.panel5.Controls.Add(this.txt_temperature); + this.panel5.Controls.Add(this.label2); + this.panel5.Controls.Add(this.label4); + this.panel5.Controls.Add(this.txt_smoke); + this.panel5.Controls.Add(this.txt_light); + this.panel5.Controls.Add(this.label3); + this.panel5.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel5.Location = new System.Drawing.Point(0, 552); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(1043, 100); + this.panel5.TabIndex = 1; + // + // btn_dataAnalyse + // + this.btn_dataAnalyse.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_dataAnalyse.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_dataAnalyse.Location = new System.Drawing.Point(792, 35); + this.btn_dataAnalyse.Name = "btn_dataAnalyse"; + this.btn_dataAnalyse.Size = new System.Drawing.Size(119, 32); + this.btn_dataAnalyse.TabIndex = 23; + this.btn_dataAnalyse.Text = "数据分析"; + this.btn_dataAnalyse.UseVisualStyleBackColor = false; + this.btn_dataAnalyse.Click += new System.EventHandler(this.btn_dataAnalyse_Click); + // + // btn_ledEnvironment1 + // + this.btn_ledEnvironment1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment1.Location = new System.Drawing.Point(910, 35); + this.btn_ledEnvironment1.Name = "btn_ledEnvironment1"; + this.btn_ledEnvironment1.Size = new System.Drawing.Size(121, 32); + this.btn_ledEnvironment1.TabIndex = 15; + this.btn_ledEnvironment1.Text = "推送天气信息"; + this.btn_ledEnvironment1.UseVisualStyleBackColor = false; + this.btn_ledEnvironment1.Click += new System.EventHandler(this.btn_ledEnvironment1_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("微软雅黑", 18F); + this.label6.Location = new System.Drawing.Point(12, 31); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(110, 31); + this.label6.TabIndex = 11; + this.label6.Text = "环境数据"; + // + // txt_humidity + // + this.txt_humidity.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_humidity.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_humidity.Location = new System.Drawing.Point(716, 36); + this.txt_humidity.Name = "txt_humidity"; + this.txt_humidity.Size = new System.Drawing.Size(70, 32); + this.txt_humidity.TabIndex = 22; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label1.Location = new System.Drawing.Point(132, 38); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 25); + this.label1.TabIndex = 12; + this.label1.Text = "火焰"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label5.Location = new System.Drawing.Point(660, 39); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(50, 25); + this.label5.TabIndex = 21; + this.label5.Text = "湿度"; + // + // txt_fire + // + this.txt_fire.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_fire.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_fire.Location = new System.Drawing.Point(188, 35); + this.txt_fire.Name = "txt_fire"; + this.txt_fire.Size = new System.Drawing.Size(70, 32); + this.txt_fire.TabIndex = 13; + // + // txt_temperature + // + this.txt_temperature.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_temperature.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_temperature.Location = new System.Drawing.Point(584, 35); + this.txt_temperature.Name = "txt_temperature"; + this.txt_temperature.Size = new System.Drawing.Size(70, 32); + this.txt_temperature.TabIndex = 20; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label2.Location = new System.Drawing.Point(264, 36); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(50, 25); + this.label2.TabIndex = 14; + this.label2.Text = "烟雾"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label4.Location = new System.Drawing.Point(528, 38); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(50, 25); + this.label4.TabIndex = 19; + this.label4.Text = "温度"; + // + // txt_smoke + // + this.txt_smoke.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_smoke.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_smoke.Location = new System.Drawing.Point(320, 33); + this.txt_smoke.Name = "txt_smoke"; + this.txt_smoke.Size = new System.Drawing.Size(70, 32); + this.txt_smoke.TabIndex = 16; + // + // txt_light + // + this.txt_light.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_light.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_light.Location = new System.Drawing.Point(452, 32); + this.txt_light.Name = "txt_light"; + this.txt_light.Size = new System.Drawing.Size(70, 32); + this.txt_light.TabIndex = 18; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label3.Location = new System.Drawing.Point(396, 35); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(50, 25); + this.label3.TabIndex = 17; + this.label3.Text = "光照"; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel3.Controls.Add(this.lb_return); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(0, 0); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1043, 39); + this.panel3.TabIndex = 0; + this.panel3.Paint += new System.Windows.Forms.PaintEventHandler(this.panel3_Paint); + // + // lb_return + // + this.lb_return.AutoSize = true; + this.lb_return.Location = new System.Drawing.Point(25, 12); + this.lb_return.Name = "lb_return"; + this.lb_return.Size = new System.Drawing.Size(83, 12); + this.lb_return.TabIndex = 0; + this.lb_return.Text = "< 返回主窗体"; + this.lb_return.Click += new System.EventHandler(this.lb_return_Click); + // + // Environment + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1043, 791); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Environment"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Environment"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Environment_FormClosed); + this.Load += new System.EventHandler(this.Environment_Load); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel_bg.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.panel_form.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).EndInit(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lb_return; + private System.Windows.Forms.Panel panel_bg; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel_form; + private System.Windows.Forms.Button btn_dataAnalyse; + private System.Windows.Forms.Button btn_ledEnvironment1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txt_humidity; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txt_fire; + private System.Windows.Forms.TextBox txt_temperature; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txt_smoke; + private System.Windows.Forms.TextBox txt_light; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.PictureBox pic_lampOpen; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox txt_autoLight; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox ch_autoLamp; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button btn_ledEnvironment2; + private System.Windows.Forms.CheckBox ch_autoLedFire; + private System.Windows.Forms.Button btn_ledSendMsg; + private System.Windows.Forms.TextBox txt_ledMsg; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + } +} \ No newline at end of file diff --git a/samples/p8-t4-校园安防/Environment.cs b/samples/p8-t4-校园安防/Environment.cs new file mode 100644 index 0000000..c136074 --- /dev/null +++ b/samples/p8-t4-校园安防/Environment.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +using DeviceCtrlLibrary.Model; +using 智慧校园.SQLHelpers; +using System.Threading; + +namespace 智慧校园 +{ + public partial class Environment : Form + { + public Environment() + { + InitializeComponent(); + } + //用于各类耗时长的操作(SQL、数据采集、设备控制等) + Thread thread; + //用于异步通行 + SynchronizationContext _main; + //结果模型 + ADAM4017ResModel ResModel_4017; + ADAM4150ResModel ResModel_4150; + //设置自动控制路灯的光照值 + double environmentLight, setLight; + //按钮状态标志 + bool IsAuto_Lamp = false; + bool IsAuto_FireMsg = false; + bool IsLampOpen = false; + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void lb_return_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void Environment_Load(object sender, EventArgs e) + { + try + { + + //隐藏曲线图 + chart1.Visible = false; + thread = new Thread(new ThreadStart(Tick)); + _main = WindowsFormsSynchronizationContext.Current; + thread.Start(); + } + catch + { + } + + } + private void Tick() + { + try + { + while (true) + { + //数据采集 + ResModel_4017 = DeviceCtrlHelper.adam4017Helper.SetData(); + Thread.Sleep(500); + ResModel_4150 = DeviceCtrlHelper.adam4150Helper.SetData(); + + //UI显示数据 + + _main.Send(_ => + { + try //防止无数据出错 + { + txt_fire.Text = (ResModel_4150.fireValue ? "发生火情" : "正常"); + txt_smoke.Text = (ResModel_4150.smokeValue ? "发生烟情" : "正常"); + txt_light.Text = ResModel_4017.lightValue; + txt_temperature.Text = ResModel_4017.temperatureValue; + txt_humidity.Text = ResModel_4017.humidityValue; + } + catch { } + }, null); + + //自动路灯控制 + double.TryParse(ResModel_4017.lightValue, out environmentLight); + if (IsAuto_Lamp && environmentLight < setLight) + { + LampOnOff(1, true); + } + else if (IsAuto_Lamp && !(environmentLight < setLight)) + { + LampOnOff(1, false); + } + + //自动推送火情LED信息控制 + if (IsAuto_FireMsg) + { + if (ResModel_4150.fireValue && ResModel_4150.smokeValue) + DeviceCtrlHelper.ledHelper.SendLedString("发生严重火灾 "); + else if (ResModel_4150.fireValue) + DeviceCtrlHelper.ledHelper.SendLedString("发现火情 "); + else if (ResModel_4150.smokeValue) + DeviceCtrlHelper.ledHelper.SendLedString("发现烟情 "); + } + + //执行数据上传 + SQLBLL.EnvironmentUpData(ResModel_4150.fireValue, ResModel_4150.smokeValue, ResModel_4017.lightValue, ResModel_4017.temperatureValue, ResModel_4017.humidityValue); + + Thread.Sleep(5000); + } + } + catch + { + } + } + private void LampOnOff(int RelayNum, bool IsOpen) + { + try + { + //开启路灯 + DeviceCtrlHelper.zigBeeHelper.OnOff(RelayNum, IsOpen); + + //切换UI背景 + _main.Send(_ => + { + if (IsOpen) + { + pic_lampOpen.BackgroundImage = Properties.Resources.switch_on; + panel_bg.BackgroundImage = Properties.Resources.day_01; + } + else + { + panel_bg.BackgroundImage = Properties.Resources.day_02; + pic_lampOpen.BackgroundImage = Properties.Resources.switch_off; + } + }, null); + } + catch + { + } + } + + private void Environment_FormClosed(object sender, FormClosedEventArgs e) + { + try + { + thread.Suspend(); + thread = null; + + } + catch + { + } + + + } + + private void btn_dataAnalyse_Click(object sender, EventArgs e) + { + try + { + if (btn_dataAnalyse.Text.Equals("数据分析")) + { + //绑定图标数据 + chart1.DataSource = SQLBLL.GetEnvironmentGraphData(); + //更新图标数据 + chart1.DataBind(); + chart1.Visible = true; + btn_dataAnalyse.Text = "关闭图表"; + } + else if (btn_dataAnalyse.Text.Equals("关闭图表")) + { + chart1.Visible = false; + btn_dataAnalyse.Text = "数据分析"; + } + } + catch + { + } + + } + + private void pic_lampOpen_Click(object sender, EventArgs e) + { + //手动路灯控制 + try + { + if (!IsLampOpen) + { + LampOnOff(1, true); + + } + else + { + LampOnOff(1, false); + + } + + IsLampOpen = !IsLampOpen; + } + catch + { + } + } + + private void btn_ledEnvironment1_Click(object sender, EventArgs e) + { + try + { + //推送LED天气信息 + if (ResModel_4017 != null && ResModel_4150 != null) + DeviceCtrlHelper.ledHelper.SendLedString("当前温度:" + ResModel_4017.temperatureValue + "℃ 湿度:" + ResModel_4017.humidityValue + "%"); + } + catch + { + } + } + + private void btn_ledEnvironment2_Click(object sender, EventArgs e) + { + try + { + //推送LED天气信息 + if (ResModel_4017 != null && ResModel_4150 != null) + DeviceCtrlHelper.ledHelper.SendLedString("当前温度:" + ResModel_4017.temperatureValue + "℃ 湿度:" + ResModel_4017.humidityValue + "%"); + } + catch + { + } + } + + private void panel3_Paint(object sender, PaintEventArgs e) + { + + } + + private void txt_autoLight_TextChanged(object sender, EventArgs e) + { + try + { + //获取光照比较值 + double.TryParse(txt_autoLight.Text,out setLight); + + } + + catch + { + } + } + + private void btn_ledSendMsg_Click(object sender, EventArgs e) + { + try + { + //推送LED信息 + DeviceCtrlHelper.ledHelper.SendLedString(txt_ledMsg.Text); + } + catch + { + } + } + + private void ch_autoLamp_CheckedChanged(object sender, EventArgs e) + { + //自动控制路灯 + IsAuto_Lamp = ch_autoLamp.Checked; + } + + private void ch_autoLedFire_CheckedChanged(object sender, EventArgs e) + { + //自动推送火情 + IsAuto_FireMsg = ch_autoLedFire.Checked; + } + } +} diff --git a/samples/p8-t4-校园安防/Main.Designer.cs b/samples/p8-t4-校园安防/Main.Designer.cs new file mode 100644 index 0000000..dc4cf19 --- /dev/null +++ b/samples/p8-t4-校园安防/Main.Designer.cs @@ -0,0 +1,145 @@ +namespace 智慧校园 +{ + partial class Main + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.pic_exit = new System.Windows.Forms.PictureBox(); + this.pic_security = new System.Windows.Forms.PictureBox(); + this.pic_environment = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(147)))), ((int)(((byte)(237))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1018, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(57, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(197, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.BackgroundImage = global::智慧校园.Properties.Resources.bg_home; + this.panel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel2.Controls.Add(this.pic_exit); + this.panel2.Controls.Add(this.pic_security); + this.panel2.Controls.Add(this.pic_environment); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1018, 516); + this.panel2.TabIndex = 1; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // pic_exit + // + this.pic_exit.BackColor = System.Drawing.Color.Transparent; + this.pic_exit.Image = global::智慧校园.Properties.Resources.icon_04; + this.pic_exit.Location = new System.Drawing.Point(660, 124); + this.pic_exit.Name = "pic_exit"; + this.pic_exit.Size = new System.Drawing.Size(180, 210); + this.pic_exit.TabIndex = 6; + this.pic_exit.TabStop = false; + this.pic_exit.Click += new System.EventHandler(this.pic_exit_Click); + // + // pic_security + // + this.pic_security.BackColor = System.Drawing.Color.Transparent; + this.pic_security.Image = global::智慧校园.Properties.Resources.icon_03; + this.pic_security.Location = new System.Drawing.Point(404, 124); + this.pic_security.Name = "pic_security"; + this.pic_security.Size = new System.Drawing.Size(180, 210); + this.pic_security.TabIndex = 5; + this.pic_security.TabStop = false; + this.pic_security.Click += new System.EventHandler(this.pic_security_Click); + // + // pic_environment + // + this.pic_environment.BackColor = System.Drawing.Color.Transparent; + this.pic_environment.Image = global::智慧校园.Properties.Resources.icon_02; + this.pic_environment.Location = new System.Drawing.Point(133, 124); + this.pic_environment.Name = "pic_environment"; + this.pic_environment.Size = new System.Drawing.Size(180, 210); + this.pic_environment.TabIndex = 4; + this.pic_environment.TabStop = false; + this.pic_environment.Click += new System.EventHandler(this.pic_environment_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1018, 616); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Main_Load); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_exit; + private System.Windows.Forms.PictureBox pic_security; + private System.Windows.Forms.PictureBox pic_environment; + } +} + diff --git a/samples/p8-t4-校园安防/Main.cs b/samples/p8-t4-校园安防/Main.cs new file mode 100644 index 0000000..075f2c6 --- /dev/null +++ b/samples/p8-t4-校园安防/Main.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +namespace 智慧校园 +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void pic_environment_Click(object sender, EventArgs e) + { + try + { + new Environment().Show(); + + } + catch + { + } + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { + + } + + private void Main_Load(object sender, EventArgs e) + { + try + { + //实例化工具类 + DeviceCtrlHelper.adam4017Helper.Open(AppSet.ADAM4017_COM); + DeviceCtrlHelper.adam4150Helper.Open(AppSet.ADAM4150_COM); + DeviceCtrlHelper.zigBeeHelper.Open(AppSet.ZigBee_COM); + DeviceCtrlHelper.ledHelper.OpenLedCom(AppSet.LED_COM); + } + catch { } + } + + private void pic_security_Click(object sender, EventArgs e) + { + try + { + new Security().Show(); + + } + catch + { + } + } + + private void pic_exit_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t4-校园安防/Program.cs b/samples/p8-t4-校园安防/Program.cs new file mode 100644 index 0000000..2fd691b --- /dev/null +++ b/samples/p8-t4-校园安防/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace 智慧校园 +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + } +} diff --git a/samples/p8-t4-校园安防/Properties/Resources.Designer.cs b/samples/p8-t4-校园安防/Properties/Resources.Designer.cs new file mode 100644 index 0000000..8b526eb --- /dev/null +++ b/samples/p8-t4-校园安防/Properties/Resources.Designer.cs @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// +// 项目资源(平台素材库)。在"项目资源"里添加或移除,不要手动修改这个文件。 +// +//------------------------------------------------------------------------------ + +namespace 智慧校园.Properties { + + /// + /// 项目资源:Properties.Resources.资源名 + /// + internal class Resources { + + /// 标题:智慧校园 + internal static System.Drawing.Bitmap ico_title { + get { return global::Sim.Host.ProjectResources.Image("ico_title.png"); } + } + + /// 主界面背景:校园 + internal static System.Drawing.Bitmap bg_home { + get { return global::Sim.Host.ProjectResources.Image("bg_home.png"); } + } + + /// 图标:校园环境 + internal static System.Drawing.Bitmap icon_02 { + get { return global::Sim.Host.ProjectResources.Image("icon_02.png"); } + } + + /// 图标:校园安防 + internal static System.Drawing.Bitmap icon_03 { + get { return global::Sim.Host.ProjectResources.Image("icon_03.png"); } + } + + /// 图标:退出 + internal static System.Drawing.Bitmap icon_04 { + get { return global::Sim.Host.ProjectResources.Image("icon_04.png"); } + } + + /// 路灯场景:亮灯 + internal static System.Drawing.Bitmap day_01 { + get { return global::Sim.Host.ProjectResources.Image("day_01.png"); } + } + + /// 路灯场景:灭灯 + internal static System.Drawing.Bitmap day_02 { + get { return global::Sim.Host.ProjectResources.Image("day_02.png"); } + } + + /// 面板背景(窄) + internal static System.Drawing.Bitmap bg_from2 { + get { return global::Sim.Host.ProjectResources.Image("bg_from2.png"); } + } + + /// 开关:开 + internal static System.Drawing.Bitmap switch_on { + get { return global::Sim.Host.ProjectResources.Image("switch_on.png"); } + } + + /// 开关:关 + internal static System.Drawing.Bitmap switch_off { + get { return global::Sim.Host.ProjectResources.Image("switch_off.png"); } + } + + /// 监控:无画面 + internal static System.Drawing.Bitmap icon_monitor { + get { return global::Sim.Host.ProjectResources.Image("icon_monitor.png"); } + } + + /// 监控:方向盘底座 + internal static System.Drawing.Bitmap panel_video_ctrl { + get { return global::Sim.Host.ProjectResources.Image("panel_video_ctrl.png"); } + } + + /// 方向键:上 + internal static System.Drawing.Bitmap btn_arrow_up_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_up_normal.png"); } + } + + /// 方向键:上(按下) + internal static System.Drawing.Bitmap btn_arrow_up_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_up_press.png"); } + } + + /// 方向键:下 + internal static System.Drawing.Bitmap btn_arrow_down_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_down_normal.png"); } + } + + /// 方向键:下(按下) + internal static System.Drawing.Bitmap btn_arrow_down_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_down_press.png"); } + } + + /// 方向键:左 + internal static System.Drawing.Bitmap btn_arrow_left_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_left_normal.png"); } + } + + /// 方向键:左(按下) + internal static System.Drawing.Bitmap btn_arrow_left_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_left_press.png"); } + } + + /// 方向键:右 + internal static System.Drawing.Bitmap btn_arrow_right_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_right_normal.png"); } + } + + /// 方向键:右(按下) + internal static System.Drawing.Bitmap btn_arrow_right_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_right_press.png"); } + } + } +} diff --git a/samples/p8-t4-校园安防/SQLHelpers/SQLBLL.cs b/samples/p8-t4-校园安防/SQLHelpers/SQLBLL.cs new file mode 100644 index 0000000..c737537 --- /dev/null +++ b/samples/p8-t4-校园安防/SQLHelpers/SQLBLL.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园.SQLHelpers +{ + class SQLBLL + { + + public static SQLRes SecurityUpData(Image img)//把图片保存到数据库 + { + SQLRes sqlRes = new SQLRes(); + byte[] imgByte = null; + + using (MemoryStream ms = new MemoryStream())//图片转换为二进制数组 + { + img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); + imgByte = new byte[ms.Length]; + imgByte = ms.ToArray(); + } + + string sqlStr = "INSERT INTO SecurityData (EvenTime,EvenImage) VALUES (@time,@img)"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time", DateTime.Now.ToString()), new SqlParameter("img", imgByte) }; + + if (SQLHelper.Exec(sqlStr, sqlParameter) >= 1) + { + sqlRes.Result = true; + sqlRes.Msg = "成功!"; + } + else + { + sqlRes.Result = false; + sqlRes.Msg = "失败!"; + } + + return sqlRes; + } + + public static Dictionary GetSecurityData(DateTime startDate, DateTime endDate) + { + Dictionary ImgDictionary = new Dictionary(); + + if (string.IsNullOrWhiteSpace(startDate.Month.ToString()) && string.IsNullOrWhiteSpace(endDate.Month .ToString())) + { + return ImgDictionary; + } + //选择查询日期日期 + string sql = "SELECT * FROM SecurityData WHERE EvenTime between @time_start and @time_end"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time_start", startDate.Year + "/" + startDate.Month + "/" + startDate.Day), new SqlParameter("time_end", endDate.Year + "/" + endDate.Month + "/" + endDate.Day+" 23:59:59" )}; + + DataSet ds = SQLHelper.getData(sql, sqlParameter); + + for (int i = 0; i < ds.Tables[0].Rows.Count; i++) + { + ImgDictionary.Add(ds.Tables[0].Rows[i]["EvenTime"].ToString(), Image.FromStream(new MemoryStream((byte[])ds.Tables[0].Rows[i]["EvenImage"]))); + } + + return ImgDictionary; + } + + public static SQLRes EnvironmentUpData(bool fire, bool smoke, string light, string temperature, string humidity) + { + + SQLRes sqlRes = new SQLRes(); + + string sqlStr = "INSERT INTO EnvironmentData (Fire ,Smoke ,Temperature ,Humidity , Light, _Time) VALUES (@fire,@smoke,@temperature,@humidity,@light,@time)"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time", DateTime.Now.ToString()), new SqlParameter("fire", fire), new SqlParameter("smoke", smoke), new SqlParameter("temperature", temperature), new SqlParameter("humidity", humidity), new SqlParameter("light", light) }; + + if (SQLHelper.Exec(sqlStr, sqlParameter) >= 1) + { + sqlRes.Result = true; + sqlRes.Msg = "成功!"; + } + else + { + sqlRes.Result = false; + sqlRes.Msg = "失败!"; + } + + return sqlRes; + + } + + public static DataTable GetEnvironmentGraphData() + { + string sqlStr = "SELECT TOP 7 CONVERT(varchar(10),_Time,120) AS _Time, ROUND(Max(Temperature),2) AS MaxTemperature, ROUND(AVG(Temperature),2) AS AVGTemperature FROM EnvironmentData GROUP BY CONVERT(varchar(10),_Time,120) ORDER BY CONVERT(varchar(10),_Time,120) DESC "; + return SQLHelper.getData(sqlStr, null).Tables[0]; + } + + + } + + class SQLRes + { + public string Msg { get; set; } + public bool Result { get; set; } + } + + } + diff --git a/samples/p8-t4-校园安防/SQLHelpers/SQLHelper.cs b/samples/p8-t4-校园安防/SQLHelpers/SQLHelper.cs new file mode 100644 index 0000000..d37157e --- /dev/null +++ b/samples/p8-t4-校园安防/SQLHelpers/SQLHelper.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园.SQLHelpers +{ + class SQLHelper + { + public static string strConn = AppSet.SqlConn; + + public static bool SaveData(string sql, DataTable dt) + { + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlDataAdapter sda = new SqlDataAdapter(sql, conn); + SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(sda); + sda.Update(dt); + conn.Close(); + return true; + } + catch (Exception e) + { + string Error = e.Message; + return false; + } + } + + public static DataSet getData(string sql, params SqlParameter[] para) + { + DataSet ds = new DataSet(); + + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlCommand cmd = new SqlCommand(sql, conn); + if (para != null) + { + foreach (SqlParameter item in para) + { + cmd.Parameters.Add(item); + } + } + SqlDataAdapter sda = new SqlDataAdapter(cmd); + sda.Fill(ds); + cmd.Parameters.Clear(); + conn.Close(); + } + catch(Exception e) + { + string Error = e.Message; + } + + return ds; + } + + public static DataSet getData(SqlCommand cmd) + { + DataSet ds = new DataSet(); + + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + cmd.Connection = conn; + + SqlDataAdapter sda = new SqlDataAdapter(cmd); + sda.Fill(ds); + cmd.Parameters.Clear(); + conn.Close(); + } + catch (Exception e) + { + string Error = e.Message; + } + + return ds; + } + + public static int Exec(string sql, params SqlParameter[] para) + { + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlCommand cmd = new SqlCommand(sql, conn); + if (para != null) + { + foreach (SqlParameter item in para) + { + cmd.Parameters.Add(item); + } + } + int iRsult = cmd.ExecuteNonQuery(); + conn.Close(); + return iRsult; + } + catch (Exception e) + { + string Error = e.Message; + return -1; + } + } + } + } + diff --git a/samples/p8-t4-校园安防/Security.Designer.cs b/samples/p8-t4-校园安防/Security.Designer.cs new file mode 100644 index 0000000..ef0de05 --- /dev/null +++ b/samples/p8-t4-校园安防/Security.Designer.cs @@ -0,0 +1,296 @@ +namespace 智慧校园 +{ + partial class Security + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel3 = new System.Windows.Forms.Panel(); + this.lb_return = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel_bg_video = new System.Windows.Forms.Panel(); + this.btn_history = new System.Windows.Forms.Button(); + this.btn_camera = new System.Windows.Forms.Button(); + this.panel_video_ctrl = new System.Windows.Forms.Panel(); + this.pic_left = new System.Windows.Forms.PictureBox(); + this.pic_right = new System.Windows.Forms.PictureBox(); + this.pic_down = new System.Windows.Forms.PictureBox(); + this.pic_up = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.lb_infrared = new System.Windows.Forms.Label(); + this.pic_video = new System.Windows.Forms.PictureBox(); + this.panel3.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel_bg_video.SuspendLayout(); + this.panel_video_ctrl.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_left)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_right)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_down)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_up)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_video)).BeginInit(); + this.SuspendLayout(); + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel3.Controls.Add(this.lb_return); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(0, 100); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1081, 39); + this.panel3.TabIndex = 1; + // + // lb_return + // + this.lb_return.AutoSize = true; + this.lb_return.Location = new System.Drawing.Point(25, 12); + this.lb_return.Name = "lb_return"; + this.lb_return.Size = new System.Drawing.Size(83, 12); + this.lb_return.TabIndex = 0; + this.lb_return.Text = "< 返回主窗体"; + this.lb_return.Click += new System.EventHandler(this.lb_return_Click); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1081, 100); + this.panel1.TabIndex = 2; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(44, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(226, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel_bg_video + // + this.panel_bg_video.BackColor = System.Drawing.Color.White; + this.panel_bg_video.Controls.Add(this.btn_history); + this.panel_bg_video.Controls.Add(this.btn_camera); + this.panel_bg_video.Controls.Add(this.panel_video_ctrl); + this.panel_bg_video.Controls.Add(this.panel2); + this.panel_bg_video.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_bg_video.Location = new System.Drawing.Point(0, 139); + this.panel_bg_video.Name = "panel_bg_video"; + this.panel_bg_video.Size = new System.Drawing.Size(1081, 499); + this.panel_bg_video.TabIndex = 3; + this.panel_bg_video.Paint += new System.Windows.Forms.PaintEventHandler(this.panel_bg_video_Paint); + // + // btn_history + // + this.btn_history.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(143)))), ((int)(((byte)(213)))), ((int)(((byte)(122))))); + this.btn_history.Font = new System.Drawing.Font("微软雅黑", 14F); + this.btn_history.Location = new System.Drawing.Point(804, 410); + this.btn_history.Name = "btn_history"; + this.btn_history.Size = new System.Drawing.Size(160, 49); + this.btn_history.TabIndex = 10; + this.btn_history.Text = "查看历史图像"; + this.btn_history.UseVisualStyleBackColor = false; + // + // btn_camera + // + this.btn_camera.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(200)))), ((int)(((byte)(81))))); + this.btn_camera.Font = new System.Drawing.Font("微软雅黑", 16F); + this.btn_camera.Location = new System.Drawing.Point(804, 326); + this.btn_camera.Name = "btn_camera"; + this.btn_camera.Size = new System.Drawing.Size(160, 49); + this.btn_camera.TabIndex = 9; + this.btn_camera.Text = "拍照"; + this.btn_camera.UseVisualStyleBackColor = false; + this.btn_camera.Click += new System.EventHandler(this.btn_camera_Click); + // + // panel_video_ctrl + // + this.panel_video_ctrl.BackgroundImage = global::智慧校园.Properties.Resources.panel_video_ctrl; + this.panel_video_ctrl.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel_video_ctrl.Controls.Add(this.pic_left); + this.panel_video_ctrl.Controls.Add(this.pic_right); + this.panel_video_ctrl.Controls.Add(this.pic_down); + this.panel_video_ctrl.Controls.Add(this.pic_up); + this.panel_video_ctrl.Location = new System.Drawing.Point(741, 15); + this.panel_video_ctrl.Name = "panel_video_ctrl"; + this.panel_video_ctrl.Size = new System.Drawing.Size(328, 294); + this.panel_video_ctrl.TabIndex = 1; + // + // pic_left + // + this.pic_left.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_left_normal; + this.pic_left.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_left.Location = new System.Drawing.Point(63, 116); + this.pic_left.Name = "pic_left"; + this.pic_left.Size = new System.Drawing.Size(39, 54); + this.pic_left.TabIndex = 6; + this.pic_left.TabStop = false; + this.pic_left.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_left_MouseDown); + this.pic_left.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_left_MouseUp); + // + // pic_right + // + this.pic_right.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_right_normal; + this.pic_right.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_right.Location = new System.Drawing.Point(223, 116); + this.pic_right.Name = "pic_right"; + this.pic_right.Size = new System.Drawing.Size(39, 54); + this.pic_right.TabIndex = 5; + this.pic_right.TabStop = false; + this.pic_right.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_right_MouseDown); + this.pic_right.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_right_MouseUp); + // + // pic_down + // + this.pic_down.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_down_normal; + this.pic_down.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_down.Location = new System.Drawing.Point(143, 202); + this.pic_down.Name = "pic_down"; + this.pic_down.Size = new System.Drawing.Size(39, 54); + this.pic_down.TabIndex = 4; + this.pic_down.TabStop = false; + this.pic_down.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_down_MouseDown); + this.pic_down.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_down_MouseUp); + // + // pic_up + // + this.pic_up.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_up_normal; + this.pic_up.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_up.Location = new System.Drawing.Point(142, 20); + this.pic_up.Name = "pic_up"; + this.pic_up.Size = new System.Drawing.Size(39, 54); + this.pic_up.TabIndex = 1; + this.pic_up.TabStop = false; + this.pic_up.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_up_MouseDown); + this.pic_up.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_up_MouseUp); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.DimGray; + this.panel2.Controls.Add(this.label2); + this.panel2.Controls.Add(this.lb_infrared); + this.panel2.Controls.Add(this.pic_video); + this.panel2.Location = new System.Drawing.Point(69, 15); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(666, 472); + this.panel2.TabIndex = 0; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(545, 91); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(46, 21); + this.label2.TabIndex = 12; + this.label2.Text = "入侵:"; + // + // lb_infrared + // + this.lb_infrared.AutoSize = true; + this.lb_infrared.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lb_infrared.ForeColor = System.Drawing.Color.White; + this.lb_infrared.Location = new System.Drawing.Point(597, 91); + this.lb_infrared.Name = "lb_infrared"; + this.lb_infrared.Size = new System.Drawing.Size(41, 21); + this.lb_infrared.TabIndex = 11; + this.lb_infrared.Text = "N/A"; + // + // pic_video + // + this.pic_video.BackColor = System.Drawing.Color.DarkGray; + this.pic_video.BackgroundImage = global::智慧校园.Properties.Resources.icon_monitor; + this.pic_video.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pic_video.Location = new System.Drawing.Point(32, 38); + this.pic_video.Name = "pic_video"; + this.pic_video.Size = new System.Drawing.Size(478, 322); + this.pic_video.TabIndex = 0; + this.pic_video.TabStop = false; + this.pic_video.Click += new System.EventHandler(this.pictureBox2_Click); + // + // Security + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1081, 638); + this.Controls.Add(this.panel_bg_video); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Security"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Security"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Security_FormClosed); + this.Load += new System.EventHandler(this.Security_Load); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel_bg_video.ResumeLayout(false); + this.panel_video_ctrl.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_left)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_right)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_down)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_up)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_video)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lb_return; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel_bg_video; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_video; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lb_infrared; + private System.Windows.Forms.Button btn_history; + private System.Windows.Forms.Button btn_camera; + private System.Windows.Forms.Panel panel_video_ctrl; + private System.Windows.Forms.PictureBox pic_left; + private System.Windows.Forms.PictureBox pic_right; + private System.Windows.Forms.PictureBox pic_down; + private System.Windows.Forms.PictureBox pic_up; + } +} \ No newline at end of file diff --git a/samples/p8-t4-校园安防/Security.cs b/samples/p8-t4-校园安防/Security.cs new file mode 100644 index 0000000..3b410f5 --- /dev/null +++ b/samples/p8-t4-校园安防/Security.cs @@ -0,0 +1,240 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; +using System.Threading; + +using DeviceCtrlLibrary; +using 智慧校园.SQLHelpers; + +namespace 智慧校园 +{ + public partial class Security : Form + { //显示图像 + Image img = null; + //入侵标识 + bool IsInfrared = false; + //图像文件夹路径 + string ImgDir = AppDomain.CurrentDomain.BaseDirectory + "Camera\\"; + //用于数据采集和SQL操作 + Thread thread; + SynchronizationContext _main; + public Security() + { + InitializeComponent(); + } + void ipCameraHelper_ImageRead(ImageReadEvenArgs e) + { + img = e.img; + pic_video.Image = e.img; + } + void tick() + { + try + { + while (true) + { + try + { + //采集入侵状态 + IsInfrared = DeviceCtrlHelper.adam4150Helper.SetData().infraredValue; + //UI显示入侵状态 + _main.Send(_ => + { + lb_infrared.Text = IsInfrared ? "发现入侵" : "正常"; + }, null); + + if (IsInfrared) + { + if (img != null) + //上传报警信息 + SQLBLL.SecurityUpData(img); + } + } + catch + { + } + + Thread.Sleep(1000); + } + } + catch + { + } + } + private void pictureBox2_Click(object sender, EventArgs e) + { + + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void panel_bg_video_Paint(object sender, PaintEventArgs e) + { + + } + + private void Security_Load(object sender, EventArgs e) + { + try + { + + + //实例化摄像头控制类 + DeviceCtrlHelper.ipCameraHelper.Open(AppSet.Camera_Ip, AppSet.Camera_Uid, AppSet.Camera_Pwd); + DeviceCtrlHelper.ipCameraHelper.ImageRead += ipCameraHelper_ImageRead; + DeviceCtrlHelper.ipCameraHelper.Start(); + + thread = new Thread(new ThreadStart(tick)); + _main = WindowsFormsSynchronizationContext.Current; + thread.Start(); + + if (!Directory.Exists(ImgDir)) + //创建文件夹 + Directory.CreateDirectory(ImgDir); + } + catch + { + } + } + + private void Security_FormClosed(object sender, FormClosedEventArgs e) + { + try + { + DeviceCtrlHelper.ipCameraHelper.Stop(); + DeviceCtrlHelper.ipCameraHelper.Close(); + thread.Suspend(); + thread = null; + + } + catch + { + } + + } + + private void btn_camera_Click(object sender, EventArgs e) + { + try + { + pic_video.Image.Save(ImgDir + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".jpg"); + SQLBLL.SecurityUpData(pic_video.Image); + } + catch + { + } + + } + + private void pic_up_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_up.BackgroundImage = Properties.Resources.btn_arrow_up_press; + DeviceCtrlHelper.ipCameraHelper.PanUp(); + } + catch + { + } + } + + private void pic_up_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_up.BackgroundImage = Properties.Resources.btn_arrow_up_normal; + DeviceCtrlHelper.ipCameraHelper.PanUp(); + } + catch + { + } + } + + private void pic_down_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_down.BackgroundImage = Properties.Resources.btn_arrow_down_press; + DeviceCtrlHelper.ipCameraHelper.PanDown(); + } + catch + { + } + } + + private void pic_down_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_down.BackgroundImage = Properties.Resources.btn_arrow_down_normal; + DeviceCtrlHelper.ipCameraHelper.PanDown(); + } + catch + { + } + } + + private void pic_left_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_left.BackgroundImage = Properties.Resources.btn_arrow_left_press; + DeviceCtrlHelper.ipCameraHelper.PanLeft(); + } + catch + { + } + } + + private void pic_left_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_left.BackgroundImage = Properties.Resources.btn_arrow_left_normal; + DeviceCtrlHelper.ipCameraHelper.PanLeft(); + } + catch + { + } + } + + private void pic_right_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_right.BackgroundImage = Properties.Resources.btn_arrow_right_press; + DeviceCtrlHelper.ipCameraHelper.PanRight(); + } + catch + { + } + } + + private void pic_right_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_right.BackgroundImage = Properties.Resources.btn_arrow_right_normal; + DeviceCtrlHelper.ipCameraHelper.PanRight(); + } + catch + { + } + } + + private void lb_return_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t4-校园安防/checks.yaml b/samples/p8-t4-校园安防/checks.yaml new file mode 100644 index 0000000..df7f18e --- /dev/null +++ b/samples/p8-t4-校园安防/checks.yaml @@ -0,0 +1,46 @@ +# 评分规则:书上评价表的功能项。每项单独启动一次程序,按步骤操作,核对结果。 +# 格式说明见 server/src/grading/checks.ts +- title: 摄像机能正常打开 + steps: + - click: pic_security + - expect: { window: Security, desc: 点"校园安防"打开 Security 窗体 } + - expect: { camera: on } + - expect: { control: pic_video, image: true, within: 3s, desc: 显示摄像机拍到的图像 } + +- title: 人体入侵有文字提示 + steps: + - click: pic_security + - board: { infrared: true } + - expect: { control: lb_infrared, text: 发现入侵, within: 3s, desc: 红外对射被遮挡时显示"发现入侵" } + - board: { infrared: false } + - expect: { control: lb_infrared, text: 正常, within: 3s } + +- title: 摄像机可以调整方向 + steps: + - click: pic_security + - click: pic_up + - expect: { camera: up, desc: 按"↑"向上转 } + - expect: { control: pic_up, background: btn_arrow_up_normal, desc: 松开后方向键换回原来的图片 } + - click: pic_left + - expect: { camera: left, desc: 按"←"向左转 } + - click: pic_down + - click: pic_down + - expect: { camera: down, desc: 按"↓"向下转 } + - click: pic_right + - click: pic_right + - expect: { camera: right, desc: 按"→"向右转 } + +- title: 摄像机能拍照并保存图片 + steps: + - click: pic_security + - expect: { control: pic_video, image: true, within: 3s } + - click: btn_camera + - expect: { savedImage: Camera/, desc: 把照片保存到 Camera 文件夹 } + +- title: 返回主窗体时关闭摄像机 + steps: + - click: pic_security + - expect: { camera: on } + - click: lb_return + - expect: { window: Security, open: false } + - expect: { camera: off } diff --git a/samples/p8-t4-校园安防/database.sql b/samples/p8-t4-校园安防/database.sql new file mode 100644 index 0000000..2e5eeba --- /dev/null +++ b/samples/p8-t4-校园安防/database.sql @@ -0,0 +1,54 @@ +-- 实验的初始数据库 WisdomCampus(教材"综合实训"附带的库):环境数据表 EnvironmentData、报警图片表 SecurityData、用户表 Users。 +-- EnvironmentData 预置了 7 天的历史数据,"数据分析"的图表一打开就有内容;SecurityData 是空的,拍照或有人入侵时才有记录。 +-- 学生可以在数据库页面"恢复实验初始数据";评分时每个检查项用一份新的。 +CREATE DATABASE WisdomCampus +GO +USE WisdomCampus +GO +CREATE TABLE Users (Id int IDENTITY(1,1) PRIMARY KEY, UserName nvarchar(50) NOT NULL, Password nvarchar(50) NOT NULL) +CREATE TABLE EnvironmentData (Id int IDENTITY(1,1) PRIMARY KEY, Fire bit NOT NULL, Smoke bit NOT NULL, Temperature float NULL, Humidity float NULL, Light float NULL, _Time datetime NOT NULL) +CREATE TABLE SecurityData (Id int IDENTITY(1,1) PRIMARY KEY, EvenTime datetime NOT NULL, EvenImage image NOT NULL) +GO +INSERT INTO Users (UserName, Password) VALUES ('admin', '123') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.9, 58, 258, '2026-10-14 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.1, 53, 475, '2026-10-14 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.8, 51, 761, '2026-10-14 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 22.5, 49, 733, '2026-10-14 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 54, 528, '2026-10-14 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.1, 57, 283, '2026-10-14 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.9, 59, 261, '2026-10-15 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 53, 499, '2026-10-15 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.8, 52, 764, '2026-10-15 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 23.5, 47, 778, '2026-10-15 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.8, 52, 503, '2026-10-15 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 56, 218, '2026-10-15 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 13.9, 63, 258, '2026-10-16 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.6, 60, 477, '2026-10-16 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.8, 51, 741, '2026-10-16 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.5, 54, 796, '2026-10-16 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 55, 488, '2026-10-16 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.6, 59, 214, '2026-10-16 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 11.9, 67, 234, '2026-10-17 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.1, 63, 544, '2026-10-17 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.3, 60, 804, '2026-10-17 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.5, 54, 801, '2026-10-17 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.8, 59, 524, '2026-10-17 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.1, 58, 286, '2026-10-17 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.4, 59, 250, '2026-10-18 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 55, 533, '2026-10-18 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.3, 50, 749, '2026-10-18 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 24, 48, 766, '2026-10-18 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.8, 54, 534, '2026-10-18 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.1, 53, 241, '2026-10-18 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.4, 54, 253, '2026-10-19 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.1, 50, 474, '2026-10-19 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 22.3, 48, 778, '2026-10-19 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 26, 46, 783, '2026-10-19 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 23.3, 50, 520, '2026-10-19 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.6, 50, 213, '2026-10-19 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.9, 62, 230, '2026-10-20 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.6, 52, 471, '2026-10-20 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 53, 751, '2026-10-20 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.5, 48, 747, '2026-10-20 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 55, 527, '2026-10-20 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.1, 57, 220, '2026-10-20 18:00:00') diff --git a/samples/p8-t4-校园安防/meta.json b/samples/p8-t4-校园安防/meta.json new file mode 100644 index 0000000..654ef0f --- /dev/null +++ b/samples/p8-t4-校园安防/meta.json @@ -0,0 +1,4 @@ +{ + "title": "项目8 任务4 实现\"校园安防\"功能模块", + "source": "教材书 p174–180,界面和代码取自配套参考工程;图片是平台素材库里自绘的同名素材(尺寸和教材一致);\"查看历史图像\"在任务 5 做" +} diff --git a/samples/p8-t5-历史图片/AppSet.cs b/samples/p8-t5-历史图片/AppSet.cs new file mode 100644 index 0000000..394d13f --- /dev/null +++ b/samples/p8-t5-历史图片/AppSet.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园 +{ + class AppSet + { + //串口设置 + public static string ADAM4017_COM = "COM2"; + public static string ADAM4150_COM = "COM3"; + public static string LED_COM = "COM5"; + public static string ZigBee_COM = "COM4"; + + //摄像机参数 + public static string Camera_Ip = "192.168.1.100"; + public static string Camera_Uid = "admin"; + public static string Camera_Pwd = ""; + + //数据库连接字符串 + public static string SqlConn = "Data Source=.;Initial Catalog=WisdomCampus;User ID=sa;Password=123"; + } +} diff --git a/samples/p8-t5-历史图片/Environment.Designer.cs b/samples/p8-t5-历史图片/Environment.Designer.cs new file mode 100644 index 0000000..856107d --- /dev/null +++ b/samples/p8-t5-历史图片/Environment.Designer.cs @@ -0,0 +1,555 @@ +namespace 智慧校园 +{ + partial class Environment + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Legend legend4 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panel_bg = new System.Windows.Forms.Panel(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panel_form = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.pic_lampOpen = new System.Windows.Forms.PictureBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.txt_autoLight = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.ch_autoLamp = new System.Windows.Forms.CheckBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.btn_ledEnvironment2 = new System.Windows.Forms.Button(); + this.ch_autoLedFire = new System.Windows.Forms.CheckBox(); + this.btn_ledSendMsg = new System.Windows.Forms.Button(); + this.txt_ledMsg = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.btn_dataAnalyse = new System.Windows.Forms.Button(); + this.btn_ledEnvironment1 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.txt_humidity = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txt_fire = new System.Windows.Forms.TextBox(); + this.txt_temperature = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txt_smoke = new System.Windows.Forms.TextBox(); + this.txt_light = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lb_return = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + this.panel_bg.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + this.panel_form.SuspendLayout(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).BeginInit(); + this.groupBox3.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1043, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(44, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(226, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.Controls.Add(this.panel_bg); + this.panel2.Controls.Add(this.panel3); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1043, 691); + this.panel2.TabIndex = 1; + // + // panel_bg + // + this.panel_bg.BackgroundImage = global::智慧校园.Properties.Resources.day_02; + this.panel_bg.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel_bg.Controls.Add(this.chart1); + this.panel_bg.Controls.Add(this.panel_form); + this.panel_bg.Controls.Add(this.panel5); + this.panel_bg.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_bg.Location = new System.Drawing.Point(0, 39); + this.panel_bg.Name = "panel_bg"; + this.panel_bg.Size = new System.Drawing.Size(1043, 652); + this.panel_bg.TabIndex = 1; + // + // chart1 + // + chartArea2.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea2); + legend3.Name = "MaxLegend"; + legend3.TitleForeColor = System.Drawing.Color.DimGray; + legend4.Name = "AVGLegend"; + legend4.TitleForeColor = System.Drawing.Color.DimGray; + this.chart1.Legends.Add(legend3); + this.chart1.Legends.Add(legend4); + this.chart1.Location = new System.Drawing.Point(44, 172); + this.chart1.Name = "chart1"; + series3.ChartArea = "ChartArea1"; + series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series3.Legend = "MaxLegend"; + series3.LegendText = "最大值"; + series3.Name = "MaxSeries"; + series3.XValueMember = "_Time"; + series3.YValueMembers = "MaxTemperature"; + series4.ChartArea = "ChartArea1"; + series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + series4.Legend = "AVGLegend"; + series4.LegendText = "平均值"; + series4.Name = "AVGSeries"; + series4.XValueMember = "_Time"; + series4.YValueMembers = "AVGTemperature"; + this.chart1.Series.Add(series3); + this.chart1.Series.Add(series4); + this.chart1.Size = new System.Drawing.Size(455, 327); + this.chart1.TabIndex = 3; + this.chart1.Text = "chart1"; + // + // panel_form + // + this.panel_form.BackColor = System.Drawing.Color.Transparent; + this.panel_form.BackgroundImage = global::智慧校园.Properties.Resources.bg_from2; + this.panel_form.Controls.Add(this.groupBox2); + this.panel_form.Controls.Add(this.groupBox3); + this.panel_form.Dock = System.Windows.Forms.DockStyle.Right; + this.panel_form.Location = new System.Drawing.Point(617, 0); + this.panel_form.Name = "panel_form"; + this.panel_form.Size = new System.Drawing.Size(426, 552); + this.panel_form.TabIndex = 2; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.pic_lampOpen); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.txt_autoLight); + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.ch_autoLamp); + this.groupBox2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox2.ForeColor = System.Drawing.Color.White; + this.groupBox2.Location = new System.Drawing.Point(22, 21); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(392, 150); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "路灯控制"; + // + // pic_lampOpen + // + this.pic_lampOpen.BackgroundImage = global::智慧校园.Properties.Resources.switch_off; + this.pic_lampOpen.Location = new System.Drawing.Point(103, 103); + this.pic_lampOpen.Name = "pic_lampOpen"; + this.pic_lampOpen.Size = new System.Drawing.Size(48, 24); + this.pic_lampOpen.TabIndex = 5; + this.pic_lampOpen.TabStop = false; + this.pic_lampOpen.Click += new System.EventHandler(this.pic_lampOpen_Click); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(33, 105); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(59, 17); + this.label10.TabIndex = 4; + this.label10.Text = "灯光控制:"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(278, 58); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(17, 17); + this.label9.TabIndex = 3; + this.label9.Text = "lx"; + // + // txt_autoLight + // + this.txt_autoLight.Location = new System.Drawing.Point(128, 55); + this.txt_autoLight.Name = "txt_autoLight"; + this.txt_autoLight.Size = new System.Drawing.Size(144, 23); + this.txt_autoLight.TabIndex = 2; + this.txt_autoLight.TextChanged += new System.EventHandler(this.txt_autoLight_TextChanged); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(33, 58); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(92, 17); + this.label7.TabIndex = 1; + this.label7.Text = "设定开灯光照值"; + // + // ch_autoLamp + // + this.ch_autoLamp.AutoSize = true; + this.ch_autoLamp.Location = new System.Drawing.Point(35, 30); + this.ch_autoLamp.Name = "ch_autoLamp"; + this.ch_autoLamp.Size = new System.Drawing.Size(75, 21); + this.ch_autoLamp.TabIndex = 0; + this.ch_autoLamp.Text = "自动控制"; + this.ch_autoLamp.UseVisualStyleBackColor = true; + this.ch_autoLamp.CheckedChanged += new System.EventHandler(this.ch_autoLamp_CheckedChanged); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.btn_ledEnvironment2); + this.groupBox3.Controls.Add(this.ch_autoLedFire); + this.groupBox3.Controls.Add(this.btn_ledSendMsg); + this.groupBox3.Controls.Add(this.txt_ledMsg); + this.groupBox3.Controls.Add(this.label8); + this.groupBox3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.groupBox3.ForeColor = System.Drawing.Color.White; + this.groupBox3.Location = new System.Drawing.Point(22, 209); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(392, 316); + this.groupBox3.TabIndex = 4; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "LED推送"; + // + // btn_ledEnvironment2 + // + this.btn_ledEnvironment2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment2.Location = new System.Drawing.Point(234, 217); + this.btn_ledEnvironment2.Name = "btn_ledEnvironment2"; + this.btn_ledEnvironment2.Size = new System.Drawing.Size(145, 32); + this.btn_ledEnvironment2.TabIndex = 11; + this.btn_ledEnvironment2.Text = "推送天气信息"; + this.btn_ledEnvironment2.UseVisualStyleBackColor = false; + this.btn_ledEnvironment2.Click += new System.EventHandler(this.btn_ledEnvironment2_Click); + // + // ch_autoLedFire + // + this.ch_autoLedFire.AutoSize = true; + this.ch_autoLedFire.Location = new System.Drawing.Point(265, 35); + this.ch_autoLedFire.Name = "ch_autoLedFire"; + this.ch_autoLedFire.Size = new System.Drawing.Size(99, 21); + this.ch_autoLedFire.TabIndex = 4; + this.ch_autoLedFire.Text = "自动推送火情"; + this.ch_autoLedFire.UseVisualStyleBackColor = true; + this.ch_autoLedFire.CheckedChanged += new System.EventHandler(this.ch_autoLedFire_CheckedChanged); + // + // btn_ledSendMsg + // + this.btn_ledSendMsg.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_ledSendMsg.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledSendMsg.Location = new System.Drawing.Point(26, 217); + this.btn_ledSendMsg.Name = "btn_ledSendMsg"; + this.btn_ledSendMsg.Size = new System.Drawing.Size(145, 32); + this.btn_ledSendMsg.TabIndex = 2; + this.btn_ledSendMsg.Text = "推送LED信息"; + this.btn_ledSendMsg.UseVisualStyleBackColor = false; + this.btn_ledSendMsg.Click += new System.EventHandler(this.btn_ledSendMsg_Click); + // + // txt_ledMsg + // + this.txt_ledMsg.Location = new System.Drawing.Point(23, 62); + this.txt_ledMsg.Multiline = true; + this.txt_ledMsg.Name = "txt_ledMsg"; + this.txt_ledMsg.Size = new System.Drawing.Size(356, 130); + this.txt_ledMsg.TabIndex = 1; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(20, 36); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(54, 17); + this.label8.TabIndex = 0; + this.label8.Text = "LED信息"; + // + // panel5 + // + this.panel5.Controls.Add(this.btn_dataAnalyse); + this.panel5.Controls.Add(this.btn_ledEnvironment1); + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.txt_humidity); + this.panel5.Controls.Add(this.label1); + this.panel5.Controls.Add(this.label5); + this.panel5.Controls.Add(this.txt_fire); + this.panel5.Controls.Add(this.txt_temperature); + this.panel5.Controls.Add(this.label2); + this.panel5.Controls.Add(this.label4); + this.panel5.Controls.Add(this.txt_smoke); + this.panel5.Controls.Add(this.txt_light); + this.panel5.Controls.Add(this.label3); + this.panel5.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel5.Location = new System.Drawing.Point(0, 552); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(1043, 100); + this.panel5.TabIndex = 1; + // + // btn_dataAnalyse + // + this.btn_dataAnalyse.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btn_dataAnalyse.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_dataAnalyse.Location = new System.Drawing.Point(792, 35); + this.btn_dataAnalyse.Name = "btn_dataAnalyse"; + this.btn_dataAnalyse.Size = new System.Drawing.Size(119, 32); + this.btn_dataAnalyse.TabIndex = 23; + this.btn_dataAnalyse.Text = "数据分析"; + this.btn_dataAnalyse.UseVisualStyleBackColor = false; + this.btn_dataAnalyse.Click += new System.EventHandler(this.btn_dataAnalyse_Click); + // + // btn_ledEnvironment1 + // + this.btn_ledEnvironment1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(86)))), ((int)(((byte)(149)))), ((int)(((byte)(212))))); + this.btn_ledEnvironment1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btn_ledEnvironment1.Location = new System.Drawing.Point(910, 35); + this.btn_ledEnvironment1.Name = "btn_ledEnvironment1"; + this.btn_ledEnvironment1.Size = new System.Drawing.Size(121, 32); + this.btn_ledEnvironment1.TabIndex = 15; + this.btn_ledEnvironment1.Text = "推送天气信息"; + this.btn_ledEnvironment1.UseVisualStyleBackColor = false; + this.btn_ledEnvironment1.Click += new System.EventHandler(this.btn_ledEnvironment1_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("微软雅黑", 18F); + this.label6.Location = new System.Drawing.Point(12, 31); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(110, 31); + this.label6.TabIndex = 11; + this.label6.Text = "环境数据"; + // + // txt_humidity + // + this.txt_humidity.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_humidity.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_humidity.Location = new System.Drawing.Point(716, 36); + this.txt_humidity.Name = "txt_humidity"; + this.txt_humidity.Size = new System.Drawing.Size(70, 32); + this.txt_humidity.TabIndex = 22; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label1.Location = new System.Drawing.Point(132, 38); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 25); + this.label1.TabIndex = 12; + this.label1.Text = "火焰"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label5.Location = new System.Drawing.Point(660, 39); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(50, 25); + this.label5.TabIndex = 21; + this.label5.Text = "湿度"; + // + // txt_fire + // + this.txt_fire.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_fire.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_fire.Location = new System.Drawing.Point(188, 35); + this.txt_fire.Name = "txt_fire"; + this.txt_fire.Size = new System.Drawing.Size(70, 32); + this.txt_fire.TabIndex = 13; + // + // txt_temperature + // + this.txt_temperature.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_temperature.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_temperature.Location = new System.Drawing.Point(584, 35); + this.txt_temperature.Name = "txt_temperature"; + this.txt_temperature.Size = new System.Drawing.Size(70, 32); + this.txt_temperature.TabIndex = 20; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label2.Location = new System.Drawing.Point(264, 36); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(50, 25); + this.label2.TabIndex = 14; + this.label2.Text = "烟雾"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label4.Location = new System.Drawing.Point(528, 38); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(50, 25); + this.label4.TabIndex = 19; + this.label4.Text = "温度"; + // + // txt_smoke + // + this.txt_smoke.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_smoke.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_smoke.Location = new System.Drawing.Point(320, 33); + this.txt_smoke.Name = "txt_smoke"; + this.txt_smoke.Size = new System.Drawing.Size(70, 32); + this.txt_smoke.TabIndex = 16; + // + // txt_light + // + this.txt_light.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(206)))), ((int)(((byte)(206)))), ((int)(((byte)(206))))); + this.txt_light.Font = new System.Drawing.Font("微软雅黑", 14F); + this.txt_light.Location = new System.Drawing.Point(452, 32); + this.txt_light.Name = "txt_light"; + this.txt_light.Size = new System.Drawing.Size(70, 32); + this.txt_light.TabIndex = 18; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 14F); + this.label3.Location = new System.Drawing.Point(396, 35); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(50, 25); + this.label3.TabIndex = 17; + this.label3.Text = "光照"; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel3.Controls.Add(this.lb_return); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(0, 0); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1043, 39); + this.panel3.TabIndex = 0; + this.panel3.Paint += new System.Windows.Forms.PaintEventHandler(this.panel3_Paint); + // + // lb_return + // + this.lb_return.AutoSize = true; + this.lb_return.Location = new System.Drawing.Point(25, 12); + this.lb_return.Name = "lb_return"; + this.lb_return.Size = new System.Drawing.Size(83, 12); + this.lb_return.TabIndex = 0; + this.lb_return.Text = "< 返回主窗体"; + this.lb_return.Click += new System.EventHandler(this.lb_return_Click); + // + // Environment + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1043, 791); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Environment"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Environment"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Environment_FormClosed); + this.Load += new System.EventHandler(this.Environment_Load); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel_bg.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.panel_form.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_lampOpen)).EndInit(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lb_return; + private System.Windows.Forms.Panel panel_bg; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel_form; + private System.Windows.Forms.Button btn_dataAnalyse; + private System.Windows.Forms.Button btn_ledEnvironment1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txt_humidity; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txt_fire; + private System.Windows.Forms.TextBox txt_temperature; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txt_smoke; + private System.Windows.Forms.TextBox txt_light; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.PictureBox pic_lampOpen; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox txt_autoLight; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox ch_autoLamp; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button btn_ledEnvironment2; + private System.Windows.Forms.CheckBox ch_autoLedFire; + private System.Windows.Forms.Button btn_ledSendMsg; + private System.Windows.Forms.TextBox txt_ledMsg; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + } +} \ No newline at end of file diff --git a/samples/p8-t5-历史图片/Environment.cs b/samples/p8-t5-历史图片/Environment.cs new file mode 100644 index 0000000..c136074 --- /dev/null +++ b/samples/p8-t5-历史图片/Environment.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +using DeviceCtrlLibrary.Model; +using 智慧校园.SQLHelpers; +using System.Threading; + +namespace 智慧校园 +{ + public partial class Environment : Form + { + public Environment() + { + InitializeComponent(); + } + //用于各类耗时长的操作(SQL、数据采集、设备控制等) + Thread thread; + //用于异步通行 + SynchronizationContext _main; + //结果模型 + ADAM4017ResModel ResModel_4017; + ADAM4150ResModel ResModel_4150; + //设置自动控制路灯的光照值 + double environmentLight, setLight; + //按钮状态标志 + bool IsAuto_Lamp = false; + bool IsAuto_FireMsg = false; + bool IsLampOpen = false; + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void lb_return_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void Environment_Load(object sender, EventArgs e) + { + try + { + + //隐藏曲线图 + chart1.Visible = false; + thread = new Thread(new ThreadStart(Tick)); + _main = WindowsFormsSynchronizationContext.Current; + thread.Start(); + } + catch + { + } + + } + private void Tick() + { + try + { + while (true) + { + //数据采集 + ResModel_4017 = DeviceCtrlHelper.adam4017Helper.SetData(); + Thread.Sleep(500); + ResModel_4150 = DeviceCtrlHelper.adam4150Helper.SetData(); + + //UI显示数据 + + _main.Send(_ => + { + try //防止无数据出错 + { + txt_fire.Text = (ResModel_4150.fireValue ? "发生火情" : "正常"); + txt_smoke.Text = (ResModel_4150.smokeValue ? "发生烟情" : "正常"); + txt_light.Text = ResModel_4017.lightValue; + txt_temperature.Text = ResModel_4017.temperatureValue; + txt_humidity.Text = ResModel_4017.humidityValue; + } + catch { } + }, null); + + //自动路灯控制 + double.TryParse(ResModel_4017.lightValue, out environmentLight); + if (IsAuto_Lamp && environmentLight < setLight) + { + LampOnOff(1, true); + } + else if (IsAuto_Lamp && !(environmentLight < setLight)) + { + LampOnOff(1, false); + } + + //自动推送火情LED信息控制 + if (IsAuto_FireMsg) + { + if (ResModel_4150.fireValue && ResModel_4150.smokeValue) + DeviceCtrlHelper.ledHelper.SendLedString("发生严重火灾 "); + else if (ResModel_4150.fireValue) + DeviceCtrlHelper.ledHelper.SendLedString("发现火情 "); + else if (ResModel_4150.smokeValue) + DeviceCtrlHelper.ledHelper.SendLedString("发现烟情 "); + } + + //执行数据上传 + SQLBLL.EnvironmentUpData(ResModel_4150.fireValue, ResModel_4150.smokeValue, ResModel_4017.lightValue, ResModel_4017.temperatureValue, ResModel_4017.humidityValue); + + Thread.Sleep(5000); + } + } + catch + { + } + } + private void LampOnOff(int RelayNum, bool IsOpen) + { + try + { + //开启路灯 + DeviceCtrlHelper.zigBeeHelper.OnOff(RelayNum, IsOpen); + + //切换UI背景 + _main.Send(_ => + { + if (IsOpen) + { + pic_lampOpen.BackgroundImage = Properties.Resources.switch_on; + panel_bg.BackgroundImage = Properties.Resources.day_01; + } + else + { + panel_bg.BackgroundImage = Properties.Resources.day_02; + pic_lampOpen.BackgroundImage = Properties.Resources.switch_off; + } + }, null); + } + catch + { + } + } + + private void Environment_FormClosed(object sender, FormClosedEventArgs e) + { + try + { + thread.Suspend(); + thread = null; + + } + catch + { + } + + + } + + private void btn_dataAnalyse_Click(object sender, EventArgs e) + { + try + { + if (btn_dataAnalyse.Text.Equals("数据分析")) + { + //绑定图标数据 + chart1.DataSource = SQLBLL.GetEnvironmentGraphData(); + //更新图标数据 + chart1.DataBind(); + chart1.Visible = true; + btn_dataAnalyse.Text = "关闭图表"; + } + else if (btn_dataAnalyse.Text.Equals("关闭图表")) + { + chart1.Visible = false; + btn_dataAnalyse.Text = "数据分析"; + } + } + catch + { + } + + } + + private void pic_lampOpen_Click(object sender, EventArgs e) + { + //手动路灯控制 + try + { + if (!IsLampOpen) + { + LampOnOff(1, true); + + } + else + { + LampOnOff(1, false); + + } + + IsLampOpen = !IsLampOpen; + } + catch + { + } + } + + private void btn_ledEnvironment1_Click(object sender, EventArgs e) + { + try + { + //推送LED天气信息 + if (ResModel_4017 != null && ResModel_4150 != null) + DeviceCtrlHelper.ledHelper.SendLedString("当前温度:" + ResModel_4017.temperatureValue + "℃ 湿度:" + ResModel_4017.humidityValue + "%"); + } + catch + { + } + } + + private void btn_ledEnvironment2_Click(object sender, EventArgs e) + { + try + { + //推送LED天气信息 + if (ResModel_4017 != null && ResModel_4150 != null) + DeviceCtrlHelper.ledHelper.SendLedString("当前温度:" + ResModel_4017.temperatureValue + "℃ 湿度:" + ResModel_4017.humidityValue + "%"); + } + catch + { + } + } + + private void panel3_Paint(object sender, PaintEventArgs e) + { + + } + + private void txt_autoLight_TextChanged(object sender, EventArgs e) + { + try + { + //获取光照比较值 + double.TryParse(txt_autoLight.Text,out setLight); + + } + + catch + { + } + } + + private void btn_ledSendMsg_Click(object sender, EventArgs e) + { + try + { + //推送LED信息 + DeviceCtrlHelper.ledHelper.SendLedString(txt_ledMsg.Text); + } + catch + { + } + } + + private void ch_autoLamp_CheckedChanged(object sender, EventArgs e) + { + //自动控制路灯 + IsAuto_Lamp = ch_autoLamp.Checked; + } + + private void ch_autoLedFire_CheckedChanged(object sender, EventArgs e) + { + //自动推送火情 + IsAuto_FireMsg = ch_autoLedFire.Checked; + } + } +} diff --git a/samples/p8-t5-历史图片/Main.Designer.cs b/samples/p8-t5-历史图片/Main.Designer.cs new file mode 100644 index 0000000..dc4cf19 --- /dev/null +++ b/samples/p8-t5-历史图片/Main.Designer.cs @@ -0,0 +1,145 @@ +namespace 智慧校园 +{ + partial class Main + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.pic_exit = new System.Windows.Forms.PictureBox(); + this.pic_security = new System.Windows.Forms.PictureBox(); + this.pic_environment = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(147)))), ((int)(((byte)(237))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1018, 100); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(57, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(197, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel2 + // + this.panel2.BackgroundImage = global::智慧校园.Properties.Resources.bg_home; + this.panel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel2.Controls.Add(this.pic_exit); + this.panel2.Controls.Add(this.pic_security); + this.panel2.Controls.Add(this.pic_environment); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 100); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1018, 516); + this.panel2.TabIndex = 1; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // pic_exit + // + this.pic_exit.BackColor = System.Drawing.Color.Transparent; + this.pic_exit.Image = global::智慧校园.Properties.Resources.icon_04; + this.pic_exit.Location = new System.Drawing.Point(660, 124); + this.pic_exit.Name = "pic_exit"; + this.pic_exit.Size = new System.Drawing.Size(180, 210); + this.pic_exit.TabIndex = 6; + this.pic_exit.TabStop = false; + this.pic_exit.Click += new System.EventHandler(this.pic_exit_Click); + // + // pic_security + // + this.pic_security.BackColor = System.Drawing.Color.Transparent; + this.pic_security.Image = global::智慧校园.Properties.Resources.icon_03; + this.pic_security.Location = new System.Drawing.Point(404, 124); + this.pic_security.Name = "pic_security"; + this.pic_security.Size = new System.Drawing.Size(180, 210); + this.pic_security.TabIndex = 5; + this.pic_security.TabStop = false; + this.pic_security.Click += new System.EventHandler(this.pic_security_Click); + // + // pic_environment + // + this.pic_environment.BackColor = System.Drawing.Color.Transparent; + this.pic_environment.Image = global::智慧校园.Properties.Resources.icon_02; + this.pic_environment.Location = new System.Drawing.Point(133, 124); + this.pic_environment.Name = "pic_environment"; + this.pic_environment.Size = new System.Drawing.Size(180, 210); + this.pic_environment.TabIndex = 4; + this.pic_environment.TabStop = false; + this.pic_environment.Click += new System.EventHandler(this.pic_environment_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1018, 616); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Main_Load); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_exit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_security)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_environment)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_exit; + private System.Windows.Forms.PictureBox pic_security; + private System.Windows.Forms.PictureBox pic_environment; + } +} + diff --git a/samples/p8-t5-历史图片/Main.cs b/samples/p8-t5-历史图片/Main.cs new file mode 100644 index 0000000..075f2c6 --- /dev/null +++ b/samples/p8-t5-历史图片/Main.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +namespace 智慧校园 +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void pic_environment_Click(object sender, EventArgs e) + { + try + { + new Environment().Show(); + + } + catch + { + } + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { + + } + + private void Main_Load(object sender, EventArgs e) + { + try + { + //实例化工具类 + DeviceCtrlHelper.adam4017Helper.Open(AppSet.ADAM4017_COM); + DeviceCtrlHelper.adam4150Helper.Open(AppSet.ADAM4150_COM); + DeviceCtrlHelper.zigBeeHelper.Open(AppSet.ZigBee_COM); + DeviceCtrlHelper.ledHelper.OpenLedCom(AppSet.LED_COM); + } + catch { } + } + + private void pic_security_Click(object sender, EventArgs e) + { + try + { + new Security().Show(); + + } + catch + { + } + } + + private void pic_exit_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t5-历史图片/Program.cs b/samples/p8-t5-历史图片/Program.cs new file mode 100644 index 0000000..2fd691b --- /dev/null +++ b/samples/p8-t5-历史图片/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace 智慧校园 +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + } +} diff --git a/samples/p8-t5-历史图片/Properties/Resources.Designer.cs b/samples/p8-t5-历史图片/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0ed5c14 --- /dev/null +++ b/samples/p8-t5-历史图片/Properties/Resources.Designer.cs @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------ +// +// 项目资源(平台素材库)。在"项目资源"里添加或移除,不要手动修改这个文件。 +// +//------------------------------------------------------------------------------ + +namespace 智慧校园.Properties { + + /// + /// 项目资源:Properties.Resources.资源名 + /// + internal class Resources { + + /// 标题:智慧校园 + internal static System.Drawing.Bitmap ico_title { + get { return global::Sim.Host.ProjectResources.Image("ico_title.png"); } + } + + /// 主界面背景:校园 + internal static System.Drawing.Bitmap bg_home { + get { return global::Sim.Host.ProjectResources.Image("bg_home.png"); } + } + + /// 图标:校园环境 + internal static System.Drawing.Bitmap icon_02 { + get { return global::Sim.Host.ProjectResources.Image("icon_02.png"); } + } + + /// 图标:校园安防 + internal static System.Drawing.Bitmap icon_03 { + get { return global::Sim.Host.ProjectResources.Image("icon_03.png"); } + } + + /// 图标:退出 + internal static System.Drawing.Bitmap icon_04 { + get { return global::Sim.Host.ProjectResources.Image("icon_04.png"); } + } + + /// 路灯场景:亮灯 + internal static System.Drawing.Bitmap day_01 { + get { return global::Sim.Host.ProjectResources.Image("day_01.png"); } + } + + /// 路灯场景:灭灯 + internal static System.Drawing.Bitmap day_02 { + get { return global::Sim.Host.ProjectResources.Image("day_02.png"); } + } + + /// 面板背景(窄) + internal static System.Drawing.Bitmap bg_from2 { + get { return global::Sim.Host.ProjectResources.Image("bg_from2.png"); } + } + + /// 开关:开 + internal static System.Drawing.Bitmap switch_on { + get { return global::Sim.Host.ProjectResources.Image("switch_on.png"); } + } + + /// 开关:关 + internal static System.Drawing.Bitmap switch_off { + get { return global::Sim.Host.ProjectResources.Image("switch_off.png"); } + } + + /// 监控:无画面 + internal static System.Drawing.Bitmap icon_monitor { + get { return global::Sim.Host.ProjectResources.Image("icon_monitor.png"); } + } + + /// 监控:方向盘底座 + internal static System.Drawing.Bitmap panel_video_ctrl { + get { return global::Sim.Host.ProjectResources.Image("panel_video_ctrl.png"); } + } + + /// 方向键:上 + internal static System.Drawing.Bitmap btn_arrow_up_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_up_normal.png"); } + } + + /// 方向键:上(按下) + internal static System.Drawing.Bitmap btn_arrow_up_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_up_press.png"); } + } + + /// 方向键:下 + internal static System.Drawing.Bitmap btn_arrow_down_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_down_normal.png"); } + } + + /// 方向键:下(按下) + internal static System.Drawing.Bitmap btn_arrow_down_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_down_press.png"); } + } + + /// 方向键:左 + internal static System.Drawing.Bitmap btn_arrow_left_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_left_normal.png"); } + } + + /// 方向键:左(按下) + internal static System.Drawing.Bitmap btn_arrow_left_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_left_press.png"); } + } + + /// 方向键:右 + internal static System.Drawing.Bitmap btn_arrow_right_normal { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_right_normal.png"); } + } + + /// 方向键:右(按下) + internal static System.Drawing.Bitmap btn_arrow_right_press { + get { return global::Sim.Host.ProjectResources.Image("btn_arrow_right_press.png"); } + } + + /// 翻页:上一张 + internal static System.Drawing.Bitmap arrow_left_normal { + get { return global::Sim.Host.ProjectResources.Image("arrow_left_normal.png"); } + } + + /// 翻页:下一张 + internal static System.Drawing.Bitmap arrow_right_normal { + get { return global::Sim.Host.ProjectResources.Image("arrow_right_normal.png"); } + } + + /// 关闭按钮 + internal static System.Drawing.Bitmap windowstate_closed_hover { + get { return global::Sim.Host.ProjectResources.Image("windowstate_closed_hover.png"); } + } + } +} diff --git a/samples/p8-t5-历史图片/SQLHelpers/SQLBLL.cs b/samples/p8-t5-历史图片/SQLHelpers/SQLBLL.cs new file mode 100644 index 0000000..c737537 --- /dev/null +++ b/samples/p8-t5-历史图片/SQLHelpers/SQLBLL.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园.SQLHelpers +{ + class SQLBLL + { + + public static SQLRes SecurityUpData(Image img)//把图片保存到数据库 + { + SQLRes sqlRes = new SQLRes(); + byte[] imgByte = null; + + using (MemoryStream ms = new MemoryStream())//图片转换为二进制数组 + { + img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); + imgByte = new byte[ms.Length]; + imgByte = ms.ToArray(); + } + + string sqlStr = "INSERT INTO SecurityData (EvenTime,EvenImage) VALUES (@time,@img)"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time", DateTime.Now.ToString()), new SqlParameter("img", imgByte) }; + + if (SQLHelper.Exec(sqlStr, sqlParameter) >= 1) + { + sqlRes.Result = true; + sqlRes.Msg = "成功!"; + } + else + { + sqlRes.Result = false; + sqlRes.Msg = "失败!"; + } + + return sqlRes; + } + + public static Dictionary GetSecurityData(DateTime startDate, DateTime endDate) + { + Dictionary ImgDictionary = new Dictionary(); + + if (string.IsNullOrWhiteSpace(startDate.Month.ToString()) && string.IsNullOrWhiteSpace(endDate.Month .ToString())) + { + return ImgDictionary; + } + //选择查询日期日期 + string sql = "SELECT * FROM SecurityData WHERE EvenTime between @time_start and @time_end"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time_start", startDate.Year + "/" + startDate.Month + "/" + startDate.Day), new SqlParameter("time_end", endDate.Year + "/" + endDate.Month + "/" + endDate.Day+" 23:59:59" )}; + + DataSet ds = SQLHelper.getData(sql, sqlParameter); + + for (int i = 0; i < ds.Tables[0].Rows.Count; i++) + { + ImgDictionary.Add(ds.Tables[0].Rows[i]["EvenTime"].ToString(), Image.FromStream(new MemoryStream((byte[])ds.Tables[0].Rows[i]["EvenImage"]))); + } + + return ImgDictionary; + } + + public static SQLRes EnvironmentUpData(bool fire, bool smoke, string light, string temperature, string humidity) + { + + SQLRes sqlRes = new SQLRes(); + + string sqlStr = "INSERT INTO EnvironmentData (Fire ,Smoke ,Temperature ,Humidity , Light, _Time) VALUES (@fire,@smoke,@temperature,@humidity,@light,@time)"; + SqlParameter[] sqlParameter = new SqlParameter[] { new SqlParameter("time", DateTime.Now.ToString()), new SqlParameter("fire", fire), new SqlParameter("smoke", smoke), new SqlParameter("temperature", temperature), new SqlParameter("humidity", humidity), new SqlParameter("light", light) }; + + if (SQLHelper.Exec(sqlStr, sqlParameter) >= 1) + { + sqlRes.Result = true; + sqlRes.Msg = "成功!"; + } + else + { + sqlRes.Result = false; + sqlRes.Msg = "失败!"; + } + + return sqlRes; + + } + + public static DataTable GetEnvironmentGraphData() + { + string sqlStr = "SELECT TOP 7 CONVERT(varchar(10),_Time,120) AS _Time, ROUND(Max(Temperature),2) AS MaxTemperature, ROUND(AVG(Temperature),2) AS AVGTemperature FROM EnvironmentData GROUP BY CONVERT(varchar(10),_Time,120) ORDER BY CONVERT(varchar(10),_Time,120) DESC "; + return SQLHelper.getData(sqlStr, null).Tables[0]; + } + + + } + + class SQLRes + { + public string Msg { get; set; } + public bool Result { get; set; } + } + + } + diff --git a/samples/p8-t5-历史图片/SQLHelpers/SQLHelper.cs b/samples/p8-t5-历史图片/SQLHelpers/SQLHelper.cs new file mode 100644 index 0000000..d37157e --- /dev/null +++ b/samples/p8-t5-历史图片/SQLHelpers/SQLHelper.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 智慧校园.SQLHelpers +{ + class SQLHelper + { + public static string strConn = AppSet.SqlConn; + + public static bool SaveData(string sql, DataTable dt) + { + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlDataAdapter sda = new SqlDataAdapter(sql, conn); + SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(sda); + sda.Update(dt); + conn.Close(); + return true; + } + catch (Exception e) + { + string Error = e.Message; + return false; + } + } + + public static DataSet getData(string sql, params SqlParameter[] para) + { + DataSet ds = new DataSet(); + + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlCommand cmd = new SqlCommand(sql, conn); + if (para != null) + { + foreach (SqlParameter item in para) + { + cmd.Parameters.Add(item); + } + } + SqlDataAdapter sda = new SqlDataAdapter(cmd); + sda.Fill(ds); + cmd.Parameters.Clear(); + conn.Close(); + } + catch(Exception e) + { + string Error = e.Message; + } + + return ds; + } + + public static DataSet getData(SqlCommand cmd) + { + DataSet ds = new DataSet(); + + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + cmd.Connection = conn; + + SqlDataAdapter sda = new SqlDataAdapter(cmd); + sda.Fill(ds); + cmd.Parameters.Clear(); + conn.Close(); + } + catch (Exception e) + { + string Error = e.Message; + } + + return ds; + } + + public static int Exec(string sql, params SqlParameter[] para) + { + try + { + SqlConnection conn = new SqlConnection(strConn); + conn.Open(); + SqlCommand cmd = new SqlCommand(sql, conn); + if (para != null) + { + foreach (SqlParameter item in para) + { + cmd.Parameters.Add(item); + } + } + int iRsult = cmd.ExecuteNonQuery(); + conn.Close(); + return iRsult; + } + catch (Exception e) + { + string Error = e.Message; + return -1; + } + } + } + } + diff --git a/samples/p8-t5-历史图片/Security.Designer.cs b/samples/p8-t5-历史图片/Security.Designer.cs new file mode 100644 index 0000000..97c6b9c --- /dev/null +++ b/samples/p8-t5-历史图片/Security.Designer.cs @@ -0,0 +1,297 @@ +namespace 智慧校园 +{ + partial class Security + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel3 = new System.Windows.Forms.Panel(); + this.lb_return = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel_bg_video = new System.Windows.Forms.Panel(); + this.btn_history = new System.Windows.Forms.Button(); + this.btn_camera = new System.Windows.Forms.Button(); + this.panel_video_ctrl = new System.Windows.Forms.Panel(); + this.pic_left = new System.Windows.Forms.PictureBox(); + this.pic_right = new System.Windows.Forms.PictureBox(); + this.pic_down = new System.Windows.Forms.PictureBox(); + this.pic_up = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.lb_infrared = new System.Windows.Forms.Label(); + this.pic_video = new System.Windows.Forms.PictureBox(); + this.panel3.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel_bg_video.SuspendLayout(); + this.panel_video_ctrl.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_left)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_right)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_down)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_up)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_video)).BeginInit(); + this.SuspendLayout(); + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel3.Controls.Add(this.lb_return); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(0, 100); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1081, 39); + this.panel3.TabIndex = 1; + // + // lb_return + // + this.lb_return.AutoSize = true; + this.lb_return.Location = new System.Drawing.Point(25, 12); + this.lb_return.Name = "lb_return"; + this.lb_return.Size = new System.Drawing.Size(83, 12); + this.lb_return.TabIndex = 0; + this.lb_return.Text = "< 返回主窗体"; + this.lb_return.Click += new System.EventHandler(this.lb_return_Click); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1081, 100); + this.panel1.TabIndex = 2; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + // + // pictureBox1 + // + this.pictureBox1.Image = global::智慧校园.Properties.Resources.ico_title; + this.pictureBox1.Location = new System.Drawing.Point(44, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(226, 54); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // panel_bg_video + // + this.panel_bg_video.BackColor = System.Drawing.Color.White; + this.panel_bg_video.Controls.Add(this.btn_history); + this.panel_bg_video.Controls.Add(this.btn_camera); + this.panel_bg_video.Controls.Add(this.panel_video_ctrl); + this.panel_bg_video.Controls.Add(this.panel2); + this.panel_bg_video.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_bg_video.Location = new System.Drawing.Point(0, 139); + this.panel_bg_video.Name = "panel_bg_video"; + this.panel_bg_video.Size = new System.Drawing.Size(1081, 499); + this.panel_bg_video.TabIndex = 3; + this.panel_bg_video.Paint += new System.Windows.Forms.PaintEventHandler(this.panel_bg_video_Paint); + // + // btn_history + // + this.btn_history.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(143)))), ((int)(((byte)(213)))), ((int)(((byte)(122))))); + this.btn_history.Font = new System.Drawing.Font("微软雅黑", 14F); + this.btn_history.Location = new System.Drawing.Point(804, 410); + this.btn_history.Name = "btn_history"; + this.btn_history.Size = new System.Drawing.Size(160, 49); + this.btn_history.TabIndex = 10; + this.btn_history.Text = "查看历史图像"; + this.btn_history.UseVisualStyleBackColor = false; + this.btn_history.Click += new System.EventHandler(this.btn_history_Click); + // + // btn_camera + // + this.btn_camera.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(200)))), ((int)(((byte)(81))))); + this.btn_camera.Font = new System.Drawing.Font("微软雅黑", 16F); + this.btn_camera.Location = new System.Drawing.Point(804, 326); + this.btn_camera.Name = "btn_camera"; + this.btn_camera.Size = new System.Drawing.Size(160, 49); + this.btn_camera.TabIndex = 9; + this.btn_camera.Text = "拍照"; + this.btn_camera.UseVisualStyleBackColor = false; + this.btn_camera.Click += new System.EventHandler(this.btn_camera_Click); + // + // panel_video_ctrl + // + this.panel_video_ctrl.BackgroundImage = global::智慧校园.Properties.Resources.panel_video_ctrl; + this.panel_video_ctrl.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel_video_ctrl.Controls.Add(this.pic_left); + this.panel_video_ctrl.Controls.Add(this.pic_right); + this.panel_video_ctrl.Controls.Add(this.pic_down); + this.panel_video_ctrl.Controls.Add(this.pic_up); + this.panel_video_ctrl.Location = new System.Drawing.Point(741, 15); + this.panel_video_ctrl.Name = "panel_video_ctrl"; + this.panel_video_ctrl.Size = new System.Drawing.Size(328, 294); + this.panel_video_ctrl.TabIndex = 1; + // + // pic_left + // + this.pic_left.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_left_normal; + this.pic_left.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_left.Location = new System.Drawing.Point(63, 116); + this.pic_left.Name = "pic_left"; + this.pic_left.Size = new System.Drawing.Size(39, 54); + this.pic_left.TabIndex = 6; + this.pic_left.TabStop = false; + this.pic_left.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_left_MouseDown); + this.pic_left.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_left_MouseUp); + // + // pic_right + // + this.pic_right.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_right_normal; + this.pic_right.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_right.Location = new System.Drawing.Point(223, 116); + this.pic_right.Name = "pic_right"; + this.pic_right.Size = new System.Drawing.Size(39, 54); + this.pic_right.TabIndex = 5; + this.pic_right.TabStop = false; + this.pic_right.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_right_MouseDown); + this.pic_right.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_right_MouseUp); + // + // pic_down + // + this.pic_down.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_down_normal; + this.pic_down.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_down.Location = new System.Drawing.Point(143, 202); + this.pic_down.Name = "pic_down"; + this.pic_down.Size = new System.Drawing.Size(39, 54); + this.pic_down.TabIndex = 4; + this.pic_down.TabStop = false; + this.pic_down.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_down_MouseDown); + this.pic_down.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_down_MouseUp); + // + // pic_up + // + this.pic_up.BackgroundImage = global::智慧校园.Properties.Resources.btn_arrow_up_normal; + this.pic_up.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pic_up.Location = new System.Drawing.Point(142, 20); + this.pic_up.Name = "pic_up"; + this.pic_up.Size = new System.Drawing.Size(39, 54); + this.pic_up.TabIndex = 1; + this.pic_up.TabStop = false; + this.pic_up.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_up_MouseDown); + this.pic_up.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_up_MouseUp); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.DimGray; + this.panel2.Controls.Add(this.label2); + this.panel2.Controls.Add(this.lb_infrared); + this.panel2.Controls.Add(this.pic_video); + this.panel2.Location = new System.Drawing.Point(69, 15); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(666, 472); + this.panel2.TabIndex = 0; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(545, 91); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(46, 21); + this.label2.TabIndex = 12; + this.label2.Text = "入侵:"; + // + // lb_infrared + // + this.lb_infrared.AutoSize = true; + this.lb_infrared.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lb_infrared.ForeColor = System.Drawing.Color.White; + this.lb_infrared.Location = new System.Drawing.Point(597, 91); + this.lb_infrared.Name = "lb_infrared"; + this.lb_infrared.Size = new System.Drawing.Size(41, 21); + this.lb_infrared.TabIndex = 11; + this.lb_infrared.Text = "N/A"; + // + // pic_video + // + this.pic_video.BackColor = System.Drawing.Color.DarkGray; + this.pic_video.BackgroundImage = global::智慧校园.Properties.Resources.icon_monitor; + this.pic_video.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pic_video.Location = new System.Drawing.Point(32, 38); + this.pic_video.Name = "pic_video"; + this.pic_video.Size = new System.Drawing.Size(478, 322); + this.pic_video.TabIndex = 0; + this.pic_video.TabStop = false; + this.pic_video.Click += new System.EventHandler(this.pictureBox2_Click); + // + // Security + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1081, 638); + this.Controls.Add(this.panel_bg_video); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Security"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Security"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Security_FormClosed); + this.Load += new System.EventHandler(this.Security_Load); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel_bg_video.ResumeLayout(false); + this.panel_video_ctrl.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic_left)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_right)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_down)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_up)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_video)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lb_return; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel panel_bg_video; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.PictureBox pic_video; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lb_infrared; + private System.Windows.Forms.Button btn_history; + private System.Windows.Forms.Button btn_camera; + private System.Windows.Forms.Panel panel_video_ctrl; + private System.Windows.Forms.PictureBox pic_left; + private System.Windows.Forms.PictureBox pic_right; + private System.Windows.Forms.PictureBox pic_down; + private System.Windows.Forms.PictureBox pic_up; + } +} \ No newline at end of file diff --git a/samples/p8-t5-历史图片/Security.cs b/samples/p8-t5-历史图片/Security.cs new file mode 100644 index 0000000..f3c083a --- /dev/null +++ b/samples/p8-t5-历史图片/Security.cs @@ -0,0 +1,252 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; +using System.Threading; + +using DeviceCtrlLibrary; +using 智慧校园.SQLHelpers; + +namespace 智慧校园 +{ + public partial class Security : Form + { //显示图像 + Image img = null; + //入侵标识 + bool IsInfrared = false; + //图像文件夹路径 + string ImgDir = AppDomain.CurrentDomain.BaseDirectory + "Camera\\"; + //用于数据采集和SQL操作 + Thread thread; + SynchronizationContext _main; + public Security() + { + InitializeComponent(); + } + void ipCameraHelper_ImageRead(ImageReadEvenArgs e) + { + img = e.img; + pic_video.Image = e.img; + } + void tick() + { + try + { + while (true) + { + try + { + //采集入侵状态 + IsInfrared = DeviceCtrlHelper.adam4150Helper.SetData().infraredValue; + //UI显示入侵状态 + _main.Send(_ => + { + lb_infrared.Text = IsInfrared ? "发现入侵" : "正常"; + }, null); + + if (IsInfrared) + { + if (img != null) + //上传报警信息 + SQLBLL.SecurityUpData(img); + } + } + catch + { + } + + Thread.Sleep(1000); + } + } + catch + { + } + } + private void pictureBox2_Click(object sender, EventArgs e) + { + + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void panel_bg_video_Paint(object sender, PaintEventArgs e) + { + + } + + private void Security_Load(object sender, EventArgs e) + { + try + { + + + //实例化摄像头控制类 + DeviceCtrlHelper.ipCameraHelper.Open(AppSet.Camera_Ip, AppSet.Camera_Uid, AppSet.Camera_Pwd); + DeviceCtrlHelper.ipCameraHelper.ImageRead += ipCameraHelper_ImageRead; + DeviceCtrlHelper.ipCameraHelper.Start(); + + thread = new Thread(new ThreadStart(tick)); + _main = WindowsFormsSynchronizationContext.Current; + thread.Start(); + + if (!Directory.Exists(ImgDir)) + //创建文件夹 + Directory.CreateDirectory(ImgDir); + } + catch + { + } + } + + private void Security_FormClosed(object sender, FormClosedEventArgs e) + { + try + { + DeviceCtrlHelper.ipCameraHelper.Stop(); + DeviceCtrlHelper.ipCameraHelper.Close(); + thread.Suspend(); + thread = null; + + } + catch + { + } + + } + + private void btn_camera_Click(object sender, EventArgs e) + { + try + { + pic_video.Image.Save(ImgDir + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".jpg"); + SQLBLL.SecurityUpData(pic_video.Image); + } + catch + { + } + + } + + private void btn_history_Click(object sender, EventArgs e) + { + try + { + new SecurityCameraData().ShowDialog(); + } + catch + { + } + + } + + private void pic_up_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_up.BackgroundImage = Properties.Resources.btn_arrow_up_press; + DeviceCtrlHelper.ipCameraHelper.PanUp(); + } + catch + { + } + } + + private void pic_up_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_up.BackgroundImage = Properties.Resources.btn_arrow_up_normal; + DeviceCtrlHelper.ipCameraHelper.PanUp(); + } + catch + { + } + } + + private void pic_down_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_down.BackgroundImage = Properties.Resources.btn_arrow_down_press; + DeviceCtrlHelper.ipCameraHelper.PanDown(); + } + catch + { + } + } + + private void pic_down_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_down.BackgroundImage = Properties.Resources.btn_arrow_down_normal; + DeviceCtrlHelper.ipCameraHelper.PanDown(); + } + catch + { + } + } + + private void pic_left_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_left.BackgroundImage = Properties.Resources.btn_arrow_left_press; + DeviceCtrlHelper.ipCameraHelper.PanLeft(); + } + catch + { + } + } + + private void pic_left_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_left.BackgroundImage = Properties.Resources.btn_arrow_left_normal; + DeviceCtrlHelper.ipCameraHelper.PanLeft(); + } + catch + { + } + } + + private void pic_right_MouseDown(object sender, MouseEventArgs e) + { + try + { + pic_right.BackgroundImage = Properties.Resources.btn_arrow_right_press; + DeviceCtrlHelper.ipCameraHelper.PanRight(); + } + catch + { + } + } + + private void pic_right_MouseUp(object sender, MouseEventArgs e) + { + try + { + pic_right.BackgroundImage = Properties.Resources.btn_arrow_right_normal; + DeviceCtrlHelper.ipCameraHelper.PanRight(); + } + catch + { + } + } + + private void lb_return_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/samples/p8-t5-历史图片/SecurityCameraData.Designer.cs b/samples/p8-t5-历史图片/SecurityCameraData.Designer.cs new file mode 100644 index 0000000..dda0f9c --- /dev/null +++ b/samples/p8-t5-历史图片/SecurityCameraData.Designer.cs @@ -0,0 +1,246 @@ +namespace 智慧校园 +{ + partial class SecurityCameraData + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.pic_close = new System.Windows.Forms.PictureBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel_toolBar = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.dateTimePicker2 = new System.Windows.Forms.DateTimePicker(); + this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker(); + this.btn_get = new System.Windows.Forms.Button(); + this.lb_noData = new System.Windows.Forms.Label(); + this.lb_time = new System.Windows.Forms.Label(); + this.pic_down = new System.Windows.Forms.PictureBox(); + this.pic_up = new System.Windows.Forms.PictureBox(); + this.pic_camera = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_close)).BeginInit(); + this.panel_toolBar.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_down)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_up)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_camera)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(116)))), ((int)(((byte)(133))))); + this.panel1.Controls.Add(this.pic_close); + this.panel1.Controls.Add(this.label1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(835, 53); + this.panel1.TabIndex = 0; + // + // pic_close + // + this.pic_close.BackgroundImage = global::智慧校园.Properties.Resources.windowstate_closed_hover; + this.pic_close.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pic_close.Location = new System.Drawing.Point(789, 6); + this.pic_close.Name = "pic_close"; + this.pic_close.Size = new System.Drawing.Size(36, 42); + this.pic_close.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pic_close.TabIndex = 1; + this.pic_close.TabStop = false; + this.pic_close.Click += new System.EventHandler(this.pictureBox1_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(12, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(129, 20); + this.label1.TabIndex = 0; + this.label1.Text = "历史报警记录"; + // + // panel_toolBar + // + this.panel_toolBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(229)))), ((int)(((byte)(229))))); + this.panel_toolBar.Controls.Add(this.label2); + this.panel_toolBar.Controls.Add(this.label3); + this.panel_toolBar.Controls.Add(this.dateTimePicker2); + this.panel_toolBar.Controls.Add(this.dateTimePicker1); + this.panel_toolBar.Controls.Add(this.btn_get); + this.panel_toolBar.Location = new System.Drawing.Point(0, 53); + this.panel_toolBar.Name = "panel_toolBar"; + this.panel_toolBar.Size = new System.Drawing.Size(835, 56); + this.panel_toolBar.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(364, 24); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 12); + this.label2.TabIndex = 19; + this.label2.Text = "结束时间"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(88, 24); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(53, 12); + this.label3.TabIndex = 18; + this.label3.Text = "开始时间"; + // + // dateTimePicker2 + // + this.dateTimePicker2.Location = new System.Drawing.Point(423, 18); + this.dateTimePicker2.Name = "dateTimePicker2"; + this.dateTimePicker2.Size = new System.Drawing.Size(200, 21); + this.dateTimePicker2.TabIndex = 17; + // + // dateTimePicker1 + // + this.dateTimePicker1.Location = new System.Drawing.Point(147, 18); + this.dateTimePicker1.Name = "dateTimePicker1"; + this.dateTimePicker1.Size = new System.Drawing.Size(200, 21); + this.dateTimePicker1.TabIndex = 16; + // + // btn_get + // + this.btn_get.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(203)))), ((int)(((byte)(81))))); + this.btn_get.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_get.Location = new System.Drawing.Point(660, 12); + this.btn_get.Name = "btn_get"; + this.btn_get.Size = new System.Drawing.Size(75, 32); + this.btn_get.TabIndex = 15; + this.btn_get.Text = "查询"; + this.btn_get.UseVisualStyleBackColor = false; + this.btn_get.Click += new System.EventHandler(this.btn_get_Click); + // + // lb_noData + // + this.lb_noData.AutoSize = true; + this.lb_noData.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb_noData.Font = new System.Drawing.Font("宋体", 48F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lb_noData.ForeColor = System.Drawing.Color.Red; + this.lb_noData.Location = new System.Drawing.Point(259, 320); + this.lb_noData.Name = "lb_noData"; + this.lb_noData.Size = new System.Drawing.Size(252, 64); + this.lb_noData.TabIndex = 3; + this.lb_noData.Text = "NO DATA"; + // + // lb_time + // + this.lb_time.AutoSize = true; + this.lb_time.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb_time.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lb_time.ForeColor = System.Drawing.Color.Red; + this.lb_time.Location = new System.Drawing.Point(527, 539); + this.lb_time.Name = "lb_time"; + this.lb_time.Size = new System.Drawing.Size(40, 16); + this.lb_time.TabIndex = 4; + this.lb_time.Text = "TIME"; + // + // pic_down + // + this.pic_down.Image = global::智慧校园.Properties.Resources.arrow_right_normal; + this.pic_down.Location = new System.Drawing.Point(668, 138); + this.pic_down.Name = "pic_down"; + this.pic_down.Size = new System.Drawing.Size(67, 479); + this.pic_down.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pic_down.TabIndex = 6; + this.pic_down.TabStop = false; + this.pic_down.Click += new System.EventHandler(this.pic_down_Click); + // + // pic_up + // + this.pic_up.Image = global::智慧校园.Properties.Resources.arrow_left_normal; + this.pic_up.Location = new System.Drawing.Point(49, 138); + this.pic_up.Name = "pic_up"; + this.pic_up.Size = new System.Drawing.Size(67, 479); + this.pic_up.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pic_up.TabIndex = 5; + this.pic_up.TabStop = false; + this.pic_up.Click += new System.EventHandler(this.pic_up_Click); + // + // pic_camera + // + this.pic_camera.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.pic_camera.Location = new System.Drawing.Point(49, 138); + this.pic_camera.Name = "pic_camera"; + this.pic_camera.Size = new System.Drawing.Size(686, 479); + this.pic_camera.TabIndex = 2; + this.pic_camera.TabStop = false; + // + // SecurityCameraData + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(835, 629); + this.Controls.Add(this.pic_down); + this.Controls.Add(this.pic_up); + this.Controls.Add(this.lb_time); + this.Controls.Add(this.lb_noData); + this.Controls.Add(this.pic_camera); + this.Controls.Add(this.panel_toolBar); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "SecurityCameraData"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "SecurityCameraData"; + this.Load += new System.EventHandler(this.SecurityCameraData_Load); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_close)).EndInit(); + this.panel_toolBar.ResumeLayout(false); + this.panel_toolBar.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic_down)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_up)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pic_camera)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pic_close; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel_toolBar; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.DateTimePicker dateTimePicker2; + private System.Windows.Forms.DateTimePicker dateTimePicker1; + private System.Windows.Forms.Button btn_get; + private System.Windows.Forms.PictureBox pic_camera; + private System.Windows.Forms.Label lb_noData; + private System.Windows.Forms.Label lb_time; + private System.Windows.Forms.PictureBox pic_up; + private System.Windows.Forms.PictureBox pic_down; + } +} \ No newline at end of file diff --git a/samples/p8-t5-历史图片/SecurityCameraData.cs b/samples/p8-t5-历史图片/SecurityCameraData.cs new file mode 100644 index 0000000..c374125 --- /dev/null +++ b/samples/p8-t5-历史图片/SecurityCameraData.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using DeviceCtrlLibrary; +using 智慧校园.SQLHelpers; + +namespace 智慧校园 +{ + public partial class SecurityCameraData : Form + { + public SecurityCameraData() + { + InitializeComponent(); + } + //存放报警信息的集合 + Dictionary ImgDictionary = new Dictionary(); + //图片下标 + int index = -1; + Image img; + //KEY的列表(报警时间为KEY) + List Keys = new List(); + + private void SecurityCameraData_Load(object sender, EventArgs e) + { + try + { + //设置父容器 + pic_up.Parent = pic_camera; + pic_down.Parent = pic_camera; + //设置加载坐标 + pic_up.Location = new Point(20, 0); + pic_down.Location = new Point(560, 0); + GetData(); + } + catch + { + } + } + //更新数据 + private void GetData() + { + try + { + DateTime startdt = dateTimePicker1.Value; + DateTime enddt = dateTimePicker2.Value; + ImgDictionary = SQLBLL.GetSecurityData(startdt, enddt); + index = -1; + Keys.Clear(); + + if (ImgDictionary.Count != 0) + lb_noData.Visible = false; + else + { + lb_noData.Visible = true; + return; + } + foreach (string key in ImgDictionary.Keys) + { + Keys.Add(key); + } + + ImageChanged(); + } + catch + { + } + } + //切换图片 + private void ImageChanged(char UpOrDown = '+') + { + try + { + if (ImgDictionary.Count == 0) + return; + + if (UpOrDown == '+') + index++; + else if (UpOrDown == '-') + index--; + + if (index == ImgDictionary.Count) + index = 0; + + if (index == -1) + index = ImgDictionary.Count - 1; + + ImgDictionary.TryGetValue(Keys[index], out img); + pic_camera.Image = img; + lb_time.Text = Keys[index]; + } + catch + { + } + + } + + private void btn_get_Click(object sender, EventArgs e) + { + try + { + GetData(); + } + catch + { + } + } + + private void pictureBox1_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void pic_up_Click(object sender, EventArgs e) + { + ImageChanged('-'); + } + + private void pic_down_Click(object sender, EventArgs e) + { + ImageChanged(); + } + } +} diff --git a/samples/p8-t5-历史图片/checks.yaml b/samples/p8-t5-历史图片/checks.yaml new file mode 100644 index 0000000..1821c5a --- /dev/null +++ b/samples/p8-t5-历史图片/checks.yaml @@ -0,0 +1,55 @@ +# 评分规则:书上评价表的功能项。每项单独启动一次程序,按步骤操作,核对结果。 +# 格式说明见 server/src/grading/checks.ts +# 先拨虚拟时钟再拍照,照片的时间就是确定的(9:00:00、10:30:00 左右)。 +- title: 能查看拍下的历史照片 + steps: + - clock: '09:00:00' + - click: pic_security + - expect: { control: pic_video, image: true, within: 3s } + - click: btn_camera + - click: btn_history + - expect: { window: SecurityCameraData, desc: 点"查看历史图像"打开历史报警记录窗体 } + - expect: { control: pic_camera, image: true, desc: 显示今天拍的照片 } + - expect: { control: lb_noData, visible: false, desc: 有照片时不显示"NO DATA" } + - expect: { control: lb_time, contains: ' 9:00:0', desc: 显示照片的拍摄时间 } + +- title: 照片能根据图片按钮切换 + steps: + - clock: '09:00:00' + - click: pic_security + - expect: { control: pic_video, image: true, within: 3s } + - click: btn_camera + - clock: '10:30:00' + - click: btn_camera + - click: btn_history + - expect: { control: lb_time, contains: ' 9:00:0', desc: 先显示第一张照片 } + - click: pic_down + - expect: { control: lb_time, contains: '10:30:0', desc: 点右箭头显示下一张 } + - click: pic_down + - expect: { control: lb_time, contains: ' 9:00:0', desc: 最后一张再往后回到第一张 } + - click: pic_up + - expect: { control: lb_time, contains: '10:30:0', desc: 点左箭头显示上一张 } + +- title: 能正确查找时间段内的历史图片 + steps: + - clock: '09:00:00' + - click: pic_security + - expect: { control: pic_video, image: true, within: 3s } + - click: btn_camera + - click: btn_history + - pick: { control: dateTimePicker1, value: '2024-01-01' } + - click: btn_get + - expect: { control: lb_noData, visible: false, desc: 2024-01-01 到今天之间有照片 } + - expect: { control: lb_time, contains: ' 9:00:0' } + - pick: { control: dateTimePicker2, value: '2024-01-31' } + - click: btn_get + - expect: { control: lb_noData, visible: true, desc: 2024 年 1 月没有照片,显示"NO DATA" } + +- title: 能关闭历史报警记录窗体 + steps: + - click: pic_security + - click: btn_history + - expect: { window: SecurityCameraData } + - click: pic_close + - expect: { window: SecurityCameraData, open: false } + - expect: { window: Security, desc: 回到校园安防窗体 } diff --git a/samples/p8-t5-历史图片/database.sql b/samples/p8-t5-历史图片/database.sql new file mode 100644 index 0000000..2e5eeba --- /dev/null +++ b/samples/p8-t5-历史图片/database.sql @@ -0,0 +1,54 @@ +-- 实验的初始数据库 WisdomCampus(教材"综合实训"附带的库):环境数据表 EnvironmentData、报警图片表 SecurityData、用户表 Users。 +-- EnvironmentData 预置了 7 天的历史数据,"数据分析"的图表一打开就有内容;SecurityData 是空的,拍照或有人入侵时才有记录。 +-- 学生可以在数据库页面"恢复实验初始数据";评分时每个检查项用一份新的。 +CREATE DATABASE WisdomCampus +GO +USE WisdomCampus +GO +CREATE TABLE Users (Id int IDENTITY(1,1) PRIMARY KEY, UserName nvarchar(50) NOT NULL, Password nvarchar(50) NOT NULL) +CREATE TABLE EnvironmentData (Id int IDENTITY(1,1) PRIMARY KEY, Fire bit NOT NULL, Smoke bit NOT NULL, Temperature float NULL, Humidity float NULL, Light float NULL, _Time datetime NOT NULL) +CREATE TABLE SecurityData (Id int IDENTITY(1,1) PRIMARY KEY, EvenTime datetime NOT NULL, EvenImage image NOT NULL) +GO +INSERT INTO Users (UserName, Password) VALUES ('admin', '123') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.9, 58, 258, '2026-10-14 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.1, 53, 475, '2026-10-14 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.8, 51, 761, '2026-10-14 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 22.5, 49, 733, '2026-10-14 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 54, 528, '2026-10-14 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.1, 57, 283, '2026-10-14 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.9, 59, 261, '2026-10-15 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 53, 499, '2026-10-15 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.8, 52, 764, '2026-10-15 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 23.5, 47, 778, '2026-10-15 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.8, 52, 503, '2026-10-15 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 56, 218, '2026-10-15 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 13.9, 63, 258, '2026-10-16 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.6, 60, 477, '2026-10-16 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.8, 51, 741, '2026-10-16 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.5, 54, 796, '2026-10-16 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 55, 488, '2026-10-16 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.6, 59, 214, '2026-10-16 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 11.9, 67, 234, '2026-10-17 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.1, 63, 544, '2026-10-17 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.3, 60, 804, '2026-10-17 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.5, 54, 801, '2026-10-17 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.8, 59, 524, '2026-10-17 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.1, 58, 286, '2026-10-17 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 16.4, 59, 250, '2026-10-18 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.6, 55, 533, '2026-10-18 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.3, 50, 749, '2026-10-18 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 24, 48, 766, '2026-10-18 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.8, 54, 534, '2026-10-18 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.1, 53, 241, '2026-10-18 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.4, 54, 253, '2026-10-19 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.1, 50, 474, '2026-10-19 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 22.3, 48, 778, '2026-10-19 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 26, 46, 783, '2026-10-19 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 23.3, 50, 520, '2026-10-19 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 20.6, 50, 213, '2026-10-19 18:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 15.9, 62, 230, '2026-10-20 08:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 18.6, 52, 471, '2026-10-20 10:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 53, 751, '2026-10-20 12:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 21.5, 48, 747, '2026-10-20 14:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 19.3, 55, 527, '2026-10-20 16:00:00') +INSERT INTO EnvironmentData (Fire, Smoke, Temperature, Humidity, Light, _Time) VALUES (0, 0, 17.1, 57, 220, '2026-10-20 18:00:00') diff --git a/samples/p8-t5-历史图片/meta.json b/samples/p8-t5-历史图片/meta.json new file mode 100644 index 0000000..5f121a2 --- /dev/null +++ b/samples/p8-t5-历史图片/meta.json @@ -0,0 +1,4 @@ +{ + "title": "项目8 任务5 实现\"校园安防\"模块中显示历史图片的功能", + "source": "教材书 p181–185,界面和代码取自配套参考工程;图片是平台素材库里自绘的同名素材(尺寸和教材一致);每次查询前清空 Keys(书上没清空,重复查询时照片和时间对不上)" +} diff --git a/server/test/grading.test.ts b/server/test/grading.test.ts index d91a3a6..61bad62 100644 --- a/server/test/grading.test.ts +++ b/server/test/grading.test.ts @@ -35,7 +35,7 @@ async function prepare(id: string, name: string, edit?: { file: string; from: st describe('参考答案全部通过', async () => { const ids = (await Array.fromAsync(new Bun.Glob('*/checks.yaml').scan({ cwd: SAMPLES }))).map((p) => p.split('/')[0]).sort() - test('每个示例都有评分规则', () => expect(ids.length).toBe(18)) + test('每个示例都有评分规则', () => expect(ids.length).toBe(23)) for (const id of ids) { test(id, async () => { const result = await grade(await prepare(id, id), await checksOf(id), id) @@ -89,7 +89,7 @@ describe('改坏的代码', () => { const dir = await prepare(id, 'camera', { file: 'Form1.cs', from: 'DeviceCtrlHelper.ipCameraHelper.ImageRead += ipCameraHelper_ImageRead;', to: '' }) const result = await grade(dir, await checksOf(id), id) expect(result.results.map((r) => r.passed)).toEqual([true, false, true, false]) - expect(result.results[1].message).toBe('期望3 秒内 pictureBox1 显示摄像机拍到的图像,实际是空的') + expect(result.results[1].message).toBe('期望3 秒内 pictureBox1 显示摄像机拍到的图像,实际没有图片') }, 60000) test('数据库:照书上 INSERT 不写列名,温度和光照存反了', async () => { @@ -142,6 +142,27 @@ describe('改坏的代码', () => { expect(result.results[2]).toMatchObject({ passed: false, message: '期望 lstbRecored 列表里有"发现火情"的记录,实际列表是空的' }) }, 60000) + test('管理平台:照参考工程没给"自动推送火情"复选框绑定 CheckedChanged,有火情时 LED 屏不推送', async () => { + const id = 'p8-t3-环境采集与分析' + const dir = await prepare(id, 'auto-fire', { + file: 'Environment.Designer.cs', + from: ' this.ch_autoLedFire.CheckedChanged += new System.EventHandler(this.ch_autoLedFire_CheckedChanged);\n', + to: '', + }) + const result = await grade(dir, await checksOf(id), id) + const fire = result.results.find((r) => r.title === '能自动推送火情到 LED 屏')! + expect(fire).toMatchObject({ passed: false, message: '期望8 秒内实训台 LED 屏显示"发现火情"(勾选"自动推送火情"后有火焰),实际什么也没显示' }) + expect(result.results.filter((r) => !r.passed)).toHaveLength(1) + }, 60000) + + test('管理平台:开灯时换错了背景图片', async () => { + const id = 'p8-t3-环境采集与分析' + const dir = await prepare(id, 'lamp-image', { file: 'Environment.cs', from: 'panel_bg.BackgroundImage = Properties.Resources.day_01;', to: 'panel_bg.BackgroundImage = Properties.Resources.day_02;' }) + const result = await grade(dir, await checksOf(id), id) + const lamp = result.results.find((r) => r.title === '路灯能手动控制')! + expect(lamp).toMatchObject({ passed: false, message: '期望 panel_bg 背景换成亮灯的场景(day_01),实际是别的图片' }) + }, 60000) + test('报警灯接错了 DO 口', async () => { const id = 'p4-t3-报警灯' const dir = await prepare(id, 'relay', { file: 'Form1.cs', from: 'DeviceCtrlHelper.adam4150Helper.OnOff(0, IsOpen);', to: 'DeviceCtrlHelper.adam4150Helper.OnOff(1, IsOpen);' })