Initial commit: SSPC Dynamic Test System

This commit is contained in:
zhengsl 2026-06-30 12:10:29 +08:00
commit cf70367313
756 changed files with 94138 additions and 0 deletions

64
.gitignore vendored Normal file
View File

@ -0,0 +1,64 @@
# ===== .NET =====
**/bin/
**/obj/
*.user
*.suo
*.userosscache
*.sln.docstates
*.userprefs
# ===== Visual Studio =====
.vs/
*.rsuser
[Dd]ebug/
[Rr]elease/
x64/
x86/
# ===== Publish & Build Output =====
publish/
# ===== NuGet =====
*.nupkg
**/packages/*
!**/packages/build/
*.nuget.props
*.nuget.targets
# ===== IDE & Editors =====
.idea/
*.swp
*~
.vscode/
*.code-workspace
# ===== Environment & Secrets =====
.env
.env.*
*.local.json
settings.local.json
# ===== OS =====
.DS_Store
Thumbs.db
Desktop.ini
# ===== Logs =====
logs/
*.log
serilog/
# ===== Test Results =====
TestResults/
*.trx
*.coverage
*.coveragexml
# ===== Runtime Data (user config stored in %LOCALAPPDATA%) =====
SSPCTester.UI/settings.json
# ===== Driver DLLs (厂商提供,不纳入版本) =====
**/ACTS1000_64.dll
**/ACTS1000*.dll
**/ACTS1000*.lib
**/ACTS1000*.h

View File

@ -0,0 +1,251 @@
# Modbus 接口规范
## 1. 文档用途
本文档用于指导主项目接入已完成现场实测的 24 路继电器、电压采集和电流采集设备。
配套文件:
- `device-profile.json`:设备协议与通道映射的唯一权威配置。
- `appsettings.Modbus.example.json`:主项目默认配置字段示例。
- `接入验收清单.md`:开发完成后的测试和验收要求。
主项目实现时必须读取配置,不得在业务代码中硬编码从站地址、线圈、寄存器、量程、公式或通道映射。
## 2. 实测资料与结论
本规范依据以下现场结果整理:
- `结果_Modbus-接口-电流-电压对应表.txt`:逐个物理插位手动测量得到的采集页通道对应关系。
- `结果_modbus-tuner-20260618-131814.json`:调试程序于 2026-06-18 导出的已调通通讯参数。
编号含义必须严格区分:
| 名称 | 含义 |
|---|---|
| `physicalSlot` | 机器上的物理接口位置,也是主项目业务层唯一使用的通道号,范围 124 |
| `relayChannel` | 调试程序继电器控制页按钮号;实测与物理插位一致 |
| `sourceDisplayChannel` | 调试程序采集页面上出现读数的通道号,仅保留作实测追溯 |
| `registerOffset` | 在本次 24 寄存器回包数据区中的零基位置,主项目实际解析使用 |
主项目不得把 `sourceDisplayChannel` 当作物理插位,也不得直接用它计算字节偏移。
## 3. 总线与串口参数
所有模块共用一条 RS485 总线。
| 参数 | 实测值 |
|---|---|
| 协议 | Modbus RTU |
| 波特率 | 9600 |
| 数据位 | 8 |
| 校验 | None |
| 停止位 | 1 |
| 读取超时 | 500 ms |
| 失败重试 | 2 次 |
| CRC | CRC16-Modbus |
| CRC 字节序 | 低字节在前 |
| 地址、数量和寄存器数据 | 高字节在前 |
现场调试使用过 `COM9`,但 COM 号属于计算机本地设置。主项目应允许用户选择和保存,不得把 `COM9` 固定为设备协议的一部分。
同一串口的请求必须串行执行。不得让继电器写入、电压读取和电流读取同时向串口写帧。
## 4. 模块地址
| 模块 | 从站地址 |
|---|---:|
| 继电器板 1负责物理插位 18 | 1 |
| 继电器板 2负责物理插位 916 | 2 |
| 继电器板 3负责物理插位 1724 | 3 |
| 24 路电压采集模块 | 4 |
| 24 路电流采集模块 | 5 |
## 5. 继电器控制
使用功能码 `0x05` 写单个线圈。
- 开:`0xFF00`
- 关:`0x0000`
- 正常响应应回显请求中的从站、功能码、线圈地址和值。
- 响应必须检查长度、从站、功能码、回显内容和 CRC。
主项目业务接口建议:
```text
SetRelayAsync(int physicalSlot, bool isOn)
```
处理流程:
1. 校验 `physicalSlot` 为 124。
2. 从 `device-profile.json``channels` 查找该物理插位。
3. 取得 `relay.slave``relay.coil`
4. 构造并发送 `0x05` 帧。
5. 验证回显后才更新业务状态。
不要在未确认当前硬件是否允许的情况下自动全开 24 路。
## 6. 电压采集
实测配置:
| 参数 | 值 |
|---|---|
| 从站 | 4 |
| 功能码 | `0x03` |
| 起始寄存器 | 0 |
| 寄存器数量 | 24 |
| 量程 | 100 V |
| 解析公式 | B |
| 公式 | `实际电压 = DATA / 100` |
| DATA 类型 | `UInt16` |
| 每通道字节数 | 2 |
| 数据字节序 | Big-Endian |
请求主体:
```text
04 03 00 00 00 18
```
追加 CRC16-Modbus 后发送。正常响应共 53 字节:
```text
[从站1][功能码1][字节数0x30][48字节数据][CRC2]
```
## 7. 电流采集
实测配置:
| 参数 | 值 |
|---|---|
| 从站 | 5 |
| 功能码 | `0x03` |
| 起始寄存器 | 0 |
| 寄存器数量 | 24 |
| 量程 | 60 A |
| 解析公式 | A |
| 公式 | `实际电流 = DATA / 10000 × 60` |
| DATA 类型 | `Int16` |
| 每通道字节数 | 2 |
| 数据字节序 | Big-Endian |
请求主体:
```text
05 03 00 00 00 18
```
这里的“带符号”按现场导出配置解释为:读取寄存器 023并将每个 16 位原始值按二进制补码转换为 `Int16`。主项目不得自行把起始寄存器改成 24也不得在映射地址上额外加 24。如后续更换硬件或重新标定应修改配置版本并重新验收。
## 8. 采集回包解析
电压和电流共用以下流程:
1. 检查响应最小长度。
2. 检查响应从站等于配置从站。
3. 检查功能码。若最高位为 1按 Modbus 异常响应处理。
4. 检查字节数为 `registerCount × registerBytes`,当前应为 48。
5. 验证 CRC16-Modbus。
6. 对每个物理插位读取对应的 `registerOffset`
7. 字节位置为:
```text
position = dataStartOffset + registerOffset × channelBytes
```
当前 `dataStartOffset=3``channelBytes=2`。
8. 按 Big-Endian 合成原始 16 位值。
9. 根据 `signed` 转换为 `UInt16``Int16`
10. 根据 `formula``range` 换算工程值。
公式定义:
```text
A: value = DATA / 10000.0 × range
B: value = DATA / range
```
## 9. 统一业务接口
主项目业务层只允许使用物理插位 124建议公开以下抽象
```text
ConnectAsync()
DisconnectAsync()
SetRelayAsync(int physicalSlot, bool isOn)
ReadAllVoltagesAsync()
ReadAllCurrentsAsync()
ReadMeasurementsAsync()
```
一次测量结果建议包含:
```text
PhysicalSlot
Voltage
Current
VoltageRaw
CurrentRaw
Timestamp
VoltageQuality
CurrentQuality
```
`ReadMeasurementsAsync()` 应分别完成一次电压整帧读取和一次电流整帧读取,再按 `physicalSlot` 合并。不要为每个物理插位单独读取一次寄存器;每种采集模块一次读取 24 个寄存器即可。
## 10. 配置加载与校验
程序启动时必须校验:
- `schemaVersion` 是程序支持的版本。
- 物理插位恰好覆盖 124不重复、不缺失。
- 继电器从站和线圈组合不重复。
- 电压、电流的 `registerOffset` 均在 `0registerCount-1`
- 每类采集映射不得出现重复的 `registerOffset`
- 从站地址范围为 1247。
- `registerBytes=2`、`channelBytes=2`。
- 公式只能是 `A``B`
- 字节序和 CRC 类型为程序支持值。
配置错误时应阻止通讯并给出具体字段,不要静默使用代码默认值。
## 11. 超时、重试和线程规则
- 一次请求从发送到收到完整响应视为一个事务。
- 失败后最多重试配置中的次数;当前为 2 次,即最多发送 3 次。
- CRC 错误、响应超时、从站错误、功能码错误和响应长度错误都应记录原始 HEX。
- 重试前应清理串口输入缓冲区,避免残帧与下一帧拼接。
- 串口操作使用互斥锁或单消费者队列串行化。
- 断开和应用退出时安全关闭串口。
## 12. 主项目配置建议
建议将机器本地参数放在主项目配置,将设备协议和映射放在独立配置:
```text
主项目配置
└─ Modbus
├─ Enabled
├─ PortName
├─ DeviceProfilePath
└─ PollIntervalMs
device-profile.json
├─ 串口通讯默认参数
├─ Modbus 帧规则
├─ 模块协议
└─ 24 路权威映射
```
`device-profile.json` 应随主程序发布并复制到输出目录。主项目可以提供配置界面修改 COM 口,但协议和通道映射只应由经过授权的维护流程更新。
## 13. AI 编程强制要求
将本目录交给主项目 AI 时,应附加以下要求:
> 严格按《Modbus接口规范.md》和 `device-profile.json` 实现。业务层统一使用 `physicalSlot` 124。所有从站、线圈、寄存器、量程、公式及映射从配置读取不得硬编码。`sourceDisplayChannel` 仅用于追溯现场实测不参与解析寻址。实现配置启动校验、串口事务串行化、CRC及响应完整校验并按《接入验收清单.md》完成测试。

View File

@ -0,0 +1,11 @@
{
"Modbus": {
"Enabled": true,
"PortName": "",
"DeviceProfilePath": "Config/device-profile.json",
"PollIntervalMs": 1000,
"AutoConnect": false,
"CloseAllRelaysOnDisconnect": false,
"LogRawFrames": true
}
}

View File

@ -0,0 +1,85 @@
{
"schemaVersion": "1.0",
"profileId": "spc-dynatest-modbus-24ch",
"profileName": "SPC-DynaTest 24路实测设备配置",
"source": {
"type": "fieldMeasurement",
"measuredMappingFile": "结果_Modbus-接口-电流-电压对应表.txt",
"tunerExportFile": "结果_modbus-tuner-20260618-131814.json",
"tunerExportedAt": "2026-06-18T13:18:22.4296268+08:00"
},
"serialDefaults": {
"baudRate": 9600,
"dataBits": 8,
"parity": "None",
"stopBits": 1,
"readTimeoutMs": 500,
"retry": 2,
"protocol": "ModbusRTU"
},
"frame": {
"registerBytes": 2,
"dataByteOrder": "BigEndian",
"crc": "CRC16Modbus",
"crcByteOrder": "LittleEndian"
},
"relay": {
"functionCodeWrite": 5,
"onValue": "0xFF00",
"offValue": "0x0000",
"verifyEchoResponse": true
},
"voltage": {
"slave": 4,
"functionCodeRead": 3,
"startRegister": 0,
"registerCount": 24,
"range": 100.0,
"unit": "V",
"formula": "B",
"signed": false,
"dataStartOffset": 3,
"channelBytes": 2,
"dataByteOrder": "BigEndian"
},
"current": {
"slave": 5,
"functionCodeRead": 3,
"startRegister": 0,
"registerCount": 24,
"range": 60.0,
"unit": "A",
"formula": "A",
"signed": true,
"dataStartOffset": 3,
"channelBytes": 2,
"dataByteOrder": "BigEndian",
"signedInterpretation": "Int16TwosComplement"
},
"channels": [
{ "physicalSlot": 1, "relay": { "slave": 1, "coil": 7 }, "voltage": { "sourceDisplayChannel": 8, "registerOffset": 0 }, "current": { "sourceDisplayChannel": 8, "registerOffset": 4 } },
{ "physicalSlot": 2, "relay": { "slave": 1, "coil": 6 }, "voltage": { "sourceDisplayChannel": 7, "registerOffset": 1 }, "current": { "sourceDisplayChannel": 7, "registerOffset": 19 } },
{ "physicalSlot": 3, "relay": { "slave": 1, "coil": 5 }, "voltage": { "sourceDisplayChannel": 6, "registerOffset": 2 }, "current": { "sourceDisplayChannel": 6, "registerOffset": 5 } },
{ "physicalSlot": 4, "relay": { "slave": 1, "coil": 4 }, "voltage": { "sourceDisplayChannel": 5, "registerOffset": 3 }, "current": { "sourceDisplayChannel": 5, "registerOffset": 18 } },
{ "physicalSlot": 5, "relay": { "slave": 1, "coil": 3 }, "voltage": { "sourceDisplayChannel": 4, "registerOffset": 4 }, "current": { "sourceDisplayChannel": 4, "registerOffset": 6 } },
{ "physicalSlot": 6, "relay": { "slave": 1, "coil": 2 }, "voltage": { "sourceDisplayChannel": 3, "registerOffset": 5 }, "current": { "sourceDisplayChannel": 3, "registerOffset": 17 } },
{ "physicalSlot": 7, "relay": { "slave": 1, "coil": 1 }, "voltage": { "sourceDisplayChannel": 2, "registerOffset": 6 }, "current": { "sourceDisplayChannel": 2, "registerOffset": 7 } },
{ "physicalSlot": 8, "relay": { "slave": 1, "coil": 0 }, "voltage": { "sourceDisplayChannel": 1, "registerOffset": 7 }, "current": { "sourceDisplayChannel": 1, "registerOffset": 16 } },
{ "physicalSlot": 9, "relay": { "slave": 2, "coil": 7 }, "voltage": { "sourceDisplayChannel": 16, "registerOffset": 8 }, "current": { "sourceDisplayChannel": 16, "registerOffset": 0 } },
{ "physicalSlot": 10, "relay": { "slave": 2, "coil": 6 }, "voltage": { "sourceDisplayChannel": 15, "registerOffset": 9 }, "current": { "sourceDisplayChannel": 15, "registerOffset": 23 } },
{ "physicalSlot": 11, "relay": { "slave": 2, "coil": 5 }, "voltage": { "sourceDisplayChannel": 14, "registerOffset": 10 }, "current": { "sourceDisplayChannel": 14, "registerOffset": 1 } },
{ "physicalSlot": 12, "relay": { "slave": 2, "coil": 4 }, "voltage": { "sourceDisplayChannel": 13, "registerOffset": 11 }, "current": { "sourceDisplayChannel": 13, "registerOffset": 22 } },
{ "physicalSlot": 13, "relay": { "slave": 2, "coil": 3 }, "voltage": { "sourceDisplayChannel": 12, "registerOffset": 12 }, "current": { "sourceDisplayChannel": 12, "registerOffset": 2 } },
{ "physicalSlot": 14, "relay": { "slave": 2, "coil": 2 }, "voltage": { "sourceDisplayChannel": 11, "registerOffset": 13 }, "current": { "sourceDisplayChannel": 11, "registerOffset": 21 } },
{ "physicalSlot": 15, "relay": { "slave": 2, "coil": 1 }, "voltage": { "sourceDisplayChannel": 10, "registerOffset": 14 }, "current": { "sourceDisplayChannel": 10, "registerOffset": 3 } },
{ "physicalSlot": 16, "relay": { "slave": 2, "coil": 0 }, "voltage": { "sourceDisplayChannel": 9, "registerOffset": 15 }, "current": { "sourceDisplayChannel": 9, "registerOffset": 20 } },
{ "physicalSlot": 17, "relay": { "slave": 3, "coil": 7 }, "voltage": { "sourceDisplayChannel": 24, "registerOffset": 16 }, "current": { "sourceDisplayChannel": 24, "registerOffset": 8 } },
{ "physicalSlot": 18, "relay": { "slave": 3, "coil": 6 }, "voltage": { "sourceDisplayChannel": 23, "registerOffset": 17 }, "current": { "sourceDisplayChannel": 23, "registerOffset": 15 } },
{ "physicalSlot": 19, "relay": { "slave": 3, "coil": 5 }, "voltage": { "sourceDisplayChannel": 22, "registerOffset": 18 }, "current": { "sourceDisplayChannel": 22, "registerOffset": 9 } },
{ "physicalSlot": 20, "relay": { "slave": 3, "coil": 4 }, "voltage": { "sourceDisplayChannel": 21, "registerOffset": 19 }, "current": { "sourceDisplayChannel": 21, "registerOffset": 14 } },
{ "physicalSlot": 21, "relay": { "slave": 3, "coil": 3 }, "voltage": { "sourceDisplayChannel": 20, "registerOffset": 20 }, "current": { "sourceDisplayChannel": 20, "registerOffset": 10 } },
{ "physicalSlot": 22, "relay": { "slave": 3, "coil": 2 }, "voltage": { "sourceDisplayChannel": 19, "registerOffset": 21 }, "current": { "sourceDisplayChannel": 19, "registerOffset": 13 } },
{ "physicalSlot": 23, "relay": { "slave": 3, "coil": 1 }, "voltage": { "sourceDisplayChannel": 18, "registerOffset": 22 }, "current": { "sourceDisplayChannel": 18, "registerOffset": 11 } },
{ "physicalSlot": 24, "relay": { "slave": 3, "coil": 0 }, "voltage": { "sourceDisplayChannel": 17, "registerOffset": 23 }, "current": { "sourceDisplayChannel": 17, "registerOffset": 12 } }
]
}

View File

@ -0,0 +1,81 @@
# Modbus 主项目接入验收清单
## 1. 配置验收
- [ ] 主项目启动时成功加载 `device-profile.json`
- [ ] 配置文件随发布产物复制到预期目录。
- [ ] COM 口可以在主项目中选择并保存,没有硬编码 `COM9`
- [ ] 配置缺少物理插位、出现重复寄存器或版本不支持时,程序阻止通讯并明确报错。
- [ ] 业务代码中没有写死从站、线圈、寄存器、量程和通道映射。
## 2. 协议单元测试
- [ ] CRC16-Modbus 计算和校验正确CRC 低字节在前。
- [ ] 继电器写单线圈帧使用功能码 `0x05`
- [ ] ON 值为 `0xFF00`OFF 值为 `0x0000`
- [ ] 电压请求为从站 4、功能码 `0x03`、起始寄存器 0、数量 24。
- [ ] 电流请求为从站 5、功能码 `0x03`、起始寄存器 0、数量 24。
- [ ] 电压原始值按 `UInt16` 解析。
- [ ] 电流原始值按二进制补码 `Int16` 解析,负数测试通过。
- [ ] 电压公式为 `DATA / 100`
- [ ] 电流公式为 `DATA / 10000 × 60`
- [ ] 解析器拒绝 CRC 错误、从站错误、功能码错误和长度不足的回包。
## 3. 映射自动测试
- [ ] 物理插位完整覆盖 124。
- [ ] 24 个继电器从站/线圈组合不重复。
- [ ] 电压 `registerOffset` 完整覆盖 023。
- [ ] 电流 `registerOffset` 完整覆盖 023。
- [ ] `sourceDisplayChannel` 仅用于记录和诊断,没有参与回包字节寻址。
重点抽查:
| 物理插位 | 继电器 | 电压寄存器偏移 | 电流寄存器偏移 |
|---:|---|---:|---:|
| 1 | 从站1 / 线圈7 | 0 | 4 |
| 8 | 从站1 / 线圈0 | 7 | 16 |
| 9 | 从站2 / 线圈7 | 8 | 0 |
| 16 | 从站2 / 线圈0 | 15 | 20 |
| 17 | 从站3 / 线圈7 | 16 | 8 |
| 24 | 从站3 / 线圈0 | 23 | 12 |
## 4. 实机逐路验收
对物理插位 124 逐路执行:
1. 只闭合当前物理插位对应的继电器。
2. 确认其他继电器没有误动作。
3. 给当前接口施加已知电压和电流。
4. 主项目读取一次完整电压帧和一次完整电流帧。
5. 确认值出现在当前 `physicalSlot`,其他物理插位没有串位。
6. 对比标准仪表,记录原始值、工程值和允许误差。
7. 关闭继电器并确认硬件断开。
- [ ] 物理插位 18 通过。
- [ ] 物理插位 916 通过。
- [ ] 物理插位 1724 通过。
- [ ] 电流正值通过。
- [ ] 电流负值或反向极性通过。
- [ ] 连续轮询稳定性通过。
## 5. 异常与稳定性验收
- [ ] 拔掉串口后能超时退出,不永久卡住界面。
- [ ] 恢复连接后可以重新打开串口。
- [ ] CRC 错误帧不会被当作有效测量值。
- [ ] Modbus 异常响应能够显示异常码。
- [ ] 继电器操作与采集轮询不会同时写串口。
- [ ] 重试不会把残留回包拼入下一次响应。
- [ ] 应用退出时串口正确关闭。
- [ ] 日志能够定位到时间、请求 HEX、响应 HEX、耗时和错误原因。
## 6. 完成标准
只有在以下条件全部满足后才视为接入完成:
- 主项目所有业务页面统一使用 `physicalSlot`
- 24 路继电器、电压和电流均逐路实机通过。
- 配置文件成为映射的唯一权威来源。
- 主项目发布包在目标电脑上无需开发环境即可选择串口并运行。

View File

@ -0,0 +1,131 @@
# AI 开发指导PCIe8586 主项目接入
## 目标
`src/Pcie8586.Driver` 作为主项目的硬件基础设施层接入,稳定获得按通道拆分、单位为伏特的采样块。不要复制调试工具的 WPF 界面代码,也不要绕过 `IDigitizer` 在业务层直接调用 P/Invoke。
## 已验证基线
- Windows x64、.NET 8。
- 厂商运行库名:`ACTS1000_64.dll`。
- 原生调用约定:`StdCall`。
- 板卡最多 8 通道;当前公开配置允许 1、2、4、8 通道。
- 基准采样率按 `100_000_000 / ClockDivider` 计算。
- 输入量程±5 V、±1 V。
- 原始数据类型16 位无符号码值。
- DMA 数据布局:按采样点交错,即 `CH0[0], CH1[0], ..., CHn[0], CH0[1], ...`
- 输出 `SampleBlock.Channels` 布局:`[通道][该通道采样点]`,数值单位 V。
## 不可破坏的调用顺序
```text
EnumerateDevices
→ Open
→ Configure / ACTS1000_InitDeviceAD
→ Start / ACTS1000_StartDeviceAD
→ SoftwareTrigger / ACTS1000_SetDeviceTrigAD
→ Read loop / ACTS1000_ReadDeviceAD
→ Stop / ACTS1000_StopDeviceAD
→ Release AD / ACTS1000_ReleaseDeviceAD
→ Close / ACTS1000_ReleaseDevice
```
任何异常、取消、窗口关闭或应用退出路径都必须进入 `finally`,依次执行 `StopAsync()``CloseAsync()`。同一设备不能被两个进程同时占用。
## 推荐接入步骤
1. 给主项目添加 `Pcie8586.Driver.csproj` 项目引用,并把最终可执行项目固定为 x64。
2. 在依赖注入容器中将 `IDigitizer` 注册为单例或应用级长生命周期对象:
```csharp
services.AddSingleton<IDigitizer, Pcie8586Digitizer>();
```
3. 应用启动或硬件页面进入时枚举设备;用户选择逻辑 ID 后再打开。
4. 开始任务时创建 `AcquisitionConfig` 并调用 `ConfigureAsync`。正在采集时不要重配。
5. 在后台任务消费 `StartAcquisitionAsync`,不要在 UI 线程运行 DMA 读取循环。
6. 将每个 `SampleBlock` 立即交给主项目的数据管线。显示、算法、存盘应与采集解耦,慢消费者不能阻塞读卡。
7. 停止时先取消采集令牌并等待消费任务退出,再调用 `StopAsync`
8. 应用退出时调用 `CloseAsync`/`Dispose`。
## 主项目应增加的适配层
建议新增一个业务服务,例如 `Pcie8586AcquisitionService`,负责:
- 串行化打开、配置、启动、停止和关闭操作。
- 维护 `Closed / Open / Running / Faulted` 状态。
- 独占一个 `CancellationTokenSource` 和采集任务。
- 将 `SampleBlock` 写入有界 `Channel<SampleBlock>`
- 通道满时采用符合业务要求的策略:等待、丢最旧显示帧,或停止并报警。测量原始数据不可静默丢弃。
- 将底层异常转换为主项目统一的硬件故障事件。
不要让 ViewModel、窗口或算法模块持有原生设备句柄。
## 参数规则
- `ChannelCount`:只能为 1、2、4、8启用的是从 CH0 开始的连续通道。
- `ClockDivider`:正整数;实际采样率为 `100 MHz / ClockDivider`。接入后应使用设备 `GetMainInfo` 返回的能力做二次校验。
- `InputRange`±5 V 或 ±1 V所有启用通道当前使用同一量程。
- `Mode`:实时监控优先使用 `Continuous`
- `FiniteSamplesPerChannel`:仅有限点模式生效。厂商头文件要求后触发时“每通道点数 × 启用通道数 × 触发次数”为 512 的整数倍;主项目若启用有限点模式,应在上层对齐并做真卡专项测试。
当前硬件实现的固定参数:
- DC 耦合、1 MΩ。
- 板载参考时钟、内部采样时基。
- 后触发、软件触发、触发一次。
- 不输出时钟、不输出触发。
如果主项目需要外触发、多卡同步、单通道独立量程或非连续通道掩码,应扩展配置模型并对照 `vendor/include/ACTS1000.h`,不要直接修改常量碰运气。
## 数据处理规则
- `StartSampleIndex` 是每通道的相对采样序号,不是字节位置。
- `SamplesPerChannel` 是单通道点数,总原始 word 数等于它乘以通道数。
- `Timestamp` 是软件收到该块时的本机时间,不是硬件级精确首点时间戳。
- ±5 V 换算:`V = ((10000 / 65536) × code - 5000) / 1000`。
- ±1 V 换算:`V = ((2000 / 65536) × code - 1000) / 1000`。
- `0x8000` 对应 0 V最大码略低于正满量程。
若吞吐量较高,后续可把 `double[][]` 优化成池化缓冲或原始 `ushort` 管线,但必须先建立等价测试,确认交错顺序和电压换算没有改变。
## 并发与性能
- DMA 读取已经放入后台 `Task`;调用方仍应在独立采集任务中消费异步流。
- 不要对每个采样块执行同步 UI 更新、日志逐点打印或数据库逐点写入。
- 绘图只取最新帧并降采样,建议 1020 Hz 刷新。
- 连续存盘应使用专用写入任务和有界队列。
- 8 通道 100 MS/s 的理论原始吞吐约 1.6 GB/s常规 UI/托管内存流程不适合无约束全速长期保存。先按业务需要降低分频、通道数或录制时长。
## 错误处理验收
至少覆盖以下场景:
- 未安装/找不到 `ACTS1000_64.dll`
- 主进程不是 x64出现 `BadImageFormatException`
- 未发现板卡或逻辑 ID 打开失败。
- 初始化、启动、触发或读取返回 false。
- 用户取消、应用退出和采集任务异常时仍释放设备。
- 设备被其他进程占用。
- 消费速度低于采集速度时有明确背压或报警策略。
## 完成定义
- 主项目 x64 Release 编译通过。
- 无真卡时可注入 `SimulatedDigitizer` 验证完整业务数据链。
- 真卡可完成至少一次连续采集:枚举、打开、配置、触发、读取、停止、再次启动。
- 1/2/4/8 通道的顺序和点数正确。
- `0x8000 → 0 V` 等换算测试通过。
- 停止、异常和退出后,调试工具或主项目可以再次打开设备,无句柄残留。
- 主项目的数据消费速度和内存上限经过目标采样率压力测试。
## AI 修改约束
后续 AI 在改动驱动层时应遵守:
1. 先阅读本文件、`docs/API_AND_DATA_FORMAT.md`、厂商头文件和现有实现。
2. 保持 P/Invoke 集中在 `Pcie8586Digitizer.cs`
3. 不改变结构体字段顺序、数组长度、字符集和调用约定,除非有厂商文档依据。
4. 不把原生句柄暴露给业务层。
5. 每次改动都保留模拟卡路径,并补充纯逻辑测试。
6. 涉及真卡行为的修改必须列出真卡复测项,不能仅以编译通过作为完成。

View File

@ -0,0 +1,309 @@
# PCIe8586M 采集调试程序 — 开发文档
> 给本机 Claude Code 的工作指令。本程序是「项目接入前测试探针」,目标是摸清阿尔泰 PCIe8586M 高速数字化仪的驱动行为,为主项目(.NET 8 + WPF + MVVM提供经过验证的接入方案与精确配置。
---
## 0. 给 Claude Code 的首要约定
1. **函数名/结构体/常量的唯一权威是 `Samples/` 目录下的 VC 示例和 `Samples/VC/Include/*.h` 头文件。** 本文档刻意不写死任何 SDK 函数名。凡涉及具体 API`grep`/阅读 `Samples/VC/Include``Samples/VC/Simple/AD/Continue`、`Finite`,以头文件为准。
2. **Samples 是 VCC/C++)的。** C# 接入靠 P/Invoke`.h``extern "C"` 函数翻译成 `[DllImport]`,把 C 结构体翻译成 `[StructLayout(LayoutKind.Sequential)]`。翻译方法论见 §6。
3. **分层不可破坏。** 只有 `Hardware/Pcie8586Digitizer.cs` 一个文件允许出现 `[DllImport]` 和 SDK 类型。其余所有代码只依赖 `IDigitizer` 接口。这样主项目可原样复用 `Hardware` + `Acquisition` 两层。
4. **先用模拟卡跑通全链路,再接真卡。** 本机无硬件、无驱动,开发阶段用 `SimulatedDigitizer` 验证 UI/数据流/存盘;真卡实现 `Pcie8586Digitizer` 时只改这一层。
5. **平台必须 x64。** SDK 是 64 位非托管 DLL工程 `<PlatformTarget>x64</PlatformTarget>`,否则运行时 `BadImageFormatException`
---
## 1. 硬件事实(已从手册固化,视为常量,不要再"识别"
设备:`ACTS1000 PCIE8586 8CH 16Bit 100Msps High Speed Digitizer`
硬件 ID`PCI\VEN_1E42&DEV_8586`(厂商号 0x1E42 = 阿尔泰,设备号 0x8586
驱动版本1.6.2.02025/7/20
| 项目 | 值 | 来源 |
|---|---|---|
| 通道数 | 8单端 | 手册 2.3.2 |
| ADC 分辨率 | **16 bit**8586M | 手册 2.2 |
| 最高采样率 | 100 MS/s | 手册 2.1 |
| 输入量程 | ±5V 或 ±1V软件可选 | 手册 2.3.2 |
| 板载内存 | 2 GB八通道共享 | 手册 2.3.6 |
| 数据传输 | DMA | 手册 2.3.6 |
| 总线 | PCIe 2.0 x8 | 手册 2.3.1 |
| 支持系统 | XP/Win7/Win8/Win10 | 手册 2.3.1 |
### 1.1 数据格式关键§4 解析的依据)
- 每个采样点 = **16 bit 无符号原始码值 = 2 字节,小端**
- **码值→电压换算公式(仅 8586M手册 4.3**,单位 mV
- ±5V 量程:`Volt = (10000.0 / 65536) * (code & 0xFFFF) - 5000.0`
- ±1V 量程:`Volt = (2000.0 / 65536) * (code & 0xFFFF) - 1000.0`
- 注意 8582M(12bit)、8584M(14bit) 公式不同(分母 4096/16384**本卡是 16bit分母固定 65536**。
- 中间值(零点)码值 = 0x8000 = 32768对应 0V。
### 1.2 多通道数据排列(解交错依据,手册 4.6
- 使能通道数只能是 **1 / 2 / 4 / 8**,且必须**从 CH0 起连续**4 通道 = CH0~3单通道只能是 CH0
- 多通道时按**采样点交错**存放(每点 1 个字):
```
CH0[0] CH1[0] CH2[0] CH3[0] CH4[0] CH5[0] CH6[0] CH7[0]
CH0[1] CH1[1] CH2[1] CH3[1] CH4[1] CH5[1] CH6[1] CH7[1]
...
```
- 解交错:`result[ch][s] = raw[s * channelCount + ch]`。
### 1.3 采样率是离散值(采集频率控制依据,手册 4.7
- `采样率 = 扫描时基频率 / ADC时钟分频器`
- 时基 = 100 MHz分频器 = 1, 2, 3, ... (2³²1) 的**正整数**。
- 所以可设采样率 = `100MHz / N`100M、50M、33.33M、25M ... 1M(N=100) ... 1k(N=100000)。
- **UI 不能让用户自由填任意采样率。** 应让用户选分频器 N或从预设档100M/50M/10M/1M/100k...)选,并实时显示 `100e6/N` 的实际采样率。
### 1.4 采集模式与触发(手册 4.8 / 4.9
- 模式:**连续采样**、**有限点采样**。无硬件级"暂停/继续"。
- 触发源软件触发、ATR(模拟)、DTR(数字 PFI)、同步信号。**调试程序默认软件触发**。
- 有限点支持:中间触发、后触发、预触发、硬件延时触发、重复触发。
- **定时录制(本程序核心功能)映射**:见 §3.2。
---
## 2. 架构
三层,自底向上:
```
Hardware 层 IDigitizer 接口 + Pcie8586Digitizer(真卡, 唯一含 DllImport)
+ SimulatedDigitizer(模拟卡)
Acquisition 层 后台采集线程 / 环形历史缓冲 / 解交错 / 码值换算 / 定时录制 / 存盘
UI 层 (WPF+MVVM) 设备识别 / 实时曲线(ScottPlot) / 实时表格 / 录制控制 / 剪辑
```
**复用边界**`Hardware` + `Acquisition` 两层将原样进主项目UI 层主项目重写。因此这两层**不得引用任何 WPF 类型**(无 `Dispatcher`、无 `ObservableCollection`),保持纯 .NET。
### 2.1 建议目录结构
```
Pcie8586Probe/
├─ Pcie8586Probe.csproj # net8.0-windows, UseWPF, x64
├─ Samples/ # ← 你放上位机参考的地方VC 示例 + Include 头文件)
├─ Hardware/
│ ├─ IDigitizer.cs # 抽象接口(见 §5.1 职责)
│ ├─ SimulatedDigitizer.cs # 模拟实现(生成交错原始码值)
│ └─ Pcie8586Digitizer.cs # 真卡实现P/Invoke照 Samples 填)
├─ Acquisition/
│ ├─ CodeConverter.cs # 码值→电压 + 解交错§1.1/§1.2
│ ├─ RingHistoryBuffer.cs # 录制/剪辑用的最近 N 秒环形缓冲
│ ├─ Recorder.cs # 定时定长录制状态机§3.2
│ └─ WaveformWriter.cs # 落盘(二进制 + JSON 头)
├─ Models/
│ ├─ AcquisitionConfig.cs # 通道数/量程/分频器/模式 等配置
│ ├─ DeviceInfo.cs
│ └─ SampleBlock.cs # 一块已解交错的电压数据
├─ ViewModels/
│ ├─ MainViewModel.cs
│ └─ ChannelRow.cs # 表格一行(通道实时统计)
├─ Views/
│ └─ MainWindow.xaml(.cs)
└─ Converters/ # XAML 值转换器(如枚举→显示文本)
```
### 2.2 NuGet 依赖
- `CommunityToolkit.Mvvm``[ObservableProperty]` / `[RelayCommand]` 源生成器,减样板)。
- `ScottPlot.WPF`(高刷新实时曲线,远优于 WPF 原生绘图)。
---
## 3. 功能需求与验收点
### 3.1 设备识别(自动 + 手动)
- **自动**:调用 SDK 枚举接口列出所有同型号板卡,填充下拉框(显示逻辑号 + 描述)。
- 多数阿尔泰 SDK 有 `GetDeviceCount` 之类;若没有,可循环 `CreateDevice(i)` 试探,成功记录后 `ReleaseDevice`。**具体函数看 Samples/VC/Simple/AD/PhysicalID 或 Include。**
- **手动**用户直接填逻辑号0/1/2...)打开。
- 验收:模拟卡返回 1 张虚拟卡可被选中打开;真卡能枚举到 `VEN_1E42&DEV_8586`
### 3.2 定时定长录制 +剪辑(替代"暂停/继续"
这是本程序与普通示波器软件的核心差异点。语义:
- **连续采集常驻**:打开设备并 Start 后DMA 持续流入,曲线实时滚动显示。这一路**不落盘**,只进 `RingHistoryBuffer`(保留最近 N 秒N 可配,受内存约束见 §7
- **定时录制按钮**1ms / 10ms / 100ms / 1s / 10s 五个预设。点击后:
- 计算目标点数 `target = round(采样率 × 时长)`
- 进入"录制中"状态:从下一个数据块起,把块追加进录制缓冲,累计每通道点数 ≥ target 时**自动停止录制**,截断到精确 target 点,落盘。
- 录制中曲线继续显示、不影响连续监控。
- **采集后剪辑**:录制完(或从历史缓冲)得到一段数据后,提供"起点/终点"两个游标UI 上拖动或填采样序号),裁出子区间另存。
- 验收:选 1MS/s、录 10ms → 落盘文件每通道恰好 10000 点±0因软件截断裁剪 [2000,5000) → 3000 点。
> **两种实现取舍(文档建议默认前者)**
> 1. **连续采集 + 软件截取**(默认):录制只是从连续流里数够点数。能边显示边录,长度精确(软件截断),两段录制无硬件重启间隙。
> 2. **有限点 + 软件触发**(备选):每次录制重新 init→start硬件采满 target 点自停。最干净,但与实时显示互斥、两段间有重配置延时。
> 真卡阶段若连续采集 DMA 吞吐顶不住§7再退到方案 2。
### 3.3 实时显示
- **曲线**ScottPlot每通道一条线X 轴时间(ms 或样本序号)Y 轴电压(V),量程决定 Y 范围(±5 或 ±1)。只画最近一屏的点(降采样显示,见 §7
- **表格**:每通道一行,列 = 通道名 / 最新值 / Min / Max / RMS随采集刷新节流到 ~1020 Hz
### 3.4 采集参数控制
- 通道数下拉1/2/4/8。
- 量程下拉±5V / ±1V。
- 采样率:选分频器 N 或预设档,旁显实际 `100e6/N`
- 模式:连续 / 有限点(有限点需填点数)。
### 3.5 存盘格式(见 §8与未来 Python 分析对齐)
---
## 4. 数据解析Acquisition/CodeConverter.cs
实现两个纯函数(无副作用、无 SDK 依赖、可单测):
1. `CodeToVolts(ushort code, InputRange range)` → 按 §1.1 公式返回 V。
2. `Deinterleave(ReadOnlySpan<ushort> raw, int channelCount, InputRange range)``double[][]`[通道][点]),按 §1.2 排列解交错并换算。
单元测试验收:`code=0x8000` → 0V`code=0xFFFF` → +5V 量程下约 +4.99985V`code=0` → 5V。
---
## 5. 各层职责(不写函数名,描述 API 类别)
### 5.1 IDigitizer 接口应暴露的能力
- 枚举设备 → 返回 `IReadOnlyList<DeviceInfo>`
- 按逻辑号打开 / 关闭。
- 用 `AcquisitionConfig` 初始化采集(设量程、通道掩码、时钟分频、模式、软件触发)。
- 启动采集:以**回调或 IAsyncEnumerable** 的方式持续吐出 `SampleBlock`(已解交错、已换算),直到取消或有限点采满。
- 实现 `IDisposable` 释放 SDK 资源。
### 5.2 Pcie8586Digitizer真卡唯一含 P/Invoke
`Samples/VC/Simple/AD/Continue` 的调用顺序翻译。**典型**连续采集流程(具体函数名看 Samples
1. **创建设备**`CreateDevice(逻辑号)` → 返回设备句柄(HANDLE/IntPtr)。判断无效值(通常 0 或 -1/INVALID_HANDLE_VALUE
2. **配置参数**:填充 SDK 的"AD 参数结构体"(量程枚举、通道数/掩码、`ADC时钟分频器 = config.ClockDivider`、采集模式、触发源=软件触发、是否主卡等),调用初始化函数(`InitDeviceAD` / `SetADParam` 一类)。
3. **启动**`StartDeviceAD(句柄)`。
4. **读 DMA**:循环调用读取函数(`GetDeviceAD` / `ReadDeviceAD`,参数通常是 `句柄, 缓冲区指针, 期望点数, 超时ms`),返回实际读到的点数。把读到的 `ushort[]` 原始码值交给 `CodeConverter.Deinterleave``SampleBlock` → 回调。
5. **软件触发**:若初始化为软件触发,需在 Start 后调用一次软件触发函数(手册 4.8.2)。
6. **停止/释放**`StopDeviceAD(句柄)` → `ReleaseDevice(句柄)`
读取循环必须在**后台线程/Task**,不可阻塞 UI 线程。缓冲区用 `GCHandle.Alloc(buf, GCHandleType.Pinned)` 固定后传 `AddrOfPinnedObject()`,用完 `Free()`;或用 `Marshal.AllocHGlobal` + `Marshal.Copy`
### 5.3 SimulatedDigitizer模拟卡
- 不碰 SDK。内部按 §1.2 布局生成**交错的 ushort 原始码值**(每通道不同频率正弦 + 1% 噪声),再走与真卡**完全相同**的 `Deinterleave` 路径,确保两条路径解析逻辑一致。
- 按配置的采样率节流出块(建议每秒约 30 块,每块点数 = 采样率/30 上限封顶几千点),`await Task.Delay` 模拟 DMA 节奏。
- 支持连续与有限点(有限点采满点数后结束)。
### 5.4 MainViewModelUI 线程安全是重点)
- 用 `CommunityToolkit.Mvvm``[ObservableProperty]`/`[RelayCommand]`。
- **高速数据进 UI 的关键**:采集回调在后台线程触发,**不要**每块都 `Dispatcher.Invoke` 更新绑定属性(会卡死 UI。正确做法
- 后台把最新数据写入一个**无锁/带锁的"最新帧"缓冲**
- 用一个 `DispatcherTimer`~50ms即 20Hz在 UI 线程定时把最新帧刷到 ScottPlot 和表格。
- 即"采集高频、渲染定频",解耦两者速率。
- 命令:`Open/Close/StartMonitor/StopMonitor/Record(时长)/ClearScreen/SaveClip(起,止)`。
---
## 6. P/Invoke 翻译方法论VC 头文件 → C#
Claude Code 对着 `Include/*.h` 按下表翻译。**逐个核对头文件的真实类型,不要套用记忆。**
| C / VC 头文件 | C# P/Invoke | 备注 |
|---|---|---|
| `HANDLE` / `void*` / `DEVICE_HANDLE` | `IntPtr` | 设备句柄一律 IntPtr |
| `int` / `LONG` | `int` | 4 字节 |
| `unsigned int` / `DWORD` / `ULONG` | `uint` | 时钟分频器常是 DWORD |
| `unsigned short` / `WORD` / `USHORT` | `ushort` | 原始码值类型 |
| `unsigned char` / `BYTE` | `byte` | |
| `BOOL` | `[return: MarshalAs(UnmanagedType.Bool)] ... bool` 或直接 `int` | BOOL 是 4 字节 int别用 1 字节 bool |
| `char*`(入参字符串) | `string` + `CharSet` / 或 `byte[]` | 看是 ANSI 还是宽字符 |
| `WORD* pData` / `void* pBuffer`(缓冲区) | `IntPtr` + pinning`ushort[]` | 大缓冲建议 IntPtr + Marshal.Copy |
| `struct { ... }`(参数结构体) | `[StructLayout(LayoutKind.Sequential)] struct` | **字段顺序、类型、对齐必须 1:1** |
| `enum` | C# `enum : int` 或直接用 int 常量 | |
`[DllImport]` 模板:
```csharp
[DllImport("PCIe8586M.dll", // ← DLL 名以实际为准(看驱动安装目录/Samples 链接的 .lib
CallingConvention = CallingConvention.StdCall, // ← VC 常是 __stdcall若 .h 里是 __cdecl 则改 Cdecl
CharSet = CharSet.Ansi,
SetLastError = true)]
private static extern IntPtr 函数名(参数);
```
### 6.1 已知坑
1. **调用约定**:阿尔泰 DLL 多为 `__stdcall`=`StdCall`)。若崩溃在调用后栈不平衡(`PInvokeStackImbalance` 调试警告),改 `CallingConvention`。看 `.h` 里是否有 `WINAPI`/`__stdcall`/`__cdecl` 宏。
2. **结构体对齐**:若 `.h` 里有 `#pragma pack(1)`C# struct 要 `[StructLayout(LayoutKind.Sequential, Pack = 1)]`。错了会导致字段错位、参数乱掉。
3. **BOOL ≠ bool**C 的 `BOOL` 是 4 字节。直接用 C# `bool`(1字节) 编组会错位,用 `UnmanagedType.Bool` 或声明成 `int`
4. **缓冲区生命周期**:读 DMA 的缓冲必须 pinned 或非托管堆分配,传指针期间不能被 GC 移动。循环里复用同一块缓冲,别每块 new。
5. **句柄无效判断**`CreateDevice` 失败可能返回 `0`、`-1` 或 `0xFFFFFFFF`,看 Samples 里怎么判断的,照抄。
6. **x86/x64**DLL 是 64 位 → 工程必须 x64否则 `BadImageFormatException`
7. **DLL 找不到**:运行时把 SDK 的 DLL 放 exe 同目录(或加 PATH。开发期 DLL 不在本机属正常,模拟卡不需要它。
---
## 7. 性能与内存约束
- 8 通道 @ 100MS/s = 1600 MB/s 原始数据(手册 4.9)。**调试程序不要全速 8 通道连续显示**,会爆。测试时用降速(如 1MS/s或少通道。
- **显示降采样**ScottPlot 一屏最多画几千个点。来一块几万点的数据,画之前做 min/max 抽稀每像素列取最值否则渲染卡。ScottPlot 的 `Signal` 类型对密集点有内建优化,优先用。
- **录制/剪辑缓冲上限**`RingHistoryBuffer` 按"最近 N 秒 × 采样率 × 通道数 × 4字节(float)"预估,设硬上限(如 ≤ 500MB超出丢最旧。UI 标明可剪辑的历史长度。
- **采集频率 vs 渲染频率解耦**:见 §5.4,渲染固定 ~20Hz。
---
## 8. 存盘格式(与未来 Python 分析对齐)
每次录制/剪辑输出两个文件:
- `{name}.bin``float32` 小端,按通道**交错**`CH0[0]CH1[0]..CHn[0]CH0[1]..`(电压,单位 V
- `{name}.json`:元数据头:
```json
{
"channel_count": 8,
"sample_rate_hz": 1000000.0,
"input_range": "5V",
"samples_per_channel": 10000,
"dtype": "float32",
"layout": "interleaved",
"unit": "volt",
"recorded_at": "ISO8601",
"duration_ms": 10.0
}
```
> Python 读法(未来):`np.fromfile(bin, dtype='<f4').reshape(-1, channel_count).T` 即得 [通道][]本程序阶段不实现 Python
---
## 9. 推荐开发顺序(里程碑)
1. **M1 骨架编译通过**:建工程(x64/WPF) + `Models` + `IDigitizer` + 空 `SimulatedDigitizer`,能 `dotnet build`
2. **M2 模拟卡出数据**`CodeConverter` + `SimulatedDigitizer` 生成交错码值并解析,控制台/单测打印验证电压正确§4 验收点)。
3. **M3 UI 实时显示**MainWindow + ScottPlot 曲线 + 表格,跑模拟卡看到滚动波形,验证 §5.4 的"采集高频渲染定频"不卡。
4. **M4 录制与剪辑**`RingHistoryBuffer` + `Recorder` + `WaveformWriter`,验证 §3.2 录制点数精确、剪辑正确。
5. **M5 设备识别 UI**:自动枚举 + 手动逻辑号(仍走模拟卡)。
6. **M6 真卡接入**:读 `Samples/VC/Include``Continue` 示例,实现 `Pcie8586Digitizer`,照 §5.2/§6 翻译 P/Invoke。换掉模拟卡连真硬件联调。
7. **M7 抽离复用层**:确认 `Hardware`+`Acquisition` 无 WPF 依赖,整理成可被主项目引用的形态。
每个里程碑用模拟卡保证可独立验证,真硬件只在 M6 才需要。
---
## 10. 验收清单
- [ ] x64 编译,模拟卡下无硬件即可运行。
- [ ] 码值换算单测通过0x8000→0V 等)。
- [ ] 解交错对 1/2/4/8 通道均正确。
- [ ] 实时曲线 + 表格在模拟卡 1MS/s 下流畅UI 不卡)。
- [ ] 采样率 UI 只允许 100e6/N 离散值,旁显实际值。
- [ ] 定时录制 1ms/10ms/100ms/1s/10s落盘点数精确。
- [ ] 剪辑任意 [起,止) 区间另存正确。
- [ ] 存盘 .bin/.json 格式符合 §8。
- [ ] `Hardware`+`Acquisition` 两层不含任何 WPF/UI 引用。
- [ ] 真卡实现仅 `Pcie8586Digitizer.cs``[DllImport]`
- [ ] 真卡 CreateDevice→Configure→Start→读DMA→Stop→Release 全流程联通。

View File

@ -0,0 +1,44 @@
# PCIe8586 驱动接入包
本目录用于整体复制到主项目。它来自已经通过调试工具测试的 PCIe8586 采集实现,包含可复用 C# 驱动层、采集支持代码、接入示例、AI 开发指导和厂商开发参考文件。
## 目录
```text
DriverIntegrationPackage/
├─ AI_INTEGRATION_GUIDE.md AI/开发者实施接入时的主指导文档
├─ docs/
│ ├─ API_AND_DATA_FORMAT.md 接口、参数、采样数据和文件格式
│ ├─ DEPLOYMENT.md 驱动、DLL、位数和发布要求
│ └─ reference/ 厂商 PCIe8582/8584/8586 手册
├─ examples/ConsoleIntegration/ 最小完整调用示例
├─ native/README.md ACTS1000_64.dll 放置说明
├─ src/Pcie8586.Driver/ 可直接 ProjectReference 的 .NET 类库
└─ vendor/
├─ include/ACTS1000.h 厂商 C 接口声明
└─ lib/x64/ACTS1000_64.lib 原生 C/C++ x64 导入库
```
## 最快接入
1. 将整个目录复制进主项目仓库。
2. 主项目添加项目引用:
```xml
<ProjectReference Include="相对路径\DriverIntegrationPackage\src\Pcie8586.Driver\Pcie8586.Driver.csproj" />
```
3. 主项目和最终进程必须为 `x64`,运行环境为 Windows。
4. 在目标机安装厂商 PCIe8586 驱动,并确保进程能加载 `ACTS1000_64.dll`
5. 按 `examples/ConsoleIntegration/Program.cs` 的生命周期调用。
类库源码沿用已验证调试工具的命名空间 `Pcie8586Probe.*`,以保持代码与测试版本一致。主项目可以先原样接入,确认真卡采集后再统一重命名。
## 边界
- `ACTS1000_64.lib` 只供原生 C/C++ 链接C# 项目不需要引用它。
- 仓库中没有厂商运行时 `ACTS1000_64.dll`,也没有 `.sys/.inf/.cat` 驱动安装文件,不能用本目录代替厂商驱动安装包。
- UI、ScottPlot 和 CommunityToolkit.Mvvm 没有进入接入包。
- 当前真卡配置使用板载时钟、内部时基、软件触发、DC 耦合和 1 MΩ 输入。
实施接入前请先阅读 [AI_INTEGRATION_GUIDE.md](AI_INTEGRATION_GUIDE.md)。

View File

@ -0,0 +1 @@
Rename sys.exe sys_32.exe

View File

@ -0,0 +1 @@
2014/6/19 新增此32 64 位演示程序 JRL

View File

@ -0,0 +1,253 @@
//#include <ansi_c.h>
#include "windows.h"
#include <ACTS1000.H>
#include <stdio.h>
static int (__stdcall *getch)(void);
static int (__stdcall *kbhit)(void);
int InputRange;
#define AD_DATA_LEN 256*1024 // 要读取和处理的AD数据长度点或字
USHORT ADBuffer[AD_DATA_LEN]; // 分配缓冲区(存储原始数据)
int main (int argc, char *argv[])
{
HANDLE hDevice;
int DeviceLgcID;
ULONG ulDDR2Length = 0;
ULONGLONG ulDDR2LengthByte = 0;
ACTS1000_PARA_AD ADPara; // 硬件参数
ACTS1000_STATUS_AD ADStatus;
ULONG nRetSizeWords;
ULONG nAvailSampsPoints;
ULONG nRead;
int nCurrentChannel = 0,nADChannel = 0;
WORD ADData;
float fVolt;
ACTS1000_AD_MAIN_INFO ADMainInfo;
WORD wMaxLSB = 0x3FFF;
float fLsbCount = 16384.0;
int nCH=0;
int ChannelCount = 0;
LONG ulTime = GetTickCount();
double dResult;
__int64 i64Cnt=0;
LONG ulTmp=0;
LONG ulSecCnt=0;
ULONGLONG ulReadCount = 0;
ULONG nTChannel = 0;
int Index=0;
HINSTANCE hInst = LoadLibrary("MSVCRT.DLL");
getch = GetProcAddress(hInst, "_getch");
kbhit = GetProcAddress(hInst, "_kbhit");
DeviceLgcID = 0;
printf("请输入逻辑ID:");
scanf("%d", &DeviceLgcID);
hDevice = ACTS1000_CreateDevice(DeviceLgcID); // 创建设备对象
if(hDevice == INVALID_HANDLE_VALUE)
{
printf("CreateDevice error...\n");
getch();
return 0; // 如果创建设备对象失败,则返回
}
ACTS1000_GetMainInfo(hDevice,&ADMainInfo); // DDR2的长度(单位MB)
switch (ADMainInfo.nDeviceType>>16)
{
case 0x2012:
printf("PXIE%04X\n",ADMainInfo.nDeviceType&0xFFFF);
break;
case 0x2111:
printf("PCIE%04X\n",ADMainInfo.nDeviceType&0xFFFF);
break;
default:
printf("ACTS1000-%04X\n",ADMainInfo.nDeviceType);
}
ulDDR2LengthByte = ADMainInfo.nDepthOfMemory;
wMaxLSB = (WORD)(ADMainInfo.nSampCodeCount - 1);
fLsbCount = (float)ADMainInfo.nSampCodeCount;
InputRange = ACTS1000_INPUT_N1000_P1000mV; // 要求用户从键盘上选择输入量程
memset(&ADPara, 0x00, sizeof(ADPara)); // 将各项参数复位至确定值0(强烈建议)
// 预置硬件参数
ADPara.SampleMode = ACTS1000_SAMPMODE_CONTINUOUS; // 有限点采样
ADPara.FreqDivision = 1;
for (nCH=0; nCH<ADMainInfo.nChannelCount; nCH++)
{
ADPara.bChannelArray[nCH] = TRUE; // 允许通道0采样
ADPara.InputRange[nCH] = InputRange; // 模拟量输入量程范围
ADPara.CouplingType[nCH] = ACTS1000_COUPLING_DC; // 直流耦合
}
ADPara.M_Length = 0; // M长度
ADPara.N_Length = 1024*32; // N长度
ADPara.PFISel = ACTS1000_PFISEL_TRIG_IN;
ADPara.TriggerMode = ACTS1000_TRIGMODE_POST; // 后触发
ADPara.TriggerSource = ACTS1000_TRIGMODE_SOFT; // 软件触发
ADPara.TriggerDir = ACTS1000_TRIGDIR_NEGATIVE; // 下降沿触发
ADPara.TrigLevelVolt = 0;
ADPara.ReferenceClock = ACTS1000_RECLK_ONBOARD; // 使用内部时钟
ADPara.TimeBaseClock = ACTS1000_TBCLK_IN;
ADPara.bMasterEn = 0;
ADPara.TrigCount = 1;
ADPara.SyncTrigSignal = ACTS1000_STS_TRIGGER0;
ADPara.bClkOutEn = 0;
ADPara.ClkOutSel = ACTS1000_CLKOUT_REFERENCE;
ADPara.bTrigOutEn = 0;
ADPara.TrigOutPolarity = ACTS1000_TOP_POSITIVE;
ADPara.TrigOutWidth = 50;
ADPara.bSaveFile = 0;
if(!ACTS1000_InitDeviceAD(hDevice, &ADPara)) // 初始化硬件
{
printf("InitDeviceAD error...\n");
getch();
return 0; // 如果创建设备对象失败,则返回
}
ChannelCount = 0;
for(nADChannel=0; nADChannel<ADMainInfo.nChannelCount; nADChannel++)
{
if(ADPara.bChannelArray[nADChannel] == TRUE)
{
ChannelCount++;
}
}
ulTime = GetTickCount();
dResult = 1.0;
i64Cnt=0;
ulTmp=0;
ulSecCnt=0;
if(!ACTS1000_StartDeviceAD(hDevice)) // 启动设备
{
printf("StartDeviceAD Error...\n");
getch();
}
if(!ACTS1000_SetDeviceTrigAD(hDevice)) // 触发AD
{
printf("SetDeviceTrigAD Error...\n");
getch();
}
ulTime = GetTickCount();
ulReadCount = 0;
nRead = AD_DATA_LEN;
if (ADPara.bSaveFile) // 自动存盘
{
while(TRUE)
{
if(!ACTS1000_GetDevStatusAD(hDevice, &ADStatus))
{
printf("GetDevStatusAD Error\n");
goto ExitRead;
}
if(kbhit())
goto ExitRead; // 如果用户按键,则退出
Sleep(1);
ulTmp = GetTickCount()-ulTime;
if (ulTmp/1000>ulSecCnt)
{
ulSecCnt = ulTmp/1000;
dResult = ADStatus.lSavePoints*1.00/((ulTmp+1)/1000.0);
dResult=dResult/1000000.0;
printf("%dS ",ulSecCnt);
printf("%.3fM点/秒\n",dResult);
}
}
}
else
{
while ( !kbhit() )
{
if(!ACTS1000_ReadDeviceAD(hDevice, ADBuffer, nRead, &nRetSizeWords, &nAvailSampsPoints,5.0))
{
printf("ReadDeviceDmaAD error...\n");
getch();
goto ExitRead;
}
if (nRetSizeWords<=0)
{
continue;
}
ulReadCount+=nRetSizeWords;
#if 1
ulTmp = GetTickCount()-ulTime;
if (ulTmp/1000>ulSecCnt)
{
ulSecCnt = ulTmp/1000;
dResult = ulReadCount*1.00/((ulTmp+1)/1000.0);
dResult=dResult/1000000.0;
printf("%dS ",ulSecCnt);
printf("%.3fM点/秒\n",dResult);
nTChannel = 0;
for(Index=0; Index<8; Index++)
{
for(nADChannel=nTChannel; nADChannel<ChannelCount; nADChannel++)
{
if(ADPara.bChannelArray[nADChannel] == TRUE) // 如果此通道被采样
{
nTChannel = nADChannel + 1;
ADData = ADBuffer[Index]&wMaxLSB;
// 将原码转换为电压值
switch(InputRange)
{
case 1: // -1000mV - +1000mV
fVolt = (float)((2000.0/fLsbCount) * ADData - 1000.0);
break;
case 0: // -5000mV - +5000mV
fVolt = (float)((10000.0/fLsbCount) * ADData - 5000.0);
break;
default:
break;
}
printf("CH%02d=%6.2f\t", nADChannel, fVolt); // 显示电压值
if ((Index+1) % ChannelCount == 0)
{
nTChannel = 0;
printf("\n");
}
break;
}
}
} // for(Index=0; Index<64; Index++)
}
#endif
}
}
ExitRead:
ACTS1000_StopDeviceAD(hDevice); // 停止AD
ACTS1000_ReleaseDeviceAD(hDevice); // 释放AD
ACTS1000_ReleaseDevice(hDevice); // 释放设备对象
return 0;
}

View File

@ -0,0 +1,166 @@
[Workspace Header]
Version = 1001
Pathname = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue1/Sys.cws"
CVI Dir = "/c/program files (x86)/national instruments/cvi2010"
CVI Shared Dir = "/C/Program Files (x86)/National Instruments/Shared/CVI"
CVI Pub Local Dir = "/C/ProgramData/National Instruments/CVI2010"
CVI Pub Global Dir = "/C/ProgramData/National Instruments/CVI"
IVI Standard Root Dir = "/C/Program Files (x86)/IVI Foundation/IVI"
IVI Standard Root 64-bit Dir = "/C/Program Files/IVI Foundation/IVI"
VXIplug&play Framework Dir = "/C/Program Files (x86)/IVI Foundation/VISA/winnt"
VXIplug&play Framework 64-bit Dir = "/C/Program Files/IVI Foundation/VISA/win64"
Number of Projects = 1
Active Project = 1
Project 0001 = "Sys.prj"
Drag Bar Left = 160
Window Top = 78
Window Left = 31
Window Bottom = 580
Window Right = 821
Maximized = True
Maximized Children = True
Max32 Number Of Errors = 20
Track Include File Dependencies = True
Prompt For Missing Includes = True
Stop On First Error File = False
Bring Up Err Win For Warnings = True
Show Build Dialog = False
Save Changes Before Running = "Always"
Save Changes Before Compiling = "Always"
Hide Windows = False
Break At First Statement = False
Sort Type = "File Name"
Number of Opened Files = 2
Window Confinement Region Enabled = True
MainColumnWidth = 143
FileDateColumnWidth = 70
FileSizeColumnWidth = 70
StatusColumnWidth = 70
[Project Header 0001]
Version = 1001
Don't Update DistKit = False
Platform Code = 4
Build Configuration = "Release"
Warn User If Debugging Release = 1
Batch Build Release = False
Batch Build Debug = False
Force Rebuild = False
[File 0001]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue1/Sys.c"
File Type = "CSource"
Disk Date = 3708407515
In Projects = "1,"
Window Top = 38
Window Z-Order = 1
Source Window State = "1,163,163,163,93,94,94,0,0,288,0,0,0,0,0,60,142,0,172,51,400,600,1,0,"
[File 0002]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue1/ACTS1000.h"
File Type = "Include"
Disk Date = 3708388578
In Projects = "1,"
Window Top = 192
Window Left = 91
Window Z-Order = 2
Source Window State = "1,327,337,337,0,15,15,0,0,122,0,0,0,0,0,25,317,0,327,0,323,769,1,0,"
[File 0003]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue1/CONIO.H"
File Type = "Include"
Disk Date = 0
In Projects = "1,"
Window Top = 32
Window Left = 6
Source Window State = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"
[File 0004]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue1/ACTS1000_32.lib"
File Type = "Library"
Disk Date = 3704698817
In Projects = "1,"
[Default Build Config 0001 Debug]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Release]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Debug64]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Release64]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Build Options 0001]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Execution Trace = "Disabled"
Profile = "Disabled"
Debugging Level = "Standard"
Break On Library Errors = True
Break On First Chance Exceptions = False
[Execution Target 0001]
Execution Target Address = "Local desktop computer"
Execution Target Port = 0
Execution Target Type = 0
[SCC Options 0001]
Use global settings = True
SCC Provider = ""
SCC Project = ""
Local Path = ""
Auxiliary Path = ""
Perform Same Action For .h File As For .uir File = "Ask"
Perform Same Action For .cds File As For .prj File = "Ask"
Username = ""
Comment = ""
Use Default Username = False
Use Default Comment = True
Suppress CVI Error Messages = False
Always show confirmation dialog = True
[DLL Debugging Support 0001]
External Process Path = ""
[DLLs Used By Executable 0001]
DLL 0001 = "/C/Windows/SYSTEM32/ACTS1000_32.dll"
[Command Line Args 0001]
Command Line Args = ""
Working Directory = ""

View File

@ -0,0 +1,368 @@
[Project Header]
Version = 1001
Pathname = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.prj"
CVI Dir = "/c/program files (x86)/national instruments/cvi2010"
CVI Shared Dir = "/C/Program Files (x86)/National Instruments/Shared/CVI"
CVI Pub Local Dir = "/C/ProgramData/National Instruments/CVI2010"
CVI Pub Global Dir = "/C/ProgramData/National Instruments/CVI"
IVI Standard Root Dir = "/C/Program Files (x86)/IVI Foundation/IVI"
VXIplug&play Framework Dir = "/C/Program Files (x86)/IVI Foundation/VISA/winnt"
IVI Standard Root 64-bit Dir = "/C/Program Files/IVI Foundation/IVI"
VXIplug&play Framework 64-bit Dir = "/C/Program Files/IVI Foundation/VISA/win64"
Number of Files = 4
Target Type = "Executable"
Flags = 1040
Copied From Locked InstrDrv Directory = False
Copied from VXIPNP Directory = False
Locked InstrDrv Name = ""
Don't Display Deploy InstrDrv Dialog = False
[File 0001]
File Type = "Include"
Res Id = 1
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "ACTS1000.h"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/ACTS1000.h"
Exclude = False
Project Flags = 0
Folder = "Include Files"
[File 0002]
File Type = "Include"
Res Id = 2
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "CONIO.H"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/CONIO.H"
Exclude = False
Project Flags = 0
Folder = "Include Files"
[File 0003]
File Type = "CSource"
Res Id = 3
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "Sys.c"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.c"
Exclude = False
Compile Into Object File = False
Project Flags = 0
Folder = "Source Files"
[File 0004]
File Type = "Library"
Res Id = 4
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "ACTS1000_32.lib"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/ACTS1000_32.lib"
Exclude = False
Project Flags = 0
Folder = "Not In A Folder"
[Folders]
User Interface Files Folder Not Added Yet = True
Instrument Files Folder Not Added Yet = True
Folder 0 = "Include Files"
Folder 1 = "Source Files"
[Custom Build Configs]
Num Custom Build Configs = 0
[Default Build Config Debug]
Config Name = "Debug"
Is 64-Bit = False
Is Release = False
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Release]
Config Name = "Release"
Is 64-Bit = False
Is Release = True
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Debug64]
Config Name = "Debug64"
Is 64-Bit = True
Is Release = False
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Release64]
Config Name = "Release64"
Is 64-Bit = True
Is Release = True
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Compiler Options]
Default Calling Convention = "cdecl"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
O Option Compatible With 5.0 = False
Enable C99 Extensions = False
Uninitialized Locals Compile Warning = "Conservative"
Precompile Prefix Header = False
Prefix Header File = ""
[Run Options]
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
[Compiler Defines]
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
[Include Paths]
Include Path 1 Is Rel = True
Include Path 1 Rel To = "Project"
Include Path 1 Rel Path = ""
Include Path 1 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue"
[Create Executable]
Executable File_Debug Is Rel = True
Executable File_Debug Rel To = "Project"
Executable File_Debug Rel Path = "Sys_dbg.exe"
Executable File_Debug = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys_dbg.exe"
Executable File_Release Is Rel = True
Executable File_Release Rel To = "Project"
Executable File_Release Rel Path = "Sys.exe"
Executable File_Release = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Executable File_Debug64 Is Rel = True
Executable File_Debug64 Rel To = "Project"
Executable File_Debug64 Rel Path = "Sys.exe"
Executable File_Debug64 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Executable File_Release64 Is Rel = True
Executable File_Release64 Rel To = "Project"
Executable File_Release64 Rel Path = "Sys.exe"
Executable File_Release64 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Exports = "Include File Symbols"
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
Type Lib Guid = ""
Runtime Support = "Full Runtime Support"
Instrument Driver Support Only = False
Embed Project .UIRs = False
Generate Map File = False
[External Compiler Support]
UIR Callbacks File Option = 0
Using LoadExternalModule = False
Create Project Symbols File = True
UIR Callbacks Obj File Is Rel = False
UIR Callbacks Obj File = ""
Project Symbols H File Is Rel = False
Project Symbols H File = ""
Project Symbols Obj File Is Rel = False
Project Symbols Obj File = ""
[ActiveX Server Options]
Specification File Is Rel = False
Specification File = ""
Source File Is Rel = False
Source File = ""
Include File Is Rel = False
Include File = ""
IDL File Is Rel = False
IDL File = ""
Register ActiveX Server = False
[Signing Info]
Sign = False
Sign Debug Build = False
Store = ""
Certificate = ""
Timestamp URL = ""
URL = ""
[Manifest Info]
Embed = False
[tpcSection]
tpcEnabled = 0
tpcOverrideEnvironment = 0
tpcEnabled x64 = 0
tpcOverrideEnvironment x64 = 0

View File

@ -0,0 +1 @@
Rename sys.exe sys_32.exe

View File

@ -0,0 +1 @@
2014/6/19 新增此32 64 位演示程序 JRL

View File

@ -0,0 +1,295 @@
//#include <ansi_c.h>
#include "windows.h"
#include <ACTS1000.H>
#include <stdio.h>
static int (__stdcall *getch)(void);
static int (__stdcall *kbhit)(void);
#define AD_DATA_LEN 256*1024 // 要读取和处理的AD数据长度点或字
USHORT ADBuffer[AD_DATA_LEN]; // 分配缓冲区(存储原始数据)
int main (int argc, char *argv[])
{
HANDLE hDevice;
int DeviceLgcID;
ULONG ulDDR2Length = 0;
ACTS1000_PARA_AD ADPara; // 硬件参数
ACTS1000_STATUS_AD ADStatus;
ULONG nRetSizeWords;
ULONG nAvailSampsPoints;
ULONGLONG nReadSizeRemain;
ULONGLONG nReadSizeWords;
ULONG nRead;
ULONG InputRange = ACTS1000_INPUT_N1000_P1000mV;
int nADChannel = 0;
WORD ADData;
float fVolt;
ACTS1000_AD_MAIN_INFO ADMainInfo;
WORD wMaxLSB = 0x3FFF;
float fLsbCount = 16384.0;
int nCH=0;
int ChannelCount = 0;
LONG ulTime = GetTickCount();
double dResult;
__int64 i64Cnt=0;
LONG ulTmp=0;
LONG ulSecCnt=0;
ULONGLONG ulReadCount = 0;
ULONG nTChannel = 0;
int Index=0;
HINSTANCE hInst = LoadLibrary("MSVCRT.DLL");
getch = GetProcAddress(hInst, "_getch");
kbhit = GetProcAddress(hInst, "_kbhit");
DeviceLgcID = 0;
printf("请输入逻辑ID:");
scanf("%d", &DeviceLgcID);
hDevice = ACTS1000_CreateDevice(DeviceLgcID); // 创建设备对象
if(hDevice == INVALID_HANDLE_VALUE)
{
printf("CreateDevice error...\n");
getch();
return 0; // 如果创建设备对象失败,则返回
}
ACTS1000_GetMainInfo(hDevice,&ADMainInfo); // DDR2的长度(单位MB)
switch (ADMainInfo.nDeviceType>>16)
{
case 0x2012:
printf("PXIE%04X\n",ADMainInfo.nDeviceType&0xFFFF);
break;
case 0x2111:
printf("PCIE%04X\n",ADMainInfo.nDeviceType&0xFFFF);
break;
default:
printf("ACTS1000-%04X\n",ADMainInfo.nDeviceType);
}
wMaxLSB = (WORD)(ADMainInfo.nSampCodeCount - 1);
fLsbCount = (float)ADMainInfo.nSampCodeCount;
memset(&ADPara, 0x00, sizeof(ADPara)); // 将各项参数复位至确定值0(强烈建议)
// 预置硬件参数
ADPara.SampleMode = ACTS1000_SAMPMODE_FINITE; // 有限点采样
ADPara.FreqDivision = 1;
for ( nCH=0; nCH<ADMainInfo.nChannelCount; nCH++)
{
ADPara.bChannelArray[nCH] = TRUE; // 允许通道0采样
ADPara.InputRange[nCH] = ACTS1000_INPUT_N1000_P1000mV; // 量程只支持±1000mV
ADPara.CouplingType[nCH] = ACTS1000_COUPLING_DC; // 直流耦合
}
ADPara.M_Length = 0; // M长度
ADPara.N_Length = 536870912; // N长度
ADPara.PFISel = ACTS1000_PFISEL_TRIG_IN;
ADPara.TriggerMode = ACTS1000_TRIGMODE_POST; // 硬件中间触发(包括预触发、后触发功能)
ADPara.TriggerSource = ACTS1000_TRIGMODE_SOFT; // 软件触发
ADPara.TriggerDir = ACTS1000_TRIGDIR_NEGATIVE; // 下降沿触发
ADPara.TrigLevelVolt = 0;
ADPara.ReferenceClock = ACTS1000_RECLK_ONBOARD; // 使用内部时钟
ADPara.TimeBaseClock = ACTS1000_TBCLK_IN;
ADPara.bMasterEn = 0;
ADPara.TrigCount = 1; // 为0时表示无限触发
ADPara.SyncTrigSignal = ACTS1000_STS_TRIGGER0;
ADPara.bClkOutEn = 0;
ADPara.ClkOutSel = ACTS1000_CLKOUT_REFERENCE;
ADPara.bTrigOutEn = 0;
ADPara.TrigOutPolarity = ACTS1000_TOP_POSITIVE;
ADPara.TrigOutWidth = 50;
ADPara.bSaveFile = 0;
if(!ACTS1000_InitDeviceAD(hDevice, &ADPara)) // 初始化硬件
{
printf("InitDeviceAD error...\n");
getch();
return 0; // 如果创建设备对象失败,则返回
}
ChannelCount = 0;
for(nADChannel=0; nADChannel<ADMainInfo.nChannelCount; nADChannel++)
{
if(ADPara.bChannelArray[nADChannel] == TRUE)
{
ChannelCount++;
}
}
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_MIDL)
{
nReadSizeWords = (ADPara.M_Length + ADPara.N_Length)*ChannelCount;
}
else
{
nReadSizeWords = ADPara.N_Length;
nReadSizeWords = nReadSizeWords*ChannelCount;
}
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_POST || ADPara.TriggerMode == ACTS1000_TRIGMODE_DELAY)
{
if (ADPara.TrigCount==0)
{
nReadSizeWords = 0xFFFFFFFFFFFFFFFF;
}
else
{
nReadSizeWords = nReadSizeWords*ADPara.TrigCount;
}
}
ulTime = GetTickCount();
dResult = 1.0;
i64Cnt=0;
ulTmp=0;
ulSecCnt=-1;
if(!ACTS1000_StartDeviceAD(hDevice)) // 启动设备
{
printf("StartDeviceAD Error...\n");
getch();
}
if(!ACTS1000_SetDeviceTrigAD(hDevice)) // 触发AD
{
printf("SetDeviceTrigAD Error...\n");
getch();
}
ulTime = GetTickCount();
printf("请等待,您可以按任意键退出,但请不要直接关闭窗口强制退出...\n");
if (ADPara.bSaveFile) // 自动存盘
{
while(TRUE)
{
if(!ACTS1000_GetDevStatusAD(hDevice, &ADStatus))
{
printf("GetDevStatusAD Error\n");
goto ExitRead;
}
if(ADStatus.bComplete) // 自动存盘单次有限点任务是否完成
{
printf("有限采样完成按任意键退出\n");
goto ExitRead;
}
else
{
if(kbhit())
goto ExitRead; // 如果用户按键,则退出
Sleep(1);
ulTmp = GetTickCount()-ulTime;
if (ulTmp/1000>ulSecCnt)
{
ulSecCnt = ulTmp/1000;
dResult = ADStatus.lSavePoints*1.00/((ulTmp+1)/1000.0);
dResult=dResult/1000000.0;
printf("%dS ",ulSecCnt);
printf("%.3fM点/秒\n",dResult);
}
}
}
}
else
{
nReadSizeRemain = nReadSizeWords;
while (nReadSizeRemain>0)
{
if (nReadSizeRemain>=AD_DATA_LEN)
{
nRead = AD_DATA_LEN;
}
else
{
nRead = nReadSizeRemain;
}
NextRead:
if(kbhit()) goto ExitRead;
if(!ACTS1000_ReadDeviceAD(hDevice, ADBuffer, nRead, &nRetSizeWords, &nAvailSampsPoints,1.0))
{
printf("ReadDeviceAD error...\n");
getch();
goto ExitRead;
}
if (nRetSizeWords<=0)
{
goto NextRead;
}
nReadSizeRemain = nReadSizeRemain-nRetSizeWords;
#if 1
ulTmp = GetTickCount()-ulTime;
if (ulTmp/1000>ulSecCnt)
{
ulSecCnt = ulTmp/1000;
dResult = (nReadSizeWords-nReadSizeRemain)*1.00/((ulTmp+1)/1000.0);
dResult=dResult/1000000.0;
printf("%dS ",ulSecCnt);
printf("%.3fM点/秒\n",dResult);
nTChannel = 0;
for(Index=0; Index<8; Index++)
{
for(nADChannel=nTChannel; nADChannel<ChannelCount; nADChannel++)
{
if(ADPara.bChannelArray[nADChannel] == TRUE) // 如果此通道被采样
{
nTChannel = nADChannel + 1;
ADData = ADBuffer[Index]&wMaxLSB;
// 将原码转换为电压值
switch(InputRange)
{
case 1: // -1000mV - +1000mV
fVolt = (float)((2000.0/fLsbCount) * ADData - 1000.0);
break;
case 0: // -5000mV - +5000mV
fVolt = (float)((10000.0/fLsbCount) * ADData - 5000.0);
break;
default:
break;
}
printf("CH%02d=%6.2f\t", nADChannel, fVolt); // 显示电压值
if ((Index+1) % ChannelCount == 0)
{
nTChannel = 0;
printf("\n");
}
break;
}
}
} // for(Index=0; Index<64; Index++)
}
#endif
}
if (nReadSizeRemain==0)
{
printf("有限点采样(%I64d字节)完成按任意键退出\n", nReadSizeWords*2);
}
}
ExitRead:
ACTS1000_StopDeviceAD(hDevice); // 停止AD
ACTS1000_ReleaseDeviceAD(hDevice); // 释放AD
ACTS1000_ReleaseDevice(hDevice); // 释放设备对象
getch();
return 0;
}

View File

@ -0,0 +1,166 @@
[Workspace Header]
Version = 1001
Pathname = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Finite/Sys.cws"
CVI Dir = "/c/program files (x86)/national instruments/cvi2010"
CVI Shared Dir = "/C/Program Files (x86)/National Instruments/Shared/CVI"
CVI Pub Local Dir = "/C/ProgramData/National Instruments/CVI2010"
CVI Pub Global Dir = "/C/ProgramData/National Instruments/CVI"
IVI Standard Root Dir = "/C/Program Files (x86)/IVI Foundation/IVI"
IVI Standard Root 64-bit Dir = "/C/Program Files/IVI Foundation/IVI"
VXIplug&play Framework Dir = "/C/Program Files (x86)/IVI Foundation/VISA/winnt"
VXIplug&play Framework 64-bit Dir = "/C/Program Files/IVI Foundation/VISA/win64"
Number of Projects = 1
Active Project = 1
Project 0001 = "Sys.prj"
Drag Bar Left = 160
Window Top = 78
Window Left = 31
Window Bottom = 580
Window Right = 821
Maximized = True
Maximized Children = True
Max32 Number Of Errors = 20
Track Include File Dependencies = True
Prompt For Missing Includes = True
Stop On First Error File = False
Bring Up Err Win For Warnings = True
Show Build Dialog = False
Save Changes Before Running = "Always"
Save Changes Before Compiling = "Always"
Hide Windows = False
Break At First Statement = False
Sort Type = "File Name"
Number of Opened Files = 2
Window Confinement Region Enabled = True
MainColumnWidth = 143
FileDateColumnWidth = 70
FileSizeColumnWidth = 70
StatusColumnWidth = 70
[Project Header 0001]
Version = 1001
Don't Update DistKit = False
Platform Code = 4
Build Configuration = "Release"
Warn User If Debugging Release = 1
Batch Build Release = False
Batch Build Debug = False
Force Rebuild = False
[File 0001]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Finite/Sys.c"
File Type = "CSource"
Disk Date = 3708407564
In Projects = "1,"
Window Top = 38
Window Z-Order = 1
Source Window State = "1,113,114,114,61,60,60,0,0,288,0,0,0,0,0,73,167,0,197,55,400,600,1,0,"
[File 0002]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Finite/ACTS1000.h"
File Type = "Include"
Disk Date = 3708388578
In Projects = "1,"
Window Top = 192
Window Left = 91
Window Z-Order = 2
Source Window State = "1,327,337,337,0,15,15,0,0,122,0,0,0,0,0,25,317,0,327,0,323,769,1,0,"
[File 0003]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Finite/CONIO.H"
File Type = "Include"
Disk Date = 0
In Projects = "1,"
Window Top = 32
Window Left = 6
Source Window State = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"
[File 0004]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Finite/ACTS1000_32.lib"
File Type = "Library"
Disk Date = 3704698817
In Projects = "1,"
[Default Build Config 0001 Debug]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Release]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Debug64]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Release64]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Build Options 0001]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Execution Trace = "Disabled"
Profile = "Disabled"
Debugging Level = "Standard"
Break On Library Errors = True
Break On First Chance Exceptions = False
[Execution Target 0001]
Execution Target Address = "Local desktop computer"
Execution Target Port = 0
Execution Target Type = 0
[SCC Options 0001]
Use global settings = True
SCC Provider = ""
SCC Project = ""
Local Path = ""
Auxiliary Path = ""
Perform Same Action For .h File As For .uir File = "Ask"
Perform Same Action For .cds File As For .prj File = "Ask"
Username = ""
Comment = ""
Use Default Username = False
Use Default Comment = True
Suppress CVI Error Messages = False
Always show confirmation dialog = True
[DLL Debugging Support 0001]
External Process Path = ""
[DLLs Used By Executable 0001]
DLL 0001 = "/C/Windows/SYSTEM32/ACTS1000_32.dll"
[Command Line Args 0001]
Command Line Args = ""
Working Directory = ""

View File

@ -0,0 +1,368 @@
[Project Header]
Version = 1001
Pathname = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.prj"
CVI Dir = "/c/program files (x86)/national instruments/cvi2010"
CVI Shared Dir = "/C/Program Files (x86)/National Instruments/Shared/CVI"
CVI Pub Local Dir = "/C/ProgramData/National Instruments/CVI2010"
CVI Pub Global Dir = "/C/ProgramData/National Instruments/CVI"
IVI Standard Root Dir = "/C/Program Files (x86)/IVI Foundation/IVI"
VXIplug&play Framework Dir = "/C/Program Files (x86)/IVI Foundation/VISA/winnt"
IVI Standard Root 64-bit Dir = "/C/Program Files/IVI Foundation/IVI"
VXIplug&play Framework 64-bit Dir = "/C/Program Files/IVI Foundation/VISA/win64"
Number of Files = 4
Target Type = "Executable"
Flags = 1040
Copied From Locked InstrDrv Directory = False
Copied from VXIPNP Directory = False
Locked InstrDrv Name = ""
Don't Display Deploy InstrDrv Dialog = False
[File 0001]
File Type = "Include"
Res Id = 1
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "ACTS1000.h"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/ACTS1000.h"
Exclude = False
Project Flags = 0
Folder = "Include Files"
[File 0002]
File Type = "Include"
Res Id = 2
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "CONIO.H"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/CONIO.H"
Exclude = False
Project Flags = 0
Folder = "Include Files"
[File 0003]
File Type = "CSource"
Res Id = 3
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "Sys.c"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.c"
Exclude = False
Compile Into Object File = False
Project Flags = 0
Folder = "Source Files"
[File 0004]
File Type = "Library"
Res Id = 4
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "ACTS1000_32.lib"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/ACTS1000_32.lib"
Exclude = False
Project Flags = 0
Folder = "Not In A Folder"
[Folders]
User Interface Files Folder Not Added Yet = True
Instrument Files Folder Not Added Yet = True
Folder 0 = "Include Files"
Folder 1 = "Source Files"
[Custom Build Configs]
Num Custom Build Configs = 0
[Default Build Config Debug]
Config Name = "Debug"
Is 64-Bit = False
Is Release = False
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Release]
Config Name = "Release"
Is 64-Bit = False
Is Release = True
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Debug64]
Config Name = "Debug64"
Is 64-Bit = True
Is Release = False
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Release64]
Config Name = "Release64"
Is 64-Bit = True
Is Release = True
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Compiler Options]
Default Calling Convention = "cdecl"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
O Option Compatible With 5.0 = False
Enable C99 Extensions = False
Uninitialized Locals Compile Warning = "Conservative"
Precompile Prefix Header = False
Prefix Header File = ""
[Run Options]
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
[Compiler Defines]
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
[Include Paths]
Include Path 1 Is Rel = True
Include Path 1 Rel To = "Project"
Include Path 1 Rel Path = ""
Include Path 1 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue"
[Create Executable]
Executable File_Debug Is Rel = True
Executable File_Debug Rel To = "Project"
Executable File_Debug Rel Path = "Sys_dbg.exe"
Executable File_Debug = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys_dbg.exe"
Executable File_Release Is Rel = True
Executable File_Release Rel To = "Project"
Executable File_Release Rel Path = "Sys.exe"
Executable File_Release = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Executable File_Debug64 Is Rel = True
Executable File_Debug64 Rel To = "Project"
Executable File_Debug64 Rel Path = "Sys.exe"
Executable File_Debug64 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Executable File_Release64 Is Rel = True
Executable File_Release64 Rel To = "Project"
Executable File_Release64 Rel Path = "Sys.exe"
Executable File_Release64 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Exports = "Include File Symbols"
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
Type Lib Guid = ""
Runtime Support = "Full Runtime Support"
Instrument Driver Support Only = False
Embed Project .UIRs = False
Generate Map File = False
[External Compiler Support]
UIR Callbacks File Option = 0
Using LoadExternalModule = False
Create Project Symbols File = True
UIR Callbacks Obj File Is Rel = False
UIR Callbacks Obj File = ""
Project Symbols H File Is Rel = False
Project Symbols H File = ""
Project Symbols Obj File Is Rel = False
Project Symbols Obj File = ""
[ActiveX Server Options]
Specification File Is Rel = False
Specification File = ""
Source File Is Rel = False
Source File = ""
Include File Is Rel = False
Include File = ""
IDL File Is Rel = False
IDL File = ""
Register ActiveX Server = False
[Signing Info]
Sign = False
Sign Debug Build = False
Store = ""
Certificate = ""
Timestamp URL = ""
URL = ""
[Manifest Info]
Embed = False
[tpcSection]
tpcEnabled = 0
tpcOverrideEnvironment = 0
tpcEnabled x64 = 0
tpcOverrideEnvironment x64 = 0

View File

@ -0,0 +1 @@
Rename sys.exe sys_32.exe

View File

@ -0,0 +1 @@
2014/6/19 新增此32 64 位演示程序 JRL

View File

@ -0,0 +1,73 @@
//#include <ansi_c.h>
#include "windows.h"
#include <ACTS1000.H>
#include <stdio.h>
static int (__stdcall *getch)(void);
static int (__stdcall *kbhit)(void);
int main (int argc, char *argv[])
{
HANDLE hDevice;
LONG DevID, LinkType;
LONG DeviceLgcID, DevicePhysID;
HINSTANCE hInst = LoadLibrary("MSVCRT.DLL");
getch = GetProcAddress(hInst, "_getch");
kbhit = GetProcAddress(hInst, "_kbhit");
DeviceLgcID = 0;
SlectLT:
printf("选择设备创建方式:0:逻辑 1:物理 ");
scanf("%d", &LinkType);
if (LinkType<0 || LinkType>1)
{
goto SlectLT;
}
SlectID:
printf("输入ID:");
scanf("%d", &DevID);
if (DevID <0)
{
goto SlectID;
}
switch (LinkType)
{
case 0:
hDevice = ACTS1000_CreateDevice(DevID); // 创建设备对象
break;
case 1:
hDevice = ACTS1000_CreateDeviceEx(DevID); // 创建设备对象
break;
}
if(hDevice == INVALID_HANDLE_VALUE)
{
printf("ACTS1000_CreateDevice fail");
getch();
return 0; // 如果创建设备对象失败,则返回
}
ACTS1000_GetDeviceCurrentID(hDevice, &DeviceLgcID, &DevicePhysID);
printf("当前设备逻辑ID:%d 物理ID:%d\n", DeviceLgcID, DevicePhysID);
printf("输入新物理ID:");
scanf("%d", &DevicePhysID);
ACTS1000_SetDevicePhysID(hDevice, DevicePhysID);
ACTS1000_ReleaseDevice(hDevice); // 释放设备对象
return 0;
}

View File

@ -0,0 +1,166 @@
[Workspace Header]
Version = 1001
Pathname = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/PhysicalID/Sys.cws"
CVI Dir = "/c/program files (x86)/national instruments/cvi2010"
CVI Shared Dir = "/C/Program Files (x86)/National Instruments/Shared/CVI"
CVI Pub Local Dir = "/C/ProgramData/National Instruments/CVI2010"
CVI Pub Global Dir = "/C/ProgramData/National Instruments/CVI"
IVI Standard Root Dir = "/C/Program Files (x86)/IVI Foundation/IVI"
IVI Standard Root 64-bit Dir = "/C/Program Files/IVI Foundation/IVI"
VXIplug&play Framework Dir = "/C/Program Files (x86)/IVI Foundation/VISA/winnt"
VXIplug&play Framework 64-bit Dir = "/C/Program Files/IVI Foundation/VISA/win64"
Number of Projects = 1
Active Project = 1
Project 0001 = "Sys.prj"
Drag Bar Left = 160
Window Top = 78
Window Left = 31
Window Bottom = 580
Window Right = 821
Maximized = True
Maximized Children = True
Max32 Number Of Errors = 20
Track Include File Dependencies = True
Prompt For Missing Includes = True
Stop On First Error File = False
Bring Up Err Win For Warnings = True
Show Build Dialog = False
Save Changes Before Running = "Always"
Save Changes Before Compiling = "Always"
Hide Windows = False
Break At First Statement = False
Sort Type = "File Name"
Number of Opened Files = 2
Window Confinement Region Enabled = True
MainColumnWidth = 143
FileDateColumnWidth = 70
FileSizeColumnWidth = 70
StatusColumnWidth = 70
[Project Header 0001]
Version = 1001
Don't Update DistKit = False
Platform Code = 4
Build Configuration = "Release"
Warn User If Debugging Release = 1
Batch Build Release = False
Batch Build Debug = False
Force Rebuild = False
[File 0001]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/PhysicalID/Sys.c"
File Type = "CSource"
Disk Date = 3708407608
In Projects = "1,"
Window Top = 38
Window Z-Order = 1
Source Window State = "1,25,27,27,44,44,44,0,0,288,0,0,0,0,0,73,0,0,26,150,400,600,1,0,"
[File 0002]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/PhysicalID/ACTS1000.h"
File Type = "Include"
Disk Date = 3708388578
In Projects = "1,"
Window Top = 192
Window Left = 91
Window Z-Order = 2
Source Window State = "1,327,337,337,0,15,15,0,0,122,0,0,0,0,0,25,317,0,327,0,323,769,1,0,"
[File 0003]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/PhysicalID/CONIO.H"
File Type = "Include"
Disk Date = 0
In Projects = "1,"
Window Top = 32
Window Left = 6
Source Window State = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"
[File 0004]
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/PhysicalID/ACTS1000_32.lib"
File Type = "Library"
Disk Date = 3704698817
In Projects = "1,"
[Default Build Config 0001 Debug]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Release]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Debug64]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Default Build Config 0001 Release64]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Batch Build = False
Profile = "Disabled"
Debugging Level = "Standard"
Execution Trace = "Disabled"
Command Line Args = ""
Working Directory = ""
External Process Path = ""
[Build Options 0001]
Generate Browse Info = True
Enable Uninitialized Locals Runtime Warning = True
Execution Trace = "Disabled"
Profile = "Disabled"
Debugging Level = "Standard"
Break On Library Errors = True
Break On First Chance Exceptions = False
[Execution Target 0001]
Execution Target Address = "Local desktop computer"
Execution Target Port = 0
Execution Target Type = 0
[SCC Options 0001]
Use global settings = True
SCC Provider = ""
SCC Project = ""
Local Path = ""
Auxiliary Path = ""
Perform Same Action For .h File As For .uir File = "Ask"
Perform Same Action For .cds File As For .prj File = "Ask"
Username = ""
Comment = ""
Use Default Username = False
Use Default Comment = True
Suppress CVI Error Messages = False
Always show confirmation dialog = True
[DLL Debugging Support 0001]
External Process Path = ""
[DLLs Used By Executable 0001]
DLL 0001 = "/C/Windows/SYSTEM32/ACTS1000_32.dll"
[Command Line Args 0001]
Command Line Args = ""
Working Directory = ""

View File

@ -0,0 +1,368 @@
[Project Header]
Version = 1001
Pathname = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.prj"
CVI Dir = "/c/program files (x86)/national instruments/cvi2010"
CVI Shared Dir = "/C/Program Files (x86)/National Instruments/Shared/CVI"
CVI Pub Local Dir = "/C/ProgramData/National Instruments/CVI2010"
CVI Pub Global Dir = "/C/ProgramData/National Instruments/CVI"
IVI Standard Root Dir = "/C/Program Files (x86)/IVI Foundation/IVI"
VXIplug&play Framework Dir = "/C/Program Files (x86)/IVI Foundation/VISA/winnt"
IVI Standard Root 64-bit Dir = "/C/Program Files/IVI Foundation/IVI"
VXIplug&play Framework 64-bit Dir = "/C/Program Files/IVI Foundation/VISA/win64"
Number of Files = 4
Target Type = "Executable"
Flags = 1040
Copied From Locked InstrDrv Directory = False
Copied from VXIPNP Directory = False
Locked InstrDrv Name = ""
Don't Display Deploy InstrDrv Dialog = False
[File 0001]
File Type = "Include"
Res Id = 1
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "ACTS1000.h"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/ACTS1000.h"
Exclude = False
Project Flags = 0
Folder = "Include Files"
[File 0002]
File Type = "Include"
Res Id = 2
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "CONIO.H"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/CONIO.H"
Exclude = False
Project Flags = 0
Folder = "Include Files"
[File 0003]
File Type = "CSource"
Res Id = 3
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "Sys.c"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.c"
Exclude = False
Compile Into Object File = False
Project Flags = 0
Folder = "Source Files"
[File 0004]
File Type = "Library"
Res Id = 4
Path Is Rel = True
Path Rel To = "Project"
Path Rel Path = "ACTS1000_32.lib"
Path = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/ACTS1000_32.lib"
Exclude = False
Project Flags = 0
Folder = "Not In A Folder"
[Folders]
User Interface Files Folder Not Added Yet = True
Instrument Files Folder Not Added Yet = True
Folder 0 = "Include Files"
Folder 1 = "Source Files"
[Custom Build Configs]
Num Custom Build Configs = 0
[Default Build Config Debug]
Config Name = "Debug"
Is 64-Bit = False
Is Release = False
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Release]
Config Name = "Release"
Is 64-Bit = False
Is Release = True
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Debug64]
Config Name = "Debug64"
Is 64-Bit = True
Is Release = False
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Default Build Config Release64]
Config Name = "Release64"
Is 64-Bit = True
Is Release = True
Default Calling Convention = "cdecl"
Uninitialized Locals Compile Warning = "Conservative"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
Enable C99 Extensions = False
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
Sign = False
Sign Store = ""
Sign Certificate = ""
Sign Timestamp URL = ""
Sign URL = ""
Manifest Embed = False
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Runtime Support = "Full Runtime Support"
Embed Project .UIRs = False
Generate Map File = False
Create Console Application = True
Using LoadExternalModule = False
DLL Exports = "Include File Symbols"
Register ActiveX Server = False
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
[Compiler Options]
Default Calling Convention = "cdecl"
Require Prototypes = True
Require Return Values = True
Enable Pointer Mismatch Warning = False
Enable Unreachable Code Warning = False
Enable Unreferenced Identifiers Warning = False
Enable Assignment In Conditional Warning = False
O Option Compatible With 5.0 = False
Enable C99 Extensions = False
Uninitialized Locals Compile Warning = "Conservative"
Precompile Prefix Header = False
Prefix Header File = ""
[Run Options]
Stack Size = 250000
Image Base Address = 4194304
Image Base Address x64 = 4194304
[Compiler Defines]
Compiler Defines = "/DWIN32_LEAN_AND_MEAN"
[Include Paths]
Include Path 1 Is Rel = True
Include Path 1 Rel To = "Project"
Include Path 1 Rel Path = ""
Include Path 1 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue"
[Create Executable]
Executable File_Debug Is Rel = True
Executable File_Debug Rel To = "Project"
Executable File_Debug Rel Path = "Sys_dbg.exe"
Executable File_Debug = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys_dbg.exe"
Executable File_Release Is Rel = True
Executable File_Release Rel To = "Project"
Executable File_Release Rel Path = "Sys.exe"
Executable File_Release = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Executable File_Debug64 Is Rel = True
Executable File_Debug64 Rel To = "Project"
Executable File_Debug64 Rel Path = "Sys.exe"
Executable File_Debug64 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Executable File_Release64 Is Rel = True
Executable File_Release64 Rel To = "Project"
Executable File_Release64 Rel Path = "Sys.exe"
Executable File_Release64 = "/f/Driver/MyDrv-X64/ACTS/ACTS1000/LabWindows/AD/Continue/Sys.exe"
Icon File Is Rel = False
Icon File = ""
Application Title = ""
DLL Exports = "Include File Symbols"
DLL Import Library Choice = "Gen Lib For Current Mode"
Use IVI Subdirectories for Import Libraries = False
Use VXIPNP Subdirectories for Import Libraries = False
Use Dflt Import Lib Base Name = True
Where to Copy DLL = "Do not copy"
Custom Directory to Copy DLL Is Rel = False
Custom Directory to Copy DLL = ""
Generate Source Documentation = "None"
Add Type Lib To DLL = False
Include Type Lib Help Links = False
TLB Help Style = "HLP"
Type Lib FP File Is Rel = False
Type Lib FP File = ""
Type Lib Guid = ""
Runtime Support = "Full Runtime Support"
Instrument Driver Support Only = False
Embed Project .UIRs = False
Generate Map File = False
[External Compiler Support]
UIR Callbacks File Option = 0
Using LoadExternalModule = False
Create Project Symbols File = True
UIR Callbacks Obj File Is Rel = False
UIR Callbacks Obj File = ""
Project Symbols H File Is Rel = False
Project Symbols H File = ""
Project Symbols Obj File Is Rel = False
Project Symbols Obj File = ""
[ActiveX Server Options]
Specification File Is Rel = False
Specification File = ""
Source File Is Rel = False
Source File = ""
Include File Is Rel = False
Include File = ""
IDL File Is Rel = False
IDL File = ""
Register ActiveX Server = False
[Signing Info]
Sign = False
Sign Debug Build = False
Store = ""
Certificate = ""
Timestamp URL = ""
URL = ""
[Manifest Info]
Embed = False
[tpcSection]
tpcEnabled = 0
tpcOverrideEnvironment = 0
tpcEnabled x64 = 0
tpcOverrideEnvironment x64 = 0

View File

@ -0,0 +1,123 @@
// DlgCalibration.cpp : implementation file
//
#include "stdafx.h"
#include "sys.h"
#include "ADCalibration.h"
#include "ACTS1000.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADCalibration dialog
CADCalibration::CADCalibration(CWnd* pParent /*=NULL*/)
: CDialog(CADCalibration::IDD, pParent)
{
//{{AFX_DATA_INIT(CADCalibration)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CADCalibration::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CADCalibration)
DDX_Control(pDX, IDC_PROGRESS_Calibration, m_ProgressCalibration);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CADCalibration, CDialog)
//{{AFX_MSG_MAP(CADCalibration)
ON_BN_CLICKED(IDC_BUTTON_Calibration, OnBUTTONCalibration)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADCalibration message handlers
extern CSysApp theApp;
BOOL gl__bCalibration = FALSE;
BOOL CADCalibration::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_ProgressCalibration.SetRange(0, 100);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CADCalibration::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_lProgress++;
if (m_lProgress>100)
m_lProgress = 0;
m_ProgressCalibration.SetPos(m_lProgress);
if (!gl__bCalibration)
StopCalibration();
CDialog::OnTimer(nIDEvent);
}
void CADCalibration::OnBUTTONCalibration()
{
// TODO: Add your control notification handler code here
if (theApp.m_hDevice != INVALID_HANDLE_VALUE)
{
int iRet = AfxMessageBox(_T("确认没有外部连接信号(注意:仅支持输入阻抗为1M欧校准)!"),MB_OKCANCEL);
if (iRet == 2)
{
return;
}
CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_Calibration);
m_lProgress =0;
gl__bCalibration = TRUE;
SetTimer(1, 100, NULL);
pStatic->SetWindowText(_T("Calibration over a long time, please be patient"));
GetDlgItem(IDC_BUTTON_Calibration)->EnableWindow(FALSE);
AfxBeginThread(ReadDataThread, &m_hWnd, THREAD_PRIORITY_HIGHEST);
}
else
{
AfxMessageBox(_T("The device does not exist"),MB_OK, MB_ICONWARNING);
}
}
UINT CADCalibration::ReadDataThread(PVOID hWnd)
{
ACTS1000_ADCalibration(theApp.m_hDevice);
gl__bCalibration = FALSE;
TRACE("END ADCalibrationThread");
return 1;
}
void CADCalibration::StopCalibration()
{
GetDlgItem(IDC_BUTTON_Calibration)->EnableWindow(TRUE);
KillTimer(1);
m_ProgressCalibration.SetPos(100);
CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_Calibration);
pStatic->SetWindowText(_T("Complete the calibration"));
AfxMessageBox(_T("Complete the calibration"));
}

View File

@ -0,0 +1,53 @@
#if !defined(AFX_DLGCALIBRATION_H__3DBE5577_6559_45CA_A620_0C3AA9A92AAC__INCLUDED_)
#define AFX_DLGCALIBRATION_H__3DBE5577_6559_45CA_A620_0C3AA9A92AAC__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DlgCalibration.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CADCalibration dialog
class CADCalibration : public CDialog
{
// Construction
public:
LONG m_lProgress;
CADCalibration(CWnd* pParent = NULL); // standard constructor
void StopCalibration();
// Dialog Data
//{{AFX_DATA(CADCalibration)
enum { IDD = IDD_DIALOG_Calibration };
CProgressCtrl m_ProgressCalibration;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADCalibration)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
static UINT ReadDataThread(PVOID hWnd);
// static UINT ADCalibrationThread(PVOID hWnd);
// Generated message map functions
//{{AFX_MSG(CADCalibration)
afx_msg void OnBUTTONCalibration();
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT_PTR nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_DLGCALIBRATION_H__3DBE5577_6559_45CA_A620_0C3AA9A92AAC__INCLUDED_)

View File

@ -0,0 +1,483 @@
// ADDigitView.cpp : implementation of the CADDigitView class
//
#include "stdafx.h"
#include "Sys.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern int gl_InputRange[MAX_CHANNEL_COUNT];
/////////////////////////////////////////////////////////////////////////////
// CADDigitView
IMPLEMENT_DYNCREATE(CADDigitView, CScrollView)
BEGIN_MESSAGE_MAP(CADDigitView, CScrollView)
//{{AFX_MSG_MAP(CADDigitView)
ON_WM_CONTEXTMENU()
ON_WM_CANCELMODE()
ON_COMMAND(IDM_SixteenShow, OnSixteenShow)
ON_UPDATE_COMMAND_UI(IDM_SixteenShow, OnUpdateSixteenShow)
ON_COMMAND(IDM_TenShow, OnTenShow)
ON_UPDATE_COMMAND_UI(IDM_TenShow, OnUpdateTenShow)
ON_COMMAND(IDM_DigitalVoltShowMode, OnDigitalVoltShowMode)
ON_UPDATE_COMMAND_UI(IDM_DigitalVoltShowMode, OnUpdateDigitalVoltShowMode)
ON_WM_VSCROLL()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_WM_HSCROLL()
ON_WM_KEYDOWN()
ON_WM_MOUSEWHEEL()
ON_MESSAGE(WM_SHOWDIGIT, ShowDigit)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADDigitView construction/destruction
CADDigitView::CADDigitView()
{
// TODO: add construction code here
m_DigitalDataShowMode = VOLT_DATAMODE; // 电压值显示模式
CurrentProgress = 0; // 置采集进度条起值为0
m_nDigDrawIdx = 0;
m_nDigDrawLen = 1024;
}
CADDigitView::~CADDigitView()
{
}
BOOL CADDigitView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CADDigitView drawing
void CADDigitView::OnDraw(CDC* pDC)
{
ADDigit(pDC);
if(m_bProgress) // 刷新ADDigitView视图时更新进度条的状态
{
CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus.GetDlgItem(IDC_PROGRESS));
pProgress->SetPos(CurrentProgress);
CurrentProgress++;
if(CurrentProgress>50) CurrentProgress=0;
m_bProgress=FALSE;
}
}
void CADDigitView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
const SIZE conPSize = {200,1};
const SIZE conLSize = {20,1};
sizeTotal.cx = 500;
sizeTotal.cy = 1026*16;
SetScrollSizes(MM_TEXT, sizeTotal, CSize(sizeDefault.cx, 36*16), CSize(sizeDefault.cx, 16));
CADDoc* pDoc = GetDocument();
pDoc->m_hWndDigit = m_hWnd;
}
/////////////////////////////////////////////////////////////////////////////
// CADDigitView printing
BOOL CADDigitView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
/////////////////////////////////////////////////////////////////////////////
// CADDigitView diagnostics
#ifdef _DEBUG
void CADDigitView::AssertValid() const
{
CScrollView::AssertValid();
}
void CADDigitView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CADDoc* CADDigitView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CADDoc)));
return (CADDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CADDigitView message handlers
void CADDigitView::ADDigit(CDC *pDC)//显示ch值
{
bDrawing = TRUE; // 通知数据处理线程正在绘制数字请不要往DrawBuffer中填充新数据
CRect rect;
int i;
TCHAR strIndex[512], str[512];
int ChannelIndex = 0;
int nChannelCount=0;
GetClientRect(&rect);
OnPrepareDC(pDC);
pDC->DPtoLP(&rect);
CBrush brush;
brush.CreateSolidBrush(RGB(0, 0, 0));
pDC->FillRect(rect, &brush);
pDC->SetTextColor(RGB(0, 255, 0));
pDC->SetBkMode(TRANSPARENT);
int Channel = 0;
int nTextHeight = 0;
ULONG ulBuffID = m_nDigDrawIdx;
pDC->SetTextColor(RGB(0, 255, 0));
nChannelCount = 0;
_stprintf(strIndex, _T("%s "), _T("Index"));
pDC->TextOut(-rect.left, rect.top +20, strIndex); // first line text out "Index CHX..."
switch(m_DigitalDataShowMode)
{
case DEC_DATAMODE: // 十进制显示
_stprintf(str, _T("%s"), _T(" 十进制显示数据"));
pDC->SetTextColor(RGB(255, 0, 0));
pDC->TextOut(-rect.left, rect.top, str);
pDC->SetTextColor(RGB(0, 255, 0));
for (Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++)
{
if (ADPara.bChannelArray[Channel] == TRUE)
{
_stprintf(str, _T("CH%d"), Channel);
pDC->TextOut(-rect.left+(nChannelCount+1)*70, rect.top +20, str); // first line text out "Index CHX..."
nChannelCount++;
}
}
break;
case HEX_DATAMODE: // 十六进制显示
_stprintf(str, _T("%s"),_T(" 十六进制原码显示数据"));
pDC->SetTextColor(RGB(0, 255, 255));
pDC->TextOut(-rect.left, rect.top, str);
pDC->SetTextColor(RGB(0, 255, 0));
_stprintf(strIndex, _T("%s "), _T("Index"));
for (Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++)
{
if (ADPara.bChannelArray[Channel] == TRUE)
{
_stprintf(str, _T("CH%d"), Channel);
pDC->TextOut(-rect.left+(nChannelCount+1)*70, rect.top +20, str); // first line text out "Index CHX..."
nChannelCount++;
}
}
break;
case VOLT_DATAMODE: // 电压值显示
_stprintf(str, _T("%s"), _T(" 电压值显示数据"));
pDC->SetTextColor(RGB(255, 255, 0));
pDC->TextOut(-rect.left, rect.top, str);
pDC->SetTextColor(RGB(0, 255, 0));
_stprintf(strIndex, _T("%s "), _T("Index"));
for (Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++)
{
if (ADPara.bChannelArray[Channel] == TRUE)
{
_stprintf(str, _T(" CH%d"), Channel);
//_stprintf(strIndex, _T("%s %8s "), strIndex, str);
pDC->TextOut(-rect.left+(nChannelCount+1)*70, rect.top +20, str); // first line text out "Index CHX..."
nChannelCount++;
}
}
break;
}
nTextHeight = 20;
//pDC->TextOut(-rect.left, rect.top +20, strIndex); // first line text out "Index CHX..."
ULONG nDataLength = MAX_RAM_SIZE/gl_nChannelCount-glOffset;
if (gl_bSmlThenSize && ADPara.SampleMode==ACTS1000_SAMPMODE_FINITE)
{
nDataLength = (gl_ReadSizeWords%8192)/gl_nChannelCount-glOffset;
if (nDataLength == 0)
nDataLength = 8192/gl_nChannelCount;
}
nDataLength = m_nDigDrawLen;
// if (nDataLength>m_nPlotWidth)
// {
// nDataLength = m_nPlotWidth;
// }
int Index = 0;
for(i=rect.top; i<rect.bottom; i++)
{
if(i%16 == 0)
{
Index = glOffset + i/16; // 数据点索引值
// if(Index >= MAX_RAM_SIZE/MAX_CHANNEL_COUNT) break;
// if(Index >= MAX_RAM_SIZE/gl_nChannelCount) break;
if(Index >= nDataLength) break;
_stprintf(strIndex, _T("%8d"), Index);
pDC->TextOut(-rect.left, rect.top+nTextHeight+16, strIndex); // text out Index of data
nChannelCount = 0;
switch(m_DigitalDataShowMode)
{
case DEC_DATAMODE: // 十进制偏移码
for(Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++)
{
if (ADPara.bChannelArray[Channel] == TRUE)
{
_stprintf(str, _T(" %8d"), ((ADBuffer[ulBuffID][Index*gl_nChannelCount+gl_CHIdx[Channel]])&gl_wMaxLSB)-gl_MiddleLsb[Channel]);
pDC->TextOut(-rect.left-30+(nChannelCount+1)*70, rect.top+nTextHeight+16, str); // text out decimal value every channel
nChannelCount++;
}
}
break;
case HEX_DATAMODE: // 十六进制原码
for(Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++)
{
//ADBuffer[ulBuffID][Index*gl_nChannelCount+gl_CHIdx[Channel]] = 65535;
if (ADPara.bChannelArray[Channel] == TRUE)
{
_stprintf(str, _T(" %5x"),
(ADBuffer[ulBuffID][Index*gl_nChannelCount+gl_CHIdx[Channel]])&gl_wMaxLSB);
pDC->TextOut(-rect.left-30+(nChannelCount+1)*70, rect.top+nTextHeight+16, str); // text out hex value every channel
nChannelCount++;
}
}
break;
case VOLT_DATAMODE: // 电压值
for(Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++)
{
if (ADPara.bChannelArray[Channel] == TRUE)
{
_stprintf(str, _T(" %8.2f"), (((ADBuffer[ulBuffID][Index*gl_nChannelCount+gl_CHIdx[Channel]])&gl_wMaxLSB) -
(gl_MiddleLsb[Channel]) - gl_lLsbHalf) * gl_PerLsbVoltM[Channel]);
pDC->TextOut(-rect.left-30+(nChannelCount+1)*70, rect.top+nTextHeight+16, str); // text out volt value
nChannelCount++;
}
}
break;
default:
break;
}
nTextHeight += 16; // next line
}
}
bDrawing = FALSE; // 通知数据处理线程数字绘制完成可以往DrawBuffer中填充新数据
}
void CADDigitView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
{
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_ChooseMode));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);
}
}
void CADDigitView::OnCancelMode()
{
CScrollView::OnCancelMode();
// TODO: Add your message handler code here
}
void CADDigitView::OnSixteenShow() //数字十六进制显示
{
// TODO: Add your command handler code here
m_DigitalDataShowMode = HEX_DATAMODE;
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
pDoc->UpdateAllViews(NULL, 1, NULL); // 传递1要求重绘数字视图
}
void CADDigitView::OnTenShow()//数字十进制显示
{
// TODO: Add your command handler code here
m_DigitalDataShowMode = DEC_DATAMODE;
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
pDoc->UpdateAllViews(NULL, 1, NULL); // 传递1要求重绘数字视图
}
void CADDigitView::OnDigitalVoltShowMode()
{//电压显示
// TODO: Add your command handler code here
m_DigitalDataShowMode = VOLT_DATAMODE;
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
pDoc->UpdateAllViews(NULL, 1, NULL); // 传递1要求重绘数字视图
}
void CADDigitView::OnUpdateSixteenShow(CCmdUI* pCmdUI)
{//十六进制
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck (m_DigitalDataShowMode == HEX_DATAMODE);
}
void CADDigitView::OnUpdateTenShow(CCmdUI* pCmdUI)
{//十进制显示
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck (m_DigitalDataShowMode == DEC_DATAMODE);
}
void CADDigitView::OnUpdateDigitalVoltShowMode(CCmdUI* pCmdUI)
{//电压显示
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_DigitalDataShowMode == VOLT_DATAMODE);
}
void CADDigitView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
// RedrawWindow(); // 当用户拖动滚动条时,要求视图重画
Invalidate();
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
int CADDigitView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CADDigitView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
if(lHint==1) // 如果是数字方式就执行父类的OnUpdate来调用其OnDraw
{
CScrollView::OnUpdate(pSender, lHint, pHint);
}
}
void CADDigitView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
CADDoc* pDoc=GetDocument();
CRect rect;
GetWindowRect(&rect);
pDoc->m_nADDigitWidth=rect.Width()+7;
}
BOOL CADDigitView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBrush brush;
CRect rect;
GetClientRect(rect);
brush.CreateSolidBrush(RGB(0, 0, 0));
pDC->FillRect(rect, &brush);
return TRUE;
// return CScrollView::OnEraseBkgnd(pDC);
}
LRESULT CADDigitView::ShowDigit(WPARAM wParam, LPARAM lParam)
{
m_nDigDrawLen = wParam;
m_nDigDrawIdx = lParam;
this->Invalidate(); // 刷新视图
return 1;
}
void CADDigitView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
Invalidate();
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CADDigitView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch(nChar)
{
case VK_HOME:
SendMessage(WM_VSCROLL, SB_TOP, NULL);
break;
case VK_END:
SendMessage(WM_VSCROLL, SB_BOTTOM, NULL);
break;
case VK_PRIOR:
SendMessage(WM_VSCROLL, SB_PAGEUP, NULL);
break;
case VK_NEXT:
SendMessage(WM_VSCROLL, SB_PAGEDOWN, NULL);
break;
case VK_UP:
SendMessage(WM_VSCROLL, SB_LINEUP, NULL);
break;
case VK_DOWN:
SendMessage(WM_VSCROLL, SB_LINEDOWN, NULL);
break;
case VK_LEFT:
SendMessage(WM_HSCROLL, SB_LINELEFT, NULL);
break;
case VK_RIGHT:
SendMessage(WM_HSCROLL, SB_LINERIGHT, NULL);
break;
default:
break;
}
CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CADDigitView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
if(zDelta > 0)
{
SendMessage(WM_VSCROLL, SB_LINEUP, NULL);
}
else
{
SendMessage(WM_VSCROLL, SB_LINEDOWN, NULL);
}
return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}

View File

@ -0,0 +1,88 @@
// ADDigitView.h : interface of the CADDigitView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_ADDIGITVIEW_H__D485DF07_85AB_11D1_B878_A68EB300DD63__INCLUDED_)
#define AFX_ADDIGITVIEW_H__D485DF07_85AB_11D1_B878_A68EB300DD63__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CADDigitView : public CScrollView
{
protected: // create from serialization only
CADDigitView();
DECLARE_DYNCREATE(CADDigitView)
// Attributes
public:
CProgressCtrl* pProgress;
int CurrentProgress;
// Operations
public:
ULONG m_nDigDrawIdx;
ULONG m_nDigDrawLen;
void ADDigit(CDC *pDC);
CADDoc *GetDocument();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADDigitView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void OnInitialUpdate(); // called first time after construct
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
public:
LRESULT ShowDigit(WPARAM wParam, LPARAM lParam);
CDC memDC;
CBitmap m_Bitmap;
virtual ~CADDigitView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CADDigitView)
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnCancelMode();
afx_msg void OnSixteenShow();
afx_msg void OnUpdateSixteenShow(CCmdUI* pCmdUI);
afx_msg void OnTenShow();
afx_msg void OnUpdateTenShow(CCmdUI* pCmdUI);
afx_msg void OnDigitalVoltShowMode();
afx_msg void OnUpdateDigitalVoltShowMode(CCmdUI* pCmdUI);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CADDoc *GetDocument();
#ifndef _DEBUG // debug version in ADDigitView.cpp
inline CADDoc* CADDigitView::GetDocument()
{ return (CADDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ADDigitVIEW_H__D485DF07_85AB_11D1_B878_A68EB300DD63__INCLUDED_)

View File

@ -0,0 +1,654 @@
// ADDoc.cpp : implementation of the CADDoc class
//
#include "stdafx.h"
#include "Sys.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#include "ADWaveView.h"
#include "ADStatusView.h"
#include "ParaCfgView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifdef ACTS1000_CreateSystemEvent
#define ACTS1000_CreateSystemEvent ACTS1000_TCreateSystemEvent
#endif
////////////////////////////////////////////////////////////////////////
WORD* ADBuffer[MAX_SEGMENT]; // 缓冲队列
WORD* ADDrawBuffer; // 波形刷新缓冲
BOOL m_bDrawComp= FALSE;
BOOL gl_bAutoCollect = FALSE;
int CurrentIndex; // AD数据处理线程当前缓冲区索引号
int ReadIndex; // AD数据采集线程当前缓冲区索引号
BOOL gl_bDeviceADRun=FALSE;
BOOL gl_bAutoTrig=TRUE;
ACTS1000_PARA_AD ADPara;
ACTS1000_PARA_AD OldADPara;
ACTS1000_STATUS_AD gl_ADStatus;
ACTS1000_AD_MAIN_INFO gl_ADMainInfo;
WORD gl_wMaxLSB = 0x3FFF;
float gl_fLsbCount = 16384.0;
WORD gl_lLsbHalf = 8192;
//BOOL bCheckOverflow=FALSE; // 是否检测FIFO溢出标志
int gl_nSampleMode = PRO_MODE; // 采集模式(1,查询, 2, 中断, 3 DMA)
UINT ReadDataThread(PVOID hWnd);//数据线程
UINT ProccessDataThread(PVOID hWnd); // 绘制数据线程
BOOL m_bFirstCreateDeviceFile;
int m_ProcessGraphicMode;//为1,波形显示
BOOL m_AnalyzeCheck;//控制精度分析
int gl_ScreenVolume;//设置屏幕显示的量程
int m_TriggerVolt;//触发电压
int gl_MiddleLsb[MAX_CHANNEL_COUNT];
float m_AnalyzeAllCount;
UINT m_OverLimitCount;
int m_ProcessMoveVolt;//为1时,平移电压
BOOL bCreateDevice;
BOOL m_bProgress; // 是否更新进度条
int nProcessMode; // 数据处理方式 1数字显示 2波形显示 3数据存盘
CEdit* pCountEdit;
CEdit* pRangeEdit;
CEdit* pRatioEdit;
CADDigitView* m_pDigitView;
CADWaveView* m_pWaveView;
CADStatusView* pADStatusView = NULL;
CParaCfgView* pParaCfgView = NULL;
HANDLE hEvent; // 采集线程与绘制线程的同步信号
int m_DigitalDataShowMode; // 数字窗口显示模式
int DeviceID; // 该程序使用的设备ID
HANDLE g_ArrFileOut;
int gl_nChannelCount = MAX_CHANNEL_COUNT;
int gl_nSaveFileCount = MAX_CHANNEL_COUNT;
BOOL m_bCloseFile;
HANDLE hExitEvent;
float Center, PerY;
CRect ClientRect;
float middle1;
BOOL bDrawing=FALSE;
ULONGLONG FileLenghtWords;
int nChannelArrayClient[MAX_CHANNEL_COUNT];// 通道号
int gl_CurrentbufNum = 0; // 当前的缓冲索引号
int DisplayChannel[MAX_CHANNEL_COUNT];// 用于标志各通道是否显示
float OutAnalogValve; // 表示模拟外触发的全局变量
ULONG gl_nSampleLenth = MAX_RAM_SIZE; // 采样长度
int gl_InputRange[MAX_CHANNEL_COUNT]; // 各通道设置的电压量程范围
float gl_PerLsbVoltM[MAX_CHANNEL_COUNT]; // 单位LSB的电压值
CString g_strFileFullName;
ULONG gl_StartAddr;
TCHAR g_strChannelEn[2][64] = { L"禁止", L"允许" };
TCHAR g_strGain[4][64] = { L"1倍放大", L"2倍放大", L"4倍放大", L"8倍放大" };
TCHAR g_strRefGround[3][64] = { L"直流", L"交流"};
TCHAR g_strAIRange[3][64] = {L"±5V", L"±1V", L"±10V"};
TCHAR g_strInputImped[2][64] = {L"1MΩ", L"50Ω"};
ULONG m_nSampRangeCount;
ULONG m_nSampRangeVal[8];
ULONG gl_CHIdx[MAX_CHANNEL_COUNT] =
{
0,1,2,3,4,5,6,7
};
CCriticalSection gl_Section;
ULONG gl_nDrawLen = 1024;
ULONG gl_nDocDrawLen = 1024;
ULONG gl_nDrawIdx = 0;
ULONG gl_nDocDrawIdx = 0;
//##############################################
//使用多媒体定时器以每秒50帧或以下的速度刷新屏幕
#include "stdio.h"
#include "MmSystem.h"
void PASCAL DrawWindowProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2);
#define ONE_MILLI_SECOND 1
#define TWO_SECOND 2000
// 定 义 时 钟 分 辨 率, 以 毫 秒 为 单 位 ----
#define TIMER_ACCURACY 1
UINT wAccuracy; // 定 义 分 辨 率
UINT TimerID; // 定 义 定 时 器 句 柄
////////////////////////////////////////////////////////////////////////////
// CADDoc
IMPLEMENT_DYNCREATE(CADDoc, CDocument)
BEGIN_MESSAGE_MAP(CADDoc, CDocument)
//{{AFX_MSG_MAP(CADDoc)
ON_COMMAND(IDM_TileWave, OnTileWave)
ON_COMMAND(IDM_SuperPoseWave, OnSuperPoseWave)
ON_UPDATE_COMMAND_UI(IDM_SuperPoseWave, OnUpdateSuperPoseWave)
ON_UPDATE_COMMAND_UI(IDM_TileWave, OnUpdateTileWave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CADDoc construction/destruction
extern CSysApp theApp;
CADDoc::CADDoc()
{
// TODO: add one-time construction code here
m_bProgress=FALSE; // 一开始不更新进度条
nProcessMode = DATA_MODE; // 默认方式:数字显示
m_TriggerVolt=(int)VOLT_RANGE; // 置触发电平的初值为其最大量程
m_bFirstCreateDeviceFile=TRUE; // 一开始,为第一次创建文件对象
m_bCloseFile=TRUE; // 没有打开文件时,认为文件被关闭
gl_nChannelCount=0;
ACTS1000_LoadParaAD(theApp.m_hDevice, &ADPara); // 读入系统参数
for (int i=gl_ADMainInfo.nChannelCount; i<ACTS1000_AD_MAX_CHANNELS; i++)
{
ADPara.bChannelArray[i] = 0;
}
for (int nCH=0; nCH<gl_ADMainInfo.nChannelCount; nCH++)
{
if (ADPara.bChannelArray[nCH])
{
gl_nChannelCount++;
}
}
//gl_nChannelCount = MAX_CHANNEL_COUNT;
}
CADDoc::~CADDoc()
{
}
BOOL CADDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CADDoc serialization
void CADDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CADDoc diagnostics
#ifdef _DEBUG
void CADDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CADDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
BOOL gl_bTerminateDrawThr = TRUE;
void CADDoc::StartDeviceAD()
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
////////////////////////////////////////////////////////////////////////
if(pApp->m_hDevice==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("对不起,无设备存在..."),MB_ICONERROR);
return;
}
if(!gl_bTerminateDrawThr)
{
AfxMessageBox(_T(" 线程没有中止"));
return;
}
FileLenghtWords = 0; // 文件长度初始化
m_DrawWindowThread = AfxBeginThread(ProccessDataThread,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_DrawWindowThread->m_bAutoDelete = TRUE; // 自动删除
// 创建数据采集与窗口绘制同步事件对象
hEvent = ACTS1000_CreateSystemEvent();
hExitEvent = ACTS1000_CreateSystemEvent();
bCollectData=TRUE; // 创建设备对象后,可以进行数据采集
// for(int i=0;i<MAX_CHANNEL_COUNT;i++)
// gl_MiddleLsb[i]=0;
if(!m_bFirstCreateDeviceFile) // 如果创建了文件对象
{
header.HeadSizeBytes = sizeof(FILE_HEADER); // 头信息大小
header.FileType = DEFAULT_FILE_TYPE;
header.BusType = gl_ADMainInfo.nDeviceType>>16; // 该设备总线类型
header.DeviceNum = DEFAULT_DEVICE_NUM;
header.DeviceType = gl_ADMainInfo.nDeviceType&0xFFFF; // 设备ID号
header.ChannelCount = gl_nChannelCount; // 每通道都是独立的所以为1
header.DataWidth = gl_ADMainInfo.nSampResolution; // 12位
header.bXorHighBit = 0; // 高位不用求反
header.nRevisionID = theApp.m_nRevisionID;
ULONG nSampRangeCount;
ULONG nSampRangeVal[8];
if (!ACTS1000_GetSupportRangeInfo(theApp.m_hDevice, &nSampRangeCount,nSampRangeVal))
{
AfxMessageBox(L"获去支持量程信息失败",MB_ICONWARNING,0);
return;
}
// 还没有设置
switch(ADPara.InputRange[0]) // 电压量程
{
case ACTS1000_INPUT_N1000_P1000mV: // ±1000毫伏
header.VoltTopRange = 1000;
header.VoltBottomRange = -1000;
break;
case ACTS1000_INPUT_N10000_P10000mV: // ±5000毫伏
header.VoltTopRange = 10000;
header.VoltBottomRange = -10000;
break;
case ACTS1000_INPUT_N5000_P5000mV:
header.VoltTopRange = 5000;
header.VoltBottomRange = -5000;
break;
}
header.ADPara = ADPara;
header.CrystalFreq = gl_ADMainInfo.nBaseRate; // 晶振频率
header.HeadEndFlag = HEAD_END_FLAG;
header.ADStatus = gl_ADStatus;
time_t nowtime;
time(&nowtime);
header.CreateFTime = (ULONGLONG)nowtime;
memcpy(&header.ADMainInfo, &gl_ADMainInfo, sizeof(gl_ADMainInfo));
// 写文件头
// g_ArrFileOut[Index].Write((WORD*)&header, header.HeadSizeBytes);
DWORD dTmp;
if (!WriteFile(g_ArrFileOut, (WORD*)&header, header.HeadSizeBytes,
&dTmp, NULL))
{
AfxMessageBox(L"error");
}
}
// 根据通道数,重新设置视图滚动范围
CADDigitView* pDigitView=(CADDigitView*)(CWnd::FromHandle(m_hWndDigit));
CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(m_hWndWave));
CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
CProgressCtrl* pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus.GetDlgItem(IDC_PROGRESS));
pProgress->SetPos(0); // 释放设备时,置进度条为起值
// 启动设备
if(!MyStartDeviceAD(pApp->m_hDevice)) // 启动设备,开始采集数据
{
AfxMessageBox(_T("设备启动失败"));
return;
}
gl_bDeviceADRun = TRUE;
if(pParaCfgView != NULL)
{
pParaCfgView->EnableWindows(FALSE); // 在设备开始运行时,禁止操作硬件参数
pParaCfgView->StartAD();
}
m_DrawWindowThread->ResumeThread(); // 启动绘制窗口线程
}
BOOL gl_Event = FALSE;
//################### 绘制数据线程 ################################################3###
UINT ProccessDataThread(PVOID hWnd)
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADFrame *pFrm=pApp->m_ADFrame ;
CADDoc* pDoc=pApp->m_pADDoc;
// 在线程中取得视图指针
CADDigitView* pDigitView=(CADDigitView*)(CWnd::FromHandle(pDoc->m_hWndDigit));
CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave));
CString str;
BOOL bFirst=TRUE;
ULONG WroteMB=0;
pDoc->m_Wrote8KWCounter=0;
pDoc->m_WroteMB=0;
CurrentIndex=0;
int ShowCount=0,i;
ULONG ulTime = 0;
ULONG nDrawL = 0;
ULONG nDrawI = 0;
while(gl_bDeviceADRun) // 循环处理AD数据
{
do{
if(!gl_bDeviceADRun) goto ExitProcDataThread;
} while(WaitForSingleObject(hEvent, 100) != WAIT_OBJECT_0);
gl_bTerminateDrawThr = FALSE;
gl_Event = TRUE;
switch(nProcessMode) // 数据处理
{
case DATA_MODE: // 数字处理
if ((GetTickCount()-ulTime)>100)
{
gl_Section.Lock();
nDrawL =gl_nDrawLen;
nDrawI =gl_nDrawIdx;
gl_nDocDrawLen = gl_nDrawLen;
gl_nDocDrawIdx =gl_nDrawIdx;
gl_Section.Unlock();
::SendMessage(pDoc->m_hWndDigit, WM_SHOWDIGIT, nDrawL, nDrawI);
m_bProgress=TRUE; // 使OnDraw函数能更新进度条
ulTime = GetTickCount();
}
/*else
{
if (gl_bSmlThenSize)
{
gl_bSmlThenSize = FALSE;
}
}*/
break;
case WAVE_MODE: // 波形处理
if ((GetTickCount()-ulTime)>120)
{
gl_Section.Lock();
nDrawL =gl_nDrawLen;
nDrawI =gl_nDrawIdx;
gl_nDocDrawLen = gl_nDrawLen;
gl_nDocDrawIdx =gl_nDrawIdx;
gl_Section.Unlock();
::SendMessage(pDoc->m_hWndWave,WM_SHOWWAVE, nDrawL, nDrawI);
m_bProgress=TRUE; // 使OnDraw函数能更新进度条
ulTime = GetTickCount();
//Sleep(1);
}
break;
case SAVE_MODE: // 数据存盘处理
WroteMB=(WroteMB+32)%1024;
pFrm->m_Progress()->SetPos((int)WroteMB);
str.Format(_T("%d"), (FileLenghtWords/512));
i=str.GetLength()-3;
while(i>0)
{
str.Insert(i, ',');
i-=3;
}
str+=" Kb";
pFrm->m_FileLenght()->SetWindowText(str);
ShowCount++;
break;
}//end switch
}//end while
ExitProcDataThread:
gl_bTerminateDrawThr = TRUE; // 线程中止
return TRUE;
}
//##########################################################################################
void CADDoc::Public_ReleaseDevice(void) // 供MDI窗口调用
{
StopDeviceAD();
}
void CADDoc::StopDeviceAD()
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
// gl_bDeviceADRun = FALSE; // 停止子线程进行连续数据采集
CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
// bCreateDevice = FALSE;
// SetEvent(hExitEvent);
// WaitForSingleObject(hExitEvent, 100); // 等待采集线程退出
// 终止采集线程
CProgressCtrl* pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus.GetDlgItem(IDC_PROGRESS));
pProgress->SetPos(0); // 释放设备时,置进度条为起值
// 在设备对象释放后,允许操作硬件参数
if(pParaCfgView != NULL)
{
pParaCfgView->EnableWindows(TRUE);
}
bCreateDevice = FALSE; // 释放设备后,视设备未创建
// ::SendMessage(m_hWndDigit, WM_SHOWDIGIT, gl_nDocDrawLen, NULL);
// ::SendMessage(m_hWndWave,WM_SHOWWAVE, gl_nDocDrawLen, NULL);
if(!MyStopDeviceAD(pApp->m_hDevice)) // 关闭AD设备
{
AfxMessageBox(_T("关闭AD设备失败!"));
return;
}
if(nProcessMode == SAVE_MODE) // 如果数据处理方式为存盘
{
OnCloseFile();//释放文件
nProcessMode = DATA_MODE; // 置成数字方式
if(pADStatusView != NULL)
{
CButton* pDataSave=(CButton*)(pADStatusView->GetDlgItem(IDM_DataSave));
pDataSave->EnableWindow(FALSE); // 使存盘方式单选框有效
}
}
ACTS1000_ReleaseSystemEvent(hEvent); // 释放消息
ACTS1000_ReleaseSystemEvent(hExitEvent); // 释放消息
gl_Section.Lock();
gl_nDocDrawLen = gl_nDrawLen;
gl_nDocDrawIdx =gl_nDrawIdx;
gl_Section.Unlock();
::SendMessage(m_hWndDigit, WM_SHOWDIGIT, gl_nDrawLen, gl_nDrawIdx);
::SendMessage(m_hWndWave,WM_SHOWWAVE, gl_nDrawLen, gl_nDrawIdx);
}
void CADDoc::OnDataFileNew()
{
// TODO: Add your command handler code here
CString strNewFileName;
CString TempFileName;
CSysApp* pApp=(CSysApp*)AfxGetApp();
if (!(pApp->DoPromptFileName(strNewFileName, IDS_NEW_FILE,
OFN_HIDEREADONLY | OFN_CREATEPROMPT, TRUE, NULL)))
return;
if(!m_bFirstCreateDeviceFile)
{ // 如果不是第一次创建文件对象,则释放老文件对象
if ( ! CloseHandle( g_ArrFileOut ) )
{
AfxMessageBox(L"释放文件对象失败...",MB_ICONSTOP,0);
}
}
// 创建新文件对象
int FileNameLength=strNewFileName.GetLength();
//TempFileName=strNewFileName.Left(FileNameLength-4);
g_ArrFileOut =CreateFile(strNewFileName, GENERIC_READ|GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (g_ArrFileOut == INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T("初始化文件对象失败..."),MB_ICONSTOP,0);
return;
}
// 保存打开的文件名称
g_strFileFullName = strNewFileName;
gl_nSaveFileCount = gl_nChannelCount;
CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
pShow->ShowHideDlgSave (); //显示存盘栏
pShow->ShowHideStatus(FALSE);//隐藏状态栏
if(pADStatusView != NULL)
{
CButton* pDataSave=(CButton*)(pADStatusView->GetDlgItem(IDM_DataSave));
pDataSave->EnableWindow(TRUE); // 使存盘方式单选框有效
}
_ULARGE_INTEGER dlFreeSpace, dlTotalSpace, dlUserSpace;
GetDiskFreeSpaceEx(strNewFileName.Left(3), &dlUserSpace, &dlUserSpace, &dlFreeSpace);
(void)dlTotalSpace;
(void)dlUserSpace;
ULONGLONG DiskFreeBytes = dlFreeSpace.QuadPart;
// 取得文件所在磁盘可用空间 */
m_RemainMB=(ULONG)(DiskFreeBytes/(1024*1024)); // 求出有多少M字
CString str;
if(m_RemainMB<2)
{
AfxMessageBox(_T("硬盘剩余空间不足2M存盘操作不能进行..."),MB_ICONSTOP,0);
return;
}
str.Format(_T("%d Mb"),m_RemainMB);
pShow->m_DiskFree()->SetWindowText (str);// 置当前硬盘可用空间MB
pShow->m_Progress()->SetRange32(0,1024);// 设置进程范围
pShow->m_Progress()->SetPos(0);
/////////////
pShow->m_FileName()->SetWindowText(strNewFileName);//显示存盘文件名
m_bFirstCreateDeviceFile=FALSE; // 若成功文件对象,则置标志
m_bCloseFile=FALSE; // 有文件没有关闭,可以操作《关闭当前文件》菜单
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
nProcessMode = SAVE_MODE; // 当打开新文件时,意味着要进行存盘处理
pADStatusView->SetDlgCheck();
}
void CADDoc::OnCloseFile()
{
// TODO: Add your command handler code here
DWORD dTmp;
header.HeadSizeBytes = sizeof(FILE_HEADER);
header.ADStatus = gl_ADStatus; // gl_ADStatus.bTrigFlag;
// g_ArrFileOut.SeekToBegin();
// g_ArrFileOut.Write(&header, sizeof(FILE_HEADER));
// g_ArrFileOut.Close();
SetFilePointer(g_ArrFileOut, 0, 0, FILE_BEGIN);
//ACTS1000_WriteFile(hFileObject[nChannel], &header, sizeof(FILE_HEADER));
if (!WriteFile(g_ArrFileOut, &header, sizeof(FILE_HEADER), &dTmp, NULL))
{
AfxMessageBox(L"error");
}
CloseHandle( g_ArrFileOut);
CString strTitle;
strTitle = GetTitle(); // 为防止SetPathName改变文档的Title则提前保存
// 添加到 曾打开的文件列表中
m_bCloseFile=TRUE; // 文件被关闭
nProcessMode = DATA_MODE; // 当关闭新文件时,意味着要不能再进行存盘处理,因此置成数字方式
m_bFirstCreateDeviceFile=TRUE; // 当新文件被关闭后,意味着以后新文件还是第一次被创建
///////
CADFrame* pADFrm = ((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
CButton* pDataSave=(CButton*)(pADStatusView->GetDlgItem(IDM_DataSave));
pDataSave->EnableWindow(TRUE); // 使存盘方式单选框有效
CString str;
str.Format(_T("%d"), 0);
pADFrm->m_DiskFree()->SetWindowText(str);
if (gl_bAutoCollect)
{
// SetPathName(g_strFileFullName[1]);
SetPathName(g_strFileFullName);
SetTitle(strTitle); // 恢复文档的Title
pADFrm->ShowHideDlgSave (FALSE); // 隐藏存盘栏
pADFrm->ShowHideStatus();//显示状态栏
}
pADFrm->m_Progress()->SetRange32(0,1024); // 设置进程范围
pADFrm->m_Progress()->SetPos(0);
// 一兆进度
pADStatusView->SetDlgCheck();
}
void CADDoc::OnTileWave()
{
// TODO: Add your command handler code here
gl_bTileWave = TRUE;
CButton* pButtonTile = (CButton*)pADStatusView->GetDlgItem(IDM_TileWave);
pButtonTile->SetCheck(1);
CButton* pButtonPose = (CButton*)pADStatusView->GetDlgItem(IDM_SuperPoseWave);
pButtonPose->SetCheck(0);
CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(m_hWndWave));
pWaveView->m_ADScopeCtrl.InvalidateCtrl();
pWaveView->OnDrawPolyLine(gl_nDocDrawLen,gl_nDocDrawIdx);
}
void CADDoc::OnSuperPoseWave()
{
// TODO: Add your command handler code here
gl_bTileWave = FALSE;
CButton* pButtonTile = (CButton*)pADStatusView->GetDlgItem(IDM_TileWave);
pButtonTile->SetCheck(0);
CButton* pButtonPose = (CButton*)pADStatusView->GetDlgItem(IDM_SuperPoseWave);
pButtonPose->SetCheck(1);
CADWaveView* pWaveView = (CADWaveView*)(CWnd::FromHandle(m_hWndWave));
pWaveView->m_ADScopeCtrl.InvalidateCtrl();
pWaveView->OnDrawPolyLine(gl_nDocDrawLen,gl_nDocDrawIdx);
}
void CADDoc::OnUpdateSuperPoseWave(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(gl_bTileWave==TRUE ? 0:1);
}
void CADDoc::OnUpdateTileWave(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(gl_bTileWave==TRUE ? 1:0);
}

View File

@ -0,0 +1,85 @@
// ADDoc.h : interface of the CADDoc class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_SHOWDATADOC_H__D485DF05_85AB_11D1_B878_A68EB300DD63__INCLUDED_)
#define AFX_SHOWDATADOC_H__D485DF05_85AB_11D1_B878_A68EB300DD63__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//#include "sys.h"
//#include "ADFrm.h"
//class CSysApp :public WinApp{};
//class CADFrame :public CMDIChildWnd{};
class CADDoc : public CDocument
{
protected: // create from serialization only
CADDoc();
DECLARE_DYNCREATE(CADDoc)
// Attributes
public:
HWND m_hWndDigit; // 数字窗口句柄
HWND m_hWndWave; // 波形窗口句柄
HWND m_hWndADSave; // 波形窗口句柄
HWND m_hWndADCfg; //右边的配置栏句柄
FILE_HEADER header; // 文件头信息
ULONG m_RemainMB;
ULONG m_WroteMB;
ULONG m_Wrote8KWCounter; // 记录8KW的进度
public:
void OnDataFileNew();
void OnCloseFile();
void Public_ReleaseDevice(void);
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADDoc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Implementation
public:
CWinThread* m_ReadThread; // 子线程句柄
CWinThread* m_DrawWindowThread; // 子线程句柄
int m_nADDigitWidth;
BOOL bCollectData;
virtual ~CADDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
public:
void StartDeviceAD();
void StopDeviceAD();
// Generated message map functions
public:
// CStatic* m_FrmFileName()
// {return ((CStatic*)(((CSysApp*)AfxGetApp())->m_ADFrame->m_wndDlgSave.GetDlgItem(IDC_FileName)));}
//{{AFX_MSG(CADDoc)
afx_msg void OnTileWave();
afx_msg void OnSuperPoseWave();
afx_msg void OnUpdateSuperPoseWave(CCmdUI* pCmdUI);
afx_msg void OnUpdateTileWave(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SHOWDATADOC_H__D485DF05_85AB_11D1_B878_A68EB300DD63__INCLUDED_)

View File

@ -0,0 +1,489 @@
// ADFrm.cpp : implementation of the CADFrame class
//
#include "stdafx.h"
#include "Sys.h"
#include "MainFrm.h"
#include "ADFrm.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#include "ADWaveView.h"
#include "QSortData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////
#include "ADStatusView.h"
#include "ParaCfgView.h"
extern CADStatusView* pADStatusView;
extern CParaCfgView* pParaCfgView;
////////////////////////////////////////////////////////////////////////////
// CADFrame
IMPLEMENT_DYNCREATE(CADFrame, CMDIChildWnd)
BEGIN_MESSAGE_MAP(CADFrame, CMDIChildWnd)
ON_COMMAND_EX(CG_ID_VIEW_DLGBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(CG_ID_VIEW_DLGBAR, OnUpdateControlBarMenu)
ON_COMMAND_EX(CG_ID_VIEW_SHOWSTATUS1, OnBarCheck)
ON_UPDATE_COMMAND_UI(CG_ID_VIEW_SHOWSTATUS1, OnUpdateControlBarMenu)
ON_COMMAND_EX(CG_ID_VIEW_SHOWSTATUS, OnBarCheck)
ON_UPDATE_COMMAND_UI(CG_ID_VIEW_SHOWSTATUS, OnUpdateControlBarMenu)
ON_WM_CREATE()
ON_COMMAND_EX(CG_ID_VIEW_SETUPDLG, OnBarCheck)
ON_UPDATE_COMMAND_UI(CG_ID_VIEW_SETUPDLG, OnUpdateControlBarMenu)
//{{AFX_MSG_MAP(CADFrame)
ON_WM_CLOSE()
ON_WM_CANCELMODE()
ON_WM_LBUTTONUP()
//ON_COMMAND(IDM_History_Digit, OnHistoryDigit)
ON_COMMAND(IDM_History_Wave, OnHistoryWave)
//ON_UPDATE_COMMAND_UI(IDM_History_Digit, OnUpdateHistoryDigit)
ON_UPDATE_COMMAND_UI(IDM_History_Wave, OnUpdateHistoryWave)
ON_COMMAND(IDM_MoveVolt, OnMoveVolt)
ON_WM_DESTROY()
ON_WM_CREATE()
ON_UPDATE_COMMAND_UI(IDM_MoveVolt, OnUpdateMoveVolt)
ON_BN_CLICKED(IDC_CHECK_CheckOverflow, OnCHECKCheckOverflow)
ON_COMMAND(IDM_ShowCfgAnalBar, OnShowCfgAnalBar)
ON_UPDATE_COMMAND_UI(IDM_ShowCfgAnalBar, OnUpdateShowCfgAnalBar)
ON_COMMAND(IDM_ShowStatusBar, OnShowStatusBar)
ON_UPDATE_COMMAND_UI(IDM_ShowStatusBar, OnUpdateShowStatusBar)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADFrame construction/destruction
CADFrame::CADFrame()
{
// TODO: add member initialization code here
// m_ProcessDigitalMode=1;
m_ProcessGraphicMode = 1;
m_AnalyzeCheck = false;
m_bShowCfgAnalBar = true;
m_bShowStatusBar = true;
m_ProcessMoveVolt = 1;
gl_ReadSizeWords = 0;
gl_ScreenVolume = (int)VOLT_RANGE;
}
CADFrame::~CADFrame()
{
if(m_pWndSTCBar != NULL)
{
delete m_pWndSTCBar;
m_pWndSTCBar = NULL;
}
pParaCfgView = NULL;
pADStatusView = NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CADFrame diagnostics
#ifdef _DEBUG
void CADFrame::AssertValid() const
{
CMDIChildWnd::AssertValid();
}
void CADFrame::Dump(CDumpContext& dc) const
{
CMDIChildWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CADFrame message handlers
BOOL CADFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
if (!m_wndSplitter.CreateStatic(this, 1, 2)) // 创建1行2列分割
{
TRACE0("Failed to CreateStaticSplitter\n");
return FALSE;
}
// add the first splitter pane - the default view in column 0
// 创建第一个格子在0列中使用默认的视图由文档模板决定
if (!m_wndSplitter.CreateView(0, 0,
RUNTIME_CLASS(CADDigitView), CSize(360, 50), pContext))//CADDigitView
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 1,
RUNTIME_CLASS(CADWaveView), CSize(0, 470), pContext))//
{
TRACE0("Failed to create second pane\n");
return FALSE;
}
return TRUE;
}
void CADFrame::ActivateFrame(int nCmdShow)
{
nCmdShow = SW_SHOWMAXIMIZED; // 使子帧窗口最大化
CMDIChildWnd::ActivateFrame(nCmdShow);
}
int CADFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建右侧CControlBar窗体
m_pWndSTCBar = new CCfgTabCtrlBar;
m_pWndSTCBar->Create(this, CSize(235, 100), IDW_PROP_BAR);
m_pWndSTCBar->SetBarStyle(CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);//CBRS_SIZE_DYNAMIC);
m_pWndSTCBar->EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(m_pWndSTCBar, AFX_IDW_DOCKBAR_RIGHT);
{ // 这个视图没有问题
pParaCfgView=(CParaCfgView*)m_pWndSTCBar->AddView(_T("参数配置"), RUNTIME_CLASS(CParaCfgView/*CParaCfgView*/));//CParaCfgView
pParaCfgView->m_pADFrm = this;
}
{// 这个视图有有问题
pADStatusView=(CADStatusView*)m_pWndSTCBar->AddView(_T("性能分析"), RUNTIME_CLASS(CADStatusView));//CADStatusView
}
OldADPara = ADPara;
// TODO: Add a menu item that will toggle the visibility of the
{
// Initialize dialog bar m_wndShowStatus
if (!m_wndShowStatus.Create(this, CG_IDD_Status,
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
CG_IDD_Status))
{
TRACE0("Failed to create dialog bar m_wndShowStatus\n");
return -1; // fail to create
}
m_wndShowStatus.EnableDocking(CBRS_ALIGN_BOTTOM | CBRS_ALIGN_TOP);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndShowStatus);
CProgressCtrl* pT=(CProgressCtrl*)m_wndShowStatus.GetDlgItem(IDC_PROGRESS);
pT->SetRange(0, 50);
if (!m_wndDlgSave.Create(this, CG_IDD_DIALOG_Save,
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
CG_IDD_DIALOG_Save))
{
TRACE0("Failed to create dialog bar m_wndShowStatus\n");
return -1; // fail to create
}
m_wndDlgSave.ShowWindow(SW_HIDE);
m_wndDlgSave.EnableDocking(CBRS_ALIGN_BOTTOM | CBRS_ALIGN_TOP);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndDlgSave);
}
CEdit* pFreqEdit=(CEdit*)(this->m_wndShowStatus).GetDlgItem(IDC_EDIT_MeasureFreq);
pFreqEdit->SetWindowText(_T("拖鼠标测频"));
//m_ToolTip.Create(this,TTS_ALWAYSTIP|WS_CHILD|WS_VISIBLE);
if(pParaCfgView != NULL)
{
CComboBox * pTriggerSource =(CComboBox *)pParaCfgView->GetDlgItem(IDC_COMBO_TriggerSource);
CComboBox * pTriggerDir =(CComboBox *)pParaCfgView->GetDlgItem(IDC_COMBO_OutTriggerDir);
CEdit * pBufferID =(CEdit *)pParaCfgView->GetDlgItem(IDC_EDIT_BufferID);
CSliderCtrl* pSLIDER_Offset =(CSliderCtrl*)pParaCfgView->GetDlgItem(IDC_SLIDER_Offset);
/*m_ToolTip.AddTool(pFrequency,_T("设定频率"));
m_ToolTip.AddTool(pTriggerSource,_T("内部触发或外部触发"));
m_ToolTip.AddTool(pTriggerDir,_T("触发方向"));
m_ToolTip.AddTool(pBufferID,_T("在2个缓冲区中选择缓冲区"));
m_ToolTip.AddTool(pSLIDER_Offset,_T("在缓冲区中选择偏移"));*/
}
return 0;
}
void CADFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnClose();
}
void CADFrame::OnCancelMode()
{
CMDIChildWnd::OnCancelMode();
// TODO: Add your message handler code here
}
void CADFrame::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnLButtonUp(nFlags, point);
}
//void CADFrame::OnHistoryDigit()
//{
// // TODO: Add your command handler code here
// STARTUPINFO StartupInfo;
// memset(&StartupInfo,0,sizeof(STARTUPINFO));
// StartupInfo.cb=sizeof(STARTUPINFO);
//
// PROCESS_INFORMATION ProcessInfo;
//
// ::CreateProcess
// (_T("\\User\\SysTest\\Release\\SysTest.exe"),
// _T(" Digit"), // 注意:第一个字符必须为空格
// NULL,
// NULL,
// FALSE,
// 0,
// NULL,
// NULL,
// &StartupInfo,
// &ProcessInfo);
//}
void CADFrame::OnHistoryWave()
{
// TODO: Add your command handler code here
STARTUPINFO StartupInfo;
memset(&StartupInfo,0,sizeof(STARTUPINFO));
StartupInfo.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATION ProcessInfo;
::CreateProcess
(_T("\\User\\SysTest\\Release\\SysTest.exe"),
_T(" Wave"), // 注意:第一个字符必须为空格
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&StartupInfo,
&ProcessInfo);
}
//void CADFrame::OnUpdateHistoryDigit(CCmdUI* pCmdUI)
//{
// // TODO: Add your command update UI handler code here
// pCmdUI->Enable(FALSE);
//}
void CADFrame::OnUpdateHistoryWave(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(FALSE);
}
void CADFrame::OnMoveVolt() //平移电压的函数
{
LONG m_DataMiddle; // 中间数原码
ULONG nArrayCount=-1;
ULONG m=0;
TCHAR str[100];
//m_ProcessMoveVolt=m_ProcessMoveVolt==0?1:0;
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
CString strn;
CADDigitView* pDigitView=(CADDigitView*)(CWnd::FromHandle(pDoc->m_hWndDigit));
CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave));
if(m_ProcessMoveVolt == 1) // 开始求中间值
{
m_ProcessMoveVolt = 0;
if(gl_ReadSizeWords == 0)
{
// AfxMessageBox(_T("还没有开始采集数据!");
// return;
}
ULONG lCount = (gl_ReadSizeWords%4096)/gl_nChannelCount;
if (lCount == 0)
{
if (gl_ReadSizeWords < MAX_RAM_SIZE)
{
lCount = gl_ReadSizeWords/gl_nChannelCount;
}
else
{
lCount = (gl_ReadSizeWords%MAX_RAM_SIZE)/gl_nChannelCount;
}
if (lCount == 0)
{
lCount = MAX_RAM_SIZE/gl_nChannelCount;
}
}
//pADStatusView->m_nMoveVolt.ResetContent();
if (lCount>8192) // 8192为SHORT DataAnalyze[MAX_CHANNEL_COUNT][8192];
{
lCount = 8192;
}
for(int nChannel=0; nChannel<MAX_CHANNEL_COUNT; nChannel++)
{
if (ADPara.bChannelArray[nChannel] == TRUE)
{
for(ULONG Index=0; Index<lCount; Index++)
{
DataAnalyze[nChannel][Index] = ((ADBuffer[glBufferID][Index*gl_nChannelCount+gl_CHIdx[nChannel]])&gl_wMaxLSB);
}
}
}
/////////////////////////////////////////////
for(int k=0; k<MAX_CHANNEL_COUNT; k++)//每通道的数据各自进行排序
{
if (ADPara.bChannelArray[k] == TRUE)
{
m_QSortData.Sort(DataAnalyze[k], 0, lCount);
m_DataMiddle = m_QSortData.GetMidData(); // 取得中间数
// m_DataMiddle是非偏移码即原码即0-gl_fLsbCount中的任意值
// gl_MiddleLsb 是偏移码值即原码减去gl_lLsbHalf后的值,即在原点上下浮动的值
// gl_MiddleLsb[k]=(int)((m_DataMiddle)-gl_lLsbHalf);
gl_MiddleLsb[k]=(int)(m_DataMiddle - gl_lLsbHalf);
// gl_MiddleLsb[k] = gl_MiddleLsb[k];
CString StrMoveVolt;
switch(m_DigitalDataShowMode)
{
case 0: // 十进制原码
_stprintf(str, _T("CH%d %d Dec"),k,m_DataMiddle-gl_lLsbHalf);
break;
case 1: // 十六进制原码
//StrMoveVolt.Format(_T("%x Hec"),m_DataMiddle.value);
_stprintf(str, _T("CH%d %x Hec"),k,m_DataMiddle);
break;
case 2: // 电压值
//StrMoveVolt.Format(_T("%5.2fmV"),(m_DataMiddle.value-8192)*VOLT_RANGE/gl_fLsbCount);
_stprintf(str, _T("CH%d %5.2fmV"),k,(m_DataMiddle-gl_lLsbHalf)*gl_PerLsbVoltM[k]);
break;
}
//pADStatus->m_nMoveVolt.SetWindowText(StrMoveVolt);
if(pADStatusView != NULL)
pADStatusView->m_nMoveVolt.AddString (str);
}
m_AnalyzeAllCount=0;
m_OverLimitCount=0;
}
if(pADStatusView != NULL)
pADStatusView->m_nMoveVolt.SetCurSel(0);
}
else
{
m_ProcessMoveVolt = 1;
for(int i=0;i<MAX_CHANNEL_COUNT;i++)
{
gl_MiddleLsb[i] = 0;// 如果不偏移, 置偏移值为0
//gl_MiddleLsb[i] = 0;
}
if(pADStatusView != NULL)
{
while(pADStatusView->m_nMoveVolt.GetCount()>0)
pADStatusView->m_nMoveVolt.DeleteString(0);
CString StrMoveVolt;
StrMoveVolt=" ";
pADStatusView->m_nMoveVolt.AddString (StrMoveVolt);
}
}
if(gl_bDeviceADRun==FALSE) // 如果设备没有运行,即静态分析
{
pDigitView->RedrawWindow();
pWaveView->OnDrawPolyLine(gl_nDocDrawLen,gl_nDocDrawIdx);
return;
}
if(nProcessMode == DATA_MODE) // 如果是波形方式,则只更新数字方式
{
pDigitView->RedrawWindow();
}
if(nProcessMode == WAVE_MODE) // 反之则然
{
pWaveView->OnDrawPolyLine(gl_nDocDrawLen,gl_nDocDrawIdx);
}
}
void CADFrame::OnUpdateMoveVolt(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(!m_ProcessMoveVolt);
}
void CADFrame::OnDestroy()
{
// TODO: Add your message handler code here
ACTS1000_SaveParaAD(NULL, &ADPara);
if(gl_bDeviceADRun)//检查是否设备
{
CADDoc* pDoc=(CADDoc*)GetActiveDocument();
pDoc->Public_ReleaseDevice();
}
;
CSysApp* pApp = (CSysApp*)AfxGetApp();
// ACTS1000_ReleaseDevice(pApp->m_hDevice);
pApp->m_bCreateADFrm = FALSE;
pApp->m_ADFrame = NULL;
CMDIChildWnd::OnDestroy();
}
void CADFrame::OnCHECKCheckOverflow()
{
// TODO: Add your control notification handler code here
MessageBox(_T("OnCHECKCheckOverflow"));
}
void CADFrame::OnShowCfgAnalBar()
{
// TODO: Add your command handler code here
m_bShowCfgAnalBar = !m_bShowCfgAnalBar;
ShowControlBar(m_pWndSTCBar, m_bShowCfgAnalBar, false);
}
void CADFrame::OnUpdateShowCfgAnalBar(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bShowCfgAnalBar);
}
void CADFrame::OnShowStatusBar()
{
// TODO: Add your command handler code here
m_bShowStatusBar = !m_bShowStatusBar;
ShowControlBar(&m_wndShowStatus, m_bShowStatusBar, false);
}
void CADFrame::OnUpdateShowStatusBar(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bShowStatusBar);
}
BOOL CADFrame::PreTranslateMessage(MSG* pMsg)
{
//m_ToolTip.RelayEvent(pMsg);
return CMDIChildWnd::PreTranslateMessage(pMsg);
}

View File

@ -0,0 +1,106 @@
// ADFrm.h : interface of the CADFrame class
//
/////////////////////////////////////////////////////////////////////////////
#include "MTabWnd.h"
#if !defined(AFX_ADFRM_H__D485DF03_85AB_11D1_B878_A68EB300DD63__INCLUDED_)
#define AFX_ADFRM_H__D485DF03_85AB_11D1_B878_A68EB300DD63__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Resource.h"
#include "CfgTabCtrlBar.h"
#include "QSortData.h" // Added by ClassView
class CADFrame : public CMDIChildWnd
{
DECLARE_DYNCREATE(CADFrame)
public:
inline void ShowHideDlgSave(BOOL Flag=TRUE)
{ ShowControlBar(&m_wndDlgSave, Flag, FALSE); }
inline void ShowHideStatus(BOOL Flag=TRUE)
{ ShowControlBar(&m_wndShowStatus, Flag,FALSE); }
inline CStatic* m_FileName()
{ return ((CStatic*)m_wndDlgSave.GetDlgItem(IDC_FileName));}
inline CStatic* m_DiskFree()
{ return ((CStatic*)m_wndDlgSave.GetDlgItem(IDC_DiskFree));}
inline CStatic* m_FileLenght()
{ return ((CStatic*)m_wndDlgSave.GetDlgItem(IDC_FileLenght));}
inline CProgressCtrl* m_Progress()
{ return ((CProgressCtrl*)m_wndDlgSave.GetDlgItem(IDC_PROGRESS));}
inline CStatic *m_TimeDiv()
{ return ((CStatic*)m_wndShowStatus.GetDlgItem(IDC_STATIC_TimeOfDiv));}
CADFrame();
// Attributes
public:
LONG DataAnalyze[MAX_CHANNEL_COUNT][8192];
CDialogBar m_wndDlgBar;
CDialogBar m_wndDlgSave;
public:
// CCfgTabCtrlBar m_wndSTCBar; // 放于右侧的形如VC左侧的控件
CCfgTabCtrlBar* m_pWndSTCBar; // 放于右侧的形如VC左侧的控件
CSplitterWnd m_wndSplitter;
CDialogBar m_wndShowStatus;
CDialogBar m_wndSetupDlg;
CDialogBar m_wndSave;
BOOL m_bShowCfgAnalBar;
BOOL m_bShowStatusBar;
//CToolTipCtrl m_ToolTip;
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADFrame)
public:
virtual void ActivateFrame(int nCmdShow = -1);
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
//}}AFX_VIRTUAL
// Implementation
public:
CQSortData m_QSortData;
virtual ~CADFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
protected:
CDialogBar m_DevDlgBar;
//{{AFX_MSG(CADFrame)
afx_msg void OnClose();
afx_msg void OnCancelMode();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
//afx_msg void OnHistoryDigit();
afx_msg void OnHistoryWave();
//afx_msg void OnUpdateHistoryDigit(CCmdUI* pCmdUI);
afx_msg void OnUpdateHistoryWave(CCmdUI* pCmdUI);
afx_msg void OnMoveVolt();
afx_msg void OnDestroy();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnUpdateMoveVolt(CCmdUI* pCmdUI);
afx_msg void OnCHECKCheckOverflow();
afx_msg void OnShowCfgAnalBar();
afx_msg void OnUpdateShowCfgAnalBar(CCmdUI* pCmdUI);
afx_msg void OnShowStatusBar();
afx_msg void OnUpdateShowStatusBar(CCmdUI* pCmdUI);
afx_msg void OnUpdateHalfMode(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ADFRM_H__D485DF03_85AB_11D1_B878_A68EB300DD63__INCLUDED_)

View File

@ -0,0 +1,456 @@
// HistDigitView.cpp:implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ADHistDoc.h"
#include "ADHistDigitView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADHistDigitView
IMPLEMENT_DYNCREATE(CADHistDigitView, CListView)
CADHistDigitView::CADHistDigitView()
{
nChooseMode = 3;
}
CADHistDigitView::~CADHistDigitView()
{
}
BEGIN_MESSAGE_MAP(CADHistDigitView, CListView)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CADHistDigitView)
ON_COMMAND(IDM_SixteenShow, OnSixteenShow)
ON_UPDATE_COMMAND_UI(IDM_SixteenShow, OnUpdateSixteenShow)
ON_COMMAND(IDM_DigitalVoltShowMode, OnDigitalVoltShowMode)
ON_UPDATE_COMMAND_UI(IDM_DigitalVoltShowMode, OnUpdateDigitalVoltShowMode)
ON_COMMAND(IDM_TenShow, OnTenShow)
ON_UPDATE_COMMAND_UI(IDM_TenShow, OnUpdateTenShow)
ON_COMMAND(IDM_REFURBISH, OnRefurbish)
ON_WM_SIZE()
ON_WM_KEYDOWN()
ON_WM_VSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADHistDigitView drawing
void CADHistDigitView::OnDraw(CDC* )
{
}
/////////////////////////////////////////////////////////////////////////////
// CADHistDigitView diagnostics
#ifdef _DEBUG
void CADHistDigitView::AssertValid() const
{
CListView::AssertValid();
}
void CADHistDigitView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CADHistDoc* CADHistDigitView::GetDocument()// non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CADHistDoc)));
return (CADHistDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CADHistDigitView message handlers
void CADHistDigitView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
DWORD type;
type= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
// 改变列表视图的风格,在这里为显示格线
GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(type));
CADHistDoc* pDoc = (CADHistDoc*)GetDocument();
pDoc->m_hWndDigit = m_hWnd;
CString str;
CListCtrl& List = GetListCtrl();
int mChannelCount = pDoc->m_ChannelCount;
long VoltTopRange, VoltBottomRange;
VoltTopRange = pDoc->m_Header.VoltTopRange; // 电压的最大值
VoltBottomRange = pDoc->m_Header.VoltBottomRange; // 电压的最小值
if (abs(VoltBottomRange) <= 5) m_jixing = 1;
else
m_jixing = 0;
int nCnt =0;
for (int nCH=0; nCH<pDoc->m_Header.ADMainInfo.nChannelCount; nCH++)
{
if (pDoc->m_Header.ADPara.bChannelArray[nCH] == 1)
{
//m_PerLsbVolt[nCnt] = (float)((pDoc->m_Header.VoltTopRange-pDoc->m_Header.VoltBottomRange)*1.0 / pDoc->m_fLsbCount);
switch (pDoc->m_Header.ADPara.InputRange[nCH])
{
case ACTS1000_INPUT_N5000_P5000mV:
m_PerLsbVolt[nCnt] = (float)(10000.0 / pDoc->m_fLsbCount);
// pDoc->m_VoltBottomRange[nCnt] = -5000;
// pDoc->m_VoltTopRange[nCnt] = 5000;
break;
case ACTS1000_INPUT_N1000_P1000mV:
m_PerLsbVolt[nCnt] = (float)(2000.0 / pDoc->m_fLsbCount);
// pDoc->m_VoltBottomRange[nCnt] = -1000;
// pDoc->m_VoltTopRange[nCnt] = 1000;
break;
default:
m_PerLsbVolt[nCnt] = (float)(20000.0 / pDoc->m_fLsbCount);
// pDoc->m_VoltBottomRange[nCnt] = -5000;
// pDoc->m_VoltTopRange[nCnt] = 5000;
}
nCnt++;
}
}
CADHistFrm* pFrame = (CADHistFrm*)GetParentFrame();
CListBox* pList = (CListBox*)(pFrame->m_wndSetupBar.GetDlgItem(IDC_FILESINFO));
switch(pDoc->m_Header.BusType)
{//1:PCI, 2:USB, 3:ISA, 4:PC104
case PCI_BUS:
str="BusType:PCI";
break;
case USB_BUS:
str="BusType:USB";
break;
case ISA_BUS:
str="BusType:ISA";
break;
case PC104_BUS:
str="BusType:PC104";
break;
case PXI_BUS:
str="BusType:PXI";
break;
case PCIE_BUS:
str="BusType:PCIE";
break;
}//板卡类型
pList->AddString (str);
str.Format(L"DeviceNum:%x",pDoc->m_Header.DeviceType );
pList->AddString (str);
str.Format(L"HeadSizeBytes:%d",pDoc->m_Header.HeadSizeBytes );
pList->AddString(str);
str.Format(L"分辨率:%d位", pDoc->m_Header.DataWidth);
pList->AddString(str);
// str.Format(L"电压量程:%d%dmV",pDoc->m_Header.VoltBottomRange,pDoc->m_Header.VoltTopRange);
// pList->AddString (str);//电压量程
str.Format(L"触发源:%d",pDoc->m_Header.ADPara.TriggerSource);
pList->AddString (str);//触发源
str.Format(L"触发方向:%d",pDoc->m_Header.ADPara.TriggerDir);
pList->AddString (str);
CEdit* pEditOffset = (CEdit*)(pFrame->m_wndSetupBar.GetDlgItem(IDC_EDIT_Offset));
str.Format(L"%I64d", pDoc->m_Offset);
pEditOffset->SetWindowText(str); // 显示文件偏移
CEdit* pLength = (CEdit*)(pFrame->m_wndSetupBar.GetDlgItem(IDC_EDIT_FileLength));
str.Format(L"%I64d", pDoc->m_FileLength);
pLength->SetWindowText(str); // 显示文件长度(字)
CSliderCtrl* pSliderOffset = (CSliderCtrl*)(pFrame->m_wndSetupBar.GetDlgItem(IDC_SLIDER_Offset));
// 之所以除以通道数,是求出每通道点数
pSliderOffset->SetRange(0, ((pDoc->m_FileLength-sizeof(::_FILE_HEADER))/(sizeof(WORD) * mChannelCount)-pDoc->m_ReadDataSize/mChannelCount)/pDoc->m_SliderRatio); // 设置滑动条范围(字)
pSliderOffset->SetPageSize(1000*pDoc->m_SliderRatio);
CEdit* pEditPerChannel = (CEdit*)(pFrame->m_wndSetupBar.GetDlgItem(IDC_EDIT_PerChannel));
str.Format(_T("%I64d点/通道"), (pDoc->m_FileLength-sizeof(::_FILE_HEADER)) / (sizeof(WORD) * mChannelCount));
pEditPerChannel->SetWindowText(str); // 显示每通道点数
CComboBox* pRate = (CComboBox*)(pFrame->m_wndSetupBar.GetDlgItem(IDC_COMBO_Rate));
pRate->SetCurSel(0);
CStatic* pLabel = (CStatic*)pFrame->m_wndSetupBar.GetDlgItem(IDC_STATIC_CardType);
pLabel->SetWindowText(pDoc->m_File.GetFilePath());
List.InsertColumn(0, L"Index" ,LVCFMT_LEFT,42,-1); // 加入第一列
int Row = 0;
for (Row=0; Row<(int)(pDoc->m_ReadDataSize/mChannelCount); Row++)
{
str.Format(L"%d", Row);
List.InsertItem(Row, str); // 添加行号,应一个紧接一个插入
}
//str.Format(L"数据回放:%s",pDoc->m_File.GetFileName());
str.Format(L"%s",pDoc->m_File.GetFileName());
pDoc->SetTitle(str);
SetListView(); // 向列表中添加数据
GetListCtrl().SetHotItem(0);
}
void CADHistDigitView::SetListView(void)
{
CADHistDoc* pDoc = (CADHistDoc*)GetDocument();
CListCtrl& List = GetListCtrl();
int Col = 0, Row = 0;
List.ShowWindow(SW_HIDE);
List.SetRedraw(FALSE);
int index(0);
int nEndRow = 0;
int nChannel = 0;
INT ChannelCount = pDoc->m_ChannelCount;
pDoc->ReadData();
int ch=0;
// for (nChannel=0; nChannel<MAX_CHANNEL_COUNT; nChannel++)
// {
// if (gl_ChannelArrary[nChannel] == TRUE)
// {
// gl_Channel[ch] =nChannel;
// ch++;
// }
// }
switch (nChooseMode)
{
case 1:
for (nChannel=0; nChannel<MAX_CHANNEL_COUNT; nChannel++)
{
if (pDoc->m_Header.ADPara.bChannelArray[nChannel] == TRUE)
{
CString strChannel;
List.DeleteColumn(nChannel + 1);
strChannel.Format(_T("CH%d"), nChannel + 0);
List.InsertColumn(nChannel + 1, strChannel, LVCFMT_LEFT, 70, -1);
}
}
break;
case 2:
for (nChannel=0; nChannel<MAX_CHANNEL_COUNT; nChannel++)
{
if (pDoc->m_Header.ADPara.bChannelArray[nChannel] == TRUE)
{
CString strChannel;
List.DeleteColumn(nChannel + 1);
strChannel.Format(_T("CH%d"), nChannel + 0);
List.InsertColumn(nChannel + 1, strChannel, LVCFMT_LEFT, 85, -1);
}
}
break;
case 3:
for (nChannel=0; nChannel<MAX_CHANNEL_COUNT; nChannel++)
{
if (pDoc->m_Header.ADPara.bChannelArray[nChannel] == TRUE)
{
CString strChannel;
List.DeleteColumn(nChannel + 1);
strChannel.Format(_T("CH%d"), nChannel + 0);
List.InsertColumn(nChannel + 1, strChannel, LVCFMT_LEFT, 70, -1);
}
}
break;
default:
ASSERT(FALSE);
break;
}
__int64 start = pDoc->m_Offset - pDoc->m_Offset % ChannelCount;
for (Row=0; Row<(INT)(pDoc->m_ReadDataSize/ChannelCount); Row++)
{
if((pDoc->m_Offset + Row) < (pDoc->m_FileLength-sizeof(::_FILE_HEADER))/(sizeof(WORD) * ChannelCount))
{
swprintf_s(str, _T("%I64d"), pDoc->m_Offset + Row);
List.SetItemText(Row, 0, str); // 更新Index列
for (Col=0; Col<(INT)ChannelCount; Col++)
{
switch (nChooseMode)
{
case 1: // 十进制显示
swprintf_s(str, _T("%d"), (pDoc->m_ADBuffer[index]) & pDoc->m_wMaxLSB);
break;
case 2: // 十六进制显示
swprintf_s(str, _T("%x"), (pDoc->m_ADBuffer[index]) & pDoc->m_wMaxLSB);
break;
case 3:
{
_stprintf(str,_T("%.2f"), (float)((((pDoc->m_ADBuffer[Row*ChannelCount+Col])&pDoc->m_wMaxLSB)-pDoc->m_lLsbHalf)*m_PerLsbVolt[Col]));
// float tempResult;
// tempResult = (float)((pDoc->m_ADBuffer[index]) & pDoc->m_wMaxLSB);
// tempResult = ((float)(tempResult/LSB_COUNT)) * 2 * voltMid[ADPara.InputRange[gl_Channel[Col]]];
// if (m_jixing == 0)
// swprintf_s(str, _T("%.2f"), (tempResult - voltMid[ADPara.InputRange[gl_Channel[Col]]]));
// else
// swprintf_s(str, _T("%.2f"), (tempResult));
break;
}
default:
ASSERT(FALSE);
break;
}
if (index > (INT)(pDoc->m_nCount * ChannelCount)) return;
List.SetItemText(Row, (start % ChannelCount) + 1, str);// 添加各行内容
start++;
index++;
}
nEndRow = Row;
}
else
List.DeleteItem(nEndRow+1);
}
List.SetRedraw(TRUE);
List.ShowWindow(SW_SHOW);
}
BOOL CADHistDigitView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style &= ~(LVS_LIST | LVS_ICON | LVS_SMALLICON);
cs.style |= LVS_REPORT;
cs.style |= LVS_SINGLESEL;
cs.style |= LVS_SHOWSELALWAYS;
return CListView::PreCreateWindow(cs);
}
void CADHistDigitView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
CListView::OnUpdate(pSender, lHint, pHint);
}
#include "resource.h"
void CADHistDigitView::OnContextMenu(CWnd*, CPoint point)
{
// CG: This block was added by the Pop-up Menu component
{
if (point.x == -1 && point.y == -1){
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_HisMouseR));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
}
void CADHistDigitView::OnSixteenShow()
{
// TODO: Add your command handler code here
//AfxMessageBox(L"十六进制");
nChooseMode=2;
SetListView();//刷新列表
}
void CADHistDigitView::OnUpdateSixteenShow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(nChooseMode==2);
}
void CADHistDigitView::OnDigitalVoltShowMode()
{
// TODO: Add your command handler code here
//AfxMessageBox(L"电压显示");
nChooseMode=3;
SetListView();//刷新列表
}
void CADHistDigitView::OnUpdateDigitalVoltShowMode(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(nChooseMode==3);
}
void CADHistDigitView::OnTenShow()
{
// TODO: Add your command handler code here
//AfxMessageBox(L"十进制显示");
nChooseMode=1;//刷新列表
SetListView();//刷新列表
}
void CADHistDigitView::OnUpdateTenShow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(nChooseMode==1);
}
void CADHistDigitView::OnRefurbish() //刷新列表
{
// TODO: Add your command handler code here
SetListView();//刷新列表
}
void CADHistDigitView::OnSize(UINT nType, int cx, int cy)
{
CListView::OnSize(nType, cx, cy);
CADHistDoc* pDoc=(CADHistDoc*)GetDocument();
CRect rect;
GetWindowRect(&rect);
pDoc->m_nDigitWidth=rect.right+7;
}
void CADHistDigitView::SetHotItem(int Index)
{
GetListCtrl().SetHotItem(Index);
}
void CADHistDigitView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CListView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CADHistDigitView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CListView::OnVScroll(nSBCode, nPos, pScrollBar);
}

View File

@ -0,0 +1,77 @@
#if !defined(AFX_HistDigitView_H__D442B983_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)
#define AFX_HistDigitView_H__D442B983_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// HistDigitView.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CADHistDigitView view
class CADHistDigitView : public CListView
{
protected:
CADHistDigitView(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CADHistDigitView)
// Attributes
public:
CADHistDoc* GetDocument();
void SetListView(void);
// Operations
public:
void SetHotItem(int Index);
float m_PerLsbVolt[MAX_CHANNEL_COUNT];
WCHAR str[100];
int m_jixing;
int nChooseMode; // 1、十进制显示 2、十六进制显示 3、电压显示
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADHistDigitView)
public:
virtual void OnInitialUpdate();
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CADHistDigitView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
protected:
afx_msg void OnContextMenu(CWnd*, CPoint point);
//{{AFX_MSG(CADHistDigitView)
afx_msg void OnSixteenShow();
afx_msg void OnUpdateSixteenShow(CCmdUI* pCmdUI);
afx_msg void OnDigitalVoltShowMode();
afx_msg void OnUpdateDigitalVoltShowMode(CCmdUI* pCmdUI);
afx_msg void OnTenShow();
afx_msg void OnUpdateTenShow(CCmdUI* pCmdUI);
afx_msg void OnRefurbish();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in ShowDigitView.cpp
inline CADHistDoc* CADHistDigitView::GetDocument()
{ return (CADHistDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_HistDigitView_H__D442B983_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)

View File

@ -0,0 +1,244 @@
// HistDataDoc.cpp : implementation file
//
#include "stdafx.h"
#include "ADHistDoc.h"
#include "ADHistDigitView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADHistDoc
IMPLEMENT_DYNCREATE(CADHistDoc, CDocument)
CADHistDoc::CADHistDoc()
{
m_Offset = 0;
m_SliderOffset = 0;
m_Rate = 1;
m_nFileNum = 0;
m_ReadDataSize = 4096;
m_bAsynMode = FALSE;
m_HistScreenWith = GetSystemMetrics(SM_CXSCREEN); // 取得屏幕宽度
for (int index=0; index<MAX_CHANNEL_COUNT; index++)
{
m_HistDataBuffer[index] = new WORD[m_HistScreenWith];
}
}
BOOL CADHistDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
return TRUE;
}
CADHistDoc::~CADHistDoc()
{
CSysApp *pApp = (CSysApp*)AfxGetApp();
//pApp->m_strFilePath = "";
for (int index=0; index<MAX_CHANNEL_COUNT; index++)
{
if (NULL != m_HistDataBuffer[index])
{
delete [] m_HistDataBuffer[index];
}
}
}
BEGIN_MESSAGE_MAP(CADHistDoc, CDocument)
//{{AFX_MSG_MAP(CADHistDoc)
ON_COMMAND(IDM_HistoryData, OnHistoryData)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADHistDoc diagnostics
#ifdef _DEBUG
void CADHistDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CADHistDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CADHistDoc serialization
void CADHistDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CADHistDoc commands
BOOL CADHistDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
CSysApp *pApp = (CSysApp*)AfxGetApp();
//TCHAR* pFileName = pApp->m_strFilePath.GetBuffer(sizeof(pApp->m_strFilePath)); // 类型转换
if (m_File.Open(lpszPathName, CFile::modeRead)) // 打开文件
{
m_File.Seek(0, CFile::begin);
m_File.Read((WORD*)&m_Header, sizeof(m_Header));
m_ChannelCount = m_Header.ChannelCount;
m_ReadDataSize = m_ReadDataSize-m_ReadDataSize%(m_ChannelCount);
}
m_FileLength = ((m_File.GetLength() /*- sizeof(::_FILE_HEADER)*/)); // 文件长度(字)
if (m_FileLength<0x7FFFFFFF)
{
m_SliderRatio = 1;
}
else
{
m_SliderRatio = (m_FileLength/0x7FFFFFFF)+1;
// if (m_SliderRatio<100)
// {
// m_SliderRatio = 100;
// }
}
m_fLsbCount = (float)m_Header.ADMainInfo.nSampCodeCount;
m_wMaxLSB = (WORD)(m_Header.ADMainInfo.nSampCodeCount-1);
m_lLsbHalf = (WORD)(m_Header.ADMainInfo.nSampCodeCount/2);
int nSampChanCount = 0;
for (int nChannel=0; nChannel<MAX_CHANNEL_COUNT; nChannel++)
{
if (m_Header.ADPara.bChannelArray[nChannel] == TRUE)
{
m_ChCfg[nSampChanCount] =nChannel;
nSampChanCount++;
}
}
return TRUE;
}
void CADHistDoc::ReadData(void)
{
m_File.Seek(0, CFile::begin);
if (m_nCount>256) m_nCount = 256;
LONGLONG loffset = (m_Offset * sizeof(WORD))*m_ChannelCount + m_Header.HeadSizeBytes;
m_File.Seek(loffset, CFile::begin);
try
{
m_nCount = m_File.Read((ULONG*)&m_ADBuffer, sizeof(m_ADBuffer));
}
catch(...)
{
AfxMessageBox(_T("文件访问过程出现异常错误"));
return;
}
m_nCount = m_nCount/sizeof(WORD)/m_ChannelCount;
}
void CADHistDoc::OnHistoryData()
{
// TODO: Add your command handler code here
((CSysApp*)AfxGetApp())->OnHistoryData();
}
PWORD CADHistDoc::GetBuffer(LONGLONG* pDataSizeWords) //
{
ASSERT(pDataSizeWords != NULL);
m_File.Seek(0, CFile::begin);
LONGLONG loffset = sizeof(::_FILE_HEADER)+(m_Offset*sizeof(WORD))*m_ChannelCount;
*pDataSizeWords = (m_FileLength /*- m_Header.HeadSizeBytes*/-loffset)/(sizeof(WORD)*m_ChannelCount);
if (*pDataSizeWords == -1)
{
int a= 0;
}
m_File.Seek(loffset, CFile::begin);
try
{
m_File.Read((ULONG*)&m_ADBuffer, sizeof(m_ADBuffer));
}
catch(...)
{
AfxMessageBox(_T("文件访问过程出现异常错误"));
return 0;
}
return m_ADBuffer;
}
PWORD CADHistDoc::GetBuffer(int iChannel, LONGLONG iOffset, LONGLONG* pDataSizeWords)
{
ASSERT(iOffset >= 0);
if ((iChannel>=0) && (iChannel<MAX_CHANNEL_COUNT))
{
if ((iChannel>=0) && (iChannel<MAX_CHANNEL_COUNT))
{
LONGLONG iDataLength = 0; // 整个缓冲区长度
PWORD pDataBuff = this->GetBuffer(&iDataLength);
//iDataLength = iDataLength/m_ChannelCount; // 转化为单个通道的长度
// 单个通道数据点数
int iDataPos = 0; // 数据在大缓冲区中的位置
int iPos=0;
for ( iPos=0; iPos<m_HistScreenWith; iPos++)//??
{
if (iPos > iDataLength)
{
break;
}
// 计算在大缓冲区中的位置
iDataPos = iPos * m_ChannelCount + (iChannel - 0);
m_HistDataBuffer[iChannel][iPos] = (SHORT)(pDataBuff[iDataPos] & m_wMaxLSB);
if ((iOffset+iPos) > (LONGLONG)((m_FileLength-sizeof(::_FILE_HEADER))/(sizeof(WORD) * m_ChannelCount)))
{
m_HistDataBuffer[iChannel][iPos] = NULL;
}
}
if (pDataSizeWords != NULL)
{
// 返回数据点个数
*pDataSizeWords = iPos-1;
}
return m_HistDataBuffer[iChannel];
}
else
{
ASSERT(FALSE); // 没有对该通道采集数据
return NULL;
}
}
else
{
ASSERT(FALSE); // 通道参数不合理
return NULL;
}
return NULL;
}

View File

@ -0,0 +1,88 @@
#if !defined(AFX_HistDataDoc_H__D442B985_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)
#define AFX_HistDataDoc_H__D442B985_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// HistDataDoc.h : header file
//
#include "Sys.h"
#include "ADHistFrm.h"
/////////////////////////////////////////////////////////////////////////////
// CADHistDoc document
class CADHistDoc : public CDocument
{
protected:
CADHistDoc(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CADHistDoc)
PWORD m_HistDataBuffer[MAX_CHANNEL_COUNT];
INT m_HistScreenWith;
public:
HWND m_hWndDigit; // 数字窗口句柄
HWND m_hWndWave; // 波形窗口句柄
// Attributes
public:
int m_nDigitWidth;
CFile m_File;
CString m_FileName;
__int64 m_FileLength;
__int64 m_SliderRatio; // Slider压缩比
FILE_HEADER m_Header; // 保存文件头信息
// LONG m_VoltBottomRange[8]; // 量程下限(mV)
// LONG m_VoltTopRange[8]; // 量程上限(mV)
int m_ChannelCount;
LONGLONG m_SliderOffset; // Slider偏移(字)
LONGLONG m_Offset; // 文件偏移(字)
WORD m_ADBuffer[8192];
int m_Rate; // 回放速度
ULONG m_ScreenOffset; // 屏幕位置
int m_nFileNum; // 文件号
LONG m_nCount; // 各个通道的数据个数
WORD m_wMaxLSB;
float m_fLsbCount;
WORD m_lLsbHalf;
ULONG m_ChCfg[MAX_CHANNEL_COUNT];
public:
void ReadData(void);
PWORD GetBuffer(LONGLONG* pDataSizeWords);
PWORD GetBuffer(int iChannel = 0, LONGLONG iOffSet = 0, LONGLONG* pDataSizeWords = NULL);
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADHistDoc)
public:
virtual void Serialize(CArchive& ar); // overridden for document i/o
virtual BOOL OnNewDocument();
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
//}}AFX_VIRTUAL
// Implementation
public:
UINT m_ReadDataSize;
int m_nDigitLine;
virtual ~CADHistDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
protected:
BOOL m_bAsynMode;
//{{AFX_MSG(CADHistDoc)
afx_msg void OnHistoryData();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_HistDataDoc_H__D442B985_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)

View File

@ -0,0 +1,423 @@
// HistDataFrm.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ADHistFrm.h"
#include "ADHistDigitView.h"
#include "ADHistWaveView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADHistFrm
IMPLEMENT_DYNCREATE(CADHistFrm, CMDIChildWnd)
CADHistFrm::CADHistFrm()
{
m_bStart = FALSE;
m_ShowMode = 2; // 波形回放1为数字回放
m_PositionAoffset = 0;
}
CADHistFrm::~CADHistFrm()
{
}
BEGIN_MESSAGE_MAP(CADHistFrm, CMDIChildWnd)
ON_WM_CREATE()
ON_COMMAND_EX(CG_ID_VIEW_DIALOGBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(CG_ID_VIEW_DIALOGBAR, OnUpdateControlBarMenu)
//{{AFX_MSG_MAP(CADHistFrm)
ON_WM_LBUTTONUP()
ON_WM_TIMER()
ON_WM_SIZE()
ON_COMMAND(IDM_History_Start, OnHistoryStart)
ON_UPDATE_COMMAND_UI(IDM_History_Start, OnUpdateHistoryStart)
ON_COMMAND(IDM_History_Stop, OnHistoryStop)
ON_UPDATE_COMMAND_UI(IDM_History_Stop, OnUpdateHistoryStop)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_Offset, OnCustomdrawSLIDEROffset)
ON_CBN_SELCHANGE(IDC_COMBO_Rate, OnSelchangeCOMBORate)
ON_EN_CHANGE(IDC_EDIT_Offset, OnChangeEDITOffset)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON_RefrushData, OnBUTTONRefrushData)
ON_BN_CLICKED(IDC_BUTTON_PositionA, OnBUTTONPositionA)
ON_BN_CLICKED(IDC_BUTTON_PositionB, OnBUTTONPositionB)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_Goto, &CADHistFrm::OnBnClickedGoto)
ON_EN_KILLFOCUS(IDC_EDIT_Offset, &CADHistFrm::OnEnKillfocusEditOffset)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADHistFrm message handlers
BOOL CADHistFrm::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
if (!m_wndSplitter.CreateStatic(this, 1, 2)) // 创建1行2列分割
{
TRACE0("Failed to CreateStaticSplitter\n");
return FALSE;
}
// add the first splitter pane - the default view in column 0
// 创建第一个格子在0列中使用默认的视图由文档模板决定
if (!m_wndSplitter.CreateView(0, 0,
pContext->m_pNewViewClass, CSize(250, 50), pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 1,
RUNTIME_CLASS(CADHistWaveView), CSize(350, 50), pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
return TRUE;
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}
int CADHistFrm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
{
// Initialize dialog bar m_wndSetupBar
if (!m_wndSetupBar.Create(this, CG_IDD_HistoryDlg,
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
CG_ID_VIEW_DIALOGBAR))
{
TRACE0("Failed to create dialog bar m_wndSetupBar\n");
return -1; // fail to create
}
m_wndSetupBar.EnableDocking(CBRS_ALIGN_BOTTOM | CBRS_ALIGN_TOP);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndSetupBar);
CButton* pRadioA = (CButton*)m_wndSetupBar.GetDlgItem(IDC_RADIO_PositionA);
CButton* pRadioB = (CButton*)m_wndSetupBar.GetDlgItem(IDC_RADIO_PositionB);
pRadioA->EnableWindow(FALSE);
pRadioB->EnableWindow(FALSE);
pRadioA->SetCheck(1);
pRadioB->SetCheck(0);
}
return 0;
}
void CADHistFrm::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnLButtonUp(nFlags, point);
}
void CADHistFrm::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CADHistWaveView* pWaveView = (CADHistWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave));
//pDoc->m_Offset += (pDoc->m_Rate*pDoc->m_SliderRatio);
// pDoc->m_SliderOffset += pDoc->m_Rate;
// pDoc->m_Offset = pDoc->m_SliderOffset*pDoc->m_SliderRatio;
pDoc->m_Offset += pDoc->m_Rate;
pDoc->m_SliderOffset = pDoc->m_Offset/pDoc->m_SliderRatio;
LONG nChannelCount = pDoc->m_ChannelCount;
LONGLONG lPointCount = (pDoc->m_FileLength-sizeof(::_FILE_HEADER)) / (sizeof(WORD) * nChannelCount);
if (pDoc->m_Offset >= (lPointCount-pDoc->m_ReadDataSize/nChannelCount))
{
pDoc->m_Offset = lPointCount-pDoc->m_ReadDataSize/nChannelCount;
pDoc->m_SliderOffset = pDoc->m_Offset/pDoc->m_SliderRatio;
KillTimer(1);
}
RedrawDataWindow();
CMDIChildWnd::OnTimer(nIDEvent);
}
void CADHistFrm::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
void CADHistFrm::OnHistoryStart()
{
// TODO: Add your command handler code here
m_bStart=TRUE;
SetTimer(1, 200, NULL);
}
void CADHistFrm::OnUpdateHistoryStart(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_bStart==FALSE?1:0);
}
void CADHistFrm::OnHistoryStop()
{
// TODO: Add your command handler code here
m_bStart=FALSE;
KillTimer(1);
}
void CADHistFrm::OnUpdateHistoryStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_bStart==TRUE?1:0);
}
void CADHistFrm::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CADHistFrm::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CADHistFrm::OnCustomdrawSLIDEROffset(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CSliderCtrl* pSliderOffset = (CSliderCtrl*)(m_wndSetupBar.GetDlgItem(IDC_SLIDER_Offset));
int Pos = pSliderOffset->GetPos(); // 取得滑动条位置(即文件偏移(字))
pSliderOffset->SetPos(Pos);
pDoc->m_SliderOffset = Pos;
pDoc->m_Offset = Pos*pDoc->m_SliderRatio; // 文档中的文件偏移等于滑尺的偏移位置
int ChannelCount;
ChannelCount = pDoc->m_ChannelCount;
CString str;
CEdit* pEditOffset = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_Offset));
CEdit* pEditScreenPos = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_ScreenPos));
str.Format(L"%I64d", pDoc->m_Offset);
pEditOffset->SetWindowText(str); // 显示文件偏移
str.Format(L"%I64d", pDoc->m_Offset);
pEditScreenPos->SetWindowText(str);
RedrawDataWindow(); // 重绘数据视图
Invalidate();
*pResult = 0;
}
void CADHistFrm::RedrawDataWindow(void)
{
CString strScreenPos;
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CADHistDigitView* pDigitView = (CADHistDigitView*)(CWnd::FromHandle(pDoc->m_hWndDigit));
CADHistWaveView* pWaveView = (CADHistWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave));
int ScreenPositon = (int)pWaveView->m_ADHistScope.m_ScreenPosition;
int ChannelCount = pDoc->m_ChannelCount;
CEdit* pEditScreenPos = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_ScreenPos));
strScreenPos.Format(_T("%I64d"), pDoc->m_Offset/*/ChannelCount*/);
pEditScreenPos->SetWindowText(strScreenPos);
CString strOffset;
CEdit* pEditOffset = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_Offset));
//strOffset.Format(_T("%d"), Pos);
pEditOffset->SetWindowText(strScreenPos); // 显示文件偏移
CSliderCtrl* pSliderOffset = (CSliderCtrl*)(m_wndSetupBar.GetDlgItem(IDC_SLIDER_Offset));
//pSliderOffset->SetPos(pDoc->m_Offset/pDoc->m_SliderRatio);
pSliderOffset->SetPos((int)pDoc->m_SliderOffset);
pWaveView->RedrawWindow();
LONGLONG iDataLenth = 0;
PWORD pBuff = NULL;
for (int iChannel=0; iChannel<pDoc->m_ChannelCount; iChannel++)
{
pBuff = pDoc->GetBuffer(iChannel, pDoc->m_Offset, &iDataLenth);
if (pBuff != NULL)
{
pWaveView->m_ADHistScope.AppendPoly(pBuff, iChannel, iDataLenth, pDoc->m_Offset, FALSE);
}
}
}
void CADHistFrm::OnSelchangeCOMBORate()
{
// TODO: Add your control notification handler code here
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CComboBox* pRate=(CComboBox*)(m_wndSetupBar.GetDlgItem(IDC_COMBO_Rate));
CString str;
int Index=pRate->GetCurSel(); // 取得当前选择索引号
pRate->GetLBText(Index,str); // 根据选择,取得所选择项文本
pDoc->m_Rate=wcstol(str,NULL, 10); // 将字符转换成数字
}
void CADHistFrm::OnChangeEDITOffset()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CMDIChildWnd::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
void CADHistFrm::OnClose()
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnClose();
}
void CADHistFrm::OnBUTTONRefrushData()
{
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CADHistDigitView* pDigitView = (CADHistDigitView*)(CWnd::FromHandle(pDoc->m_hWndDigit));
pDigitView->SetListView();
}
void CADHistFrm::ActivateFrame(int nCmdShow)
{
CListBox* pList = (CListBox*)(m_wndSetupBar.GetDlgItem(IDC_FILESINFO));
pList->RedrawWindow();
pList->SendMessage(WS_VSCROLL, SB_LINEDOWN, NULL);
CMDIChildWnd::ActivateFrame(nCmdShow);
}
CDocument* CADHistFrm::GetActiveDocument()
{
return CMDIChildWnd::GetActiveDocument();
}
BOOL CADHistFrm::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
{
return CMDIChildWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext);
}
void CADHistFrm::OnBUTTONPositionA()
{
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CADHistWaveView* pWaveView = (CADHistWaveView*)CWnd::FromHandle(pDoc->m_hWndWave);
CADHistDigitView* pView = (CADHistDigitView*)CWnd::FromHandle(pDoc->m_hWndDigit);
CString strPositionA;
CStatic* pStaticA = (CStatic*)m_wndSetupBar.GetDlgItem(IDC_STATIC_PositionA);
pStaticA->GetWindowText(strPositionA);
pView->SetListView();
CListCtrl& List = pView->GetListCtrl();
LPCTSTR lpszmyString = strPositionA;
LVFINDINFO info;
int nIndex;
info.flags = LVFI_STRING;
info.psz = lpszmyString;
while ((nIndex = List.FindItem(&info)) != -1)
{
if (nIndex >= 0)
{
List.EnsureVisible(nIndex, FALSE); // 使listctrl中一项可见即滚动滚动条
List.SetItemState(nIndex, 2, LVIS_SELECTED|LVIS_FOCUSED); // 选中一行(0,为取消)
List.SetFocus();
break;
}
}
Invalidate();
}
void CADHistFrm::OnBUTTONPositionB()
{
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CADHistWaveView* pWaveView = (CADHistWaveView*)CWnd::FromHandle(pDoc->m_hWndWave);
CADHistDigitView* pView = (CADHistDigitView*)CWnd::FromHandle(pDoc->m_hWndDigit);
CString strPositionB;;
CStatic* pStaticB = (CStatic*)m_wndSetupBar.GetDlgItem(IDC_STATIC_PositionB);
pStaticB->GetWindowText(strPositionB);
pView->SetListView();
CListCtrl& List = pView->GetListCtrl();
LPCTSTR lpszmyString = strPositionB;
LVFINDINFO info;
int nIndex;
info.flags = LVFI_STRING;
info.psz = lpszmyString;
while ((nIndex = List.FindItem(&info)) != -1)
{
if (nIndex >= 0)
{
List.EnsureVisible(nIndex, FALSE); // 使listctrl中一项可见即滚动滚动条
List.SetItemState(nIndex, 2, LVIS_SELECTED|LVIS_FOCUSED); // 选中选中一行(0,为取消)
List.SetFocus();
break;
}
}
Invalidate();
}
void CADHistFrm::OnBUTTONTriggerPos()
{
}
void CADHistFrm::OnBnClickedGoto()
{
// TODO: 在此添加控件通知处理程序代码
CADHistDoc* pDoc = (CADHistDoc*)GetActiveDocument(); // 在Frame中取得当前文档指针
CEdit* pEditOffset = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_Offset));
CString str;
pEditOffset->GetWindowText(str); // 显示文件偏移
ULONG ul = _tcstol(str, NULL, 10);
CSliderCtrl* pSliderOffset = (CSliderCtrl*)(m_wndSetupBar.GetDlgItem(IDC_SLIDER_Offset));
pSliderOffset->SetPos(ul/pDoc->m_SliderRatio);
pDoc->m_Offset = ul/pDoc->m_SliderRatio*pDoc->m_SliderRatio; // 文档中的文件偏移等于滑尺的偏移位置
// int ChannelCount;
// ChannelCount = pDoc->m_ChannelCount;
// CString str;
// CEdit* pEditOffset = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_Offset));
// CEdit* pEditScreenPos = (CEdit*)(m_wndSetupBar.GetDlgItem(IDC_EDIT_ScreenPos));
// str.Format(L"%I64d", pDoc->m_Offset);
// pEditOffset->SetWindowText(str); // 显示文件偏移
// str.Format(L"%I64d", pDoc->m_Offset);
// pEditScreenPos->SetWindowText(str);
RedrawDataWindow(); // 重绘数据视图
Invalidate();
}
void CADHistFrm::OnEnKillfocusEditOffset()
{
// TODO: 在此添加控件通知处理程序代码
}

View File

@ -0,0 +1,80 @@
#if !defined(AFX_HistDataFrm_H__D442B980_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)
#define AFX_HistDataFrm_H__D442B980_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// HistDataFrm.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CADHistFrm frame
class CADHistFrm : public CMDIChildWnd
{
DECLARE_DYNCREATE(CADHistFrm)
protected:
CADHistFrm(); // protected constructor used by dynamic creation
// Attributes
public:
CSplitterWnd m_wndSplitter;
CDialogBar m_wndSetupBar;
public:
BOOL m_bStart;
int m_ShowMode;
LONG m_PositionAoffset;
public:
void RedrawDataWindow(void);
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADHistFrm)
public:
virtual void ActivateFrame(int nCmdShow = -1);
virtual CDocument* GetActiveDocument();
virtual BOOL LoadFrame(UINT nIDResource, DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CWnd* pParentWnd = NULL, CCreateContext* pContext = NULL);
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
//}}AFX_VIRTUAL
// Implementation
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
virtual ~CADHistFrm();
// Generated message map functions
//{{AFX_MSG(CADHistFrm)
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHistoryStart();
afx_msg void OnUpdateHistoryStart(CCmdUI* pCmdUI);
afx_msg void OnHistoryStop();
afx_msg void OnUpdateHistoryStop(CCmdUI* pCmdUI);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnCustomdrawSLIDEROffset(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchangeCOMBORate();
afx_msg void OnChangeEDITOffset();
afx_msg void OnClose();
afx_msg void OnBUTTONRefrushData();
afx_msg void OnBUTTONPositionA();
afx_msg void OnBUTTONPositionB();
afx_msg void OnBUTTONTriggerPos();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedGoto();
afx_msg void OnEnKillfocusEditOffset();
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_HistDataFrm_H__D442B980_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,177 @@
// ADHistScope.h : header file
//
#ifndef __ADHistScope_H__
#define __ADHistScope_H__
/////////////////////////////////////////////////////////////////////////////
// CADHistScope window
#define COLR_COUNT 4
class CADHistScope : public CWnd
{
// Construction
public:
CADHistScope();
virtual ~CADHistScope();
// Attributes
public:
BOOL IsShowAllChannle();
BOOL ShowChannel(INT iFirstChannel, INT iLastChannel, BOOL bUpata = TRUE);
void AppendPoly(PWORD pBuff, const INT iChannel, LONGLONG iDataSize, LONGLONG iOffset = 0, BOOL bUpdata = TRUE);
void SetRange(float dLower, float dUpper, INT nChannel); // 设置数据量程
void SetVisableRange(float dLower, float dUpper, INT nChannel); // 设置显示范围
void SetXUnits(CString string);
void SetYUnits(CString string);
void SetGridColor(COLORREF color);
void SetPlotColor(COLORREF color);
void SetBackgroundColor(COLORREF color);
void Reset();
// Operations
public:
void SetTileMode();
BOOL IsTileMode();
void SetSuperMode();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADHistScope)
public:
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=NULL);
//}}AFX_VIRTUAL
// Implementation
protected:
void DrawSingleCHText(CDC *pDC, INT nChannelNum);
void DrawAllChannelText(CDC *pDC);
void DrawSingleCHGrid(CDC *pDC);
void DrawAllChannelGrid(CDC *pDC);
void SetStatusBar();
protected:
INT m_nChannelCount;
INT m_iActivexChannel; // 放大显示时的通道索引
WORD m_wMaxLSB;
float m_fLsbCount;
WORD m_lLsbHalf;
ULONG m_ChCfg[MAX_CHANNEL_COUNT];
// 通道信息
PPOINT m_pPtCHannel[MAX_CHANNEL_COUNT]; // 所有通道显示的点数据
LONGLONG m_iOffset[MAX_CHANNEL_COUNT];
INT m_iDataLength[MAX_CHANNEL_COUNT];
PWORD m_pDataBuff[MAX_CHANNEL_COUNT];
CRect m_rcChannel[MAX_CHANNEL_COUNT];
BOOL m_bVisable[MAX_CHANNEL_COUNT];
float m_fLowerLimit[MAX_CHANNEL_COUNT]; // lower bounds
float m_fUpperLimit[MAX_CHANNEL_COUNT]; // upper bounds
float m_fVisableLower[MAX_CHANNEL_COUNT]; // 显示范围上限
float m_fVisableUpper[MAX_CHANNEL_COUNT]; // 显示范围下限
CArray<INT, INT&>m_arrayVisableChannel; // 可见通道序列
void UpdateVisableChannleArray(); // 显示通道序列
void UpdataChannelRect();
INT m_nRBtnMoveX;
INT m_MouseOffset; // 鼠标在绘图区的偏移位置
INT m_OldMoveX1; // 各条能移动的线的位置
INT m_OldMoveX2;
LONGLONG m_CurPosition;
INT m_CurMoveX1;
INT m_CurMoveX2;
INT m_RBtnDownPosX;
INT m_StartOldMoveX1;
INT m_StartOldMoveX2;
COLORREF m_crLineAColor; // A线的颜色
COLORREF m_crLineBColor; // B线的颜色
COLORREF m_crLineVColor; // C线的颜色
CPen m_PenLineA; // A线的画笔
CPen m_PenLineB; // B线的画笔
CPen m_PenLineV; // V线的画笔
int m_nPositionA;
int m_nPositionB;
HCURSOR m_hCursorHSize;
HCURSOR m_hCursorVSize;
HCURSOR m_hCursorArrow;
HCURSOR m_hCursorAllSize;
INT m_nShowCursor;
INT m_CurVoltageY;
INT m_OldVoltageY;
INT m_nLineIndex;
BOOL m_bAllChannel;
INT m_nShiftPixels;
INT m_nYDecimals;
CString m_strXUnitsString;
CString m_strYUnitsString;
COLORREF m_crBackColor;
COLORREF m_crGridColor;
COLORREF m_crPlotColor;
double m_dCurrentPosition;
public:
double m_ScreenPosition;
private:
VOID ProssDataToPT(INT iChannel);
void DrawBkGnd(); // 画网格线
void DrawPoly();
protected:
CPen m_penChannel[MAX_CHANNEL_COUNT];
COLORREF m_clPen[MAX_CHANNEL_COUNT];
void DrawMoveLine(CDC *pDC, CPoint poINT);
BOOL m_bRBtnDown;
BOOL m_bOnlyLine;
BOOL m_bLBtnDown;
//{{AFX_MSG(CADHistScope)
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, INT cx, INT cy);
afx_msg INT OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMouseMove(UINT nFlags, CPoint poINT);
afx_msg void OnLButtonDown(UINT nFlags, CPoint poINT);
afx_msg void OnLButtonUp(UINT nFlags, CPoint poINT);
afx_msg void OnRButtonDown(UINT nFlags, CPoint poINT);
afx_msg void OnRButtonUp(UINT nFlags, CPoint poINT);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
INT m_nHalfShiftPixels;
INT m_nPlotShiftPixels;
INT m_nPlotHeight;
INT m_nPlotWidth; //
CRect m_rectClient;
CRect m_rectPlot;
CBrush m_brushBack;
protected:
// 内存绘制相关的
CDC m_dcMem;
CBitmap m_bmpMem;
CBitmap* m_pOldBmp;
};
/////////////////////////////////////////////////////////////////////////////
#endif

View File

@ -0,0 +1,243 @@
// HistWaveView.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ADHistFrm.h"
#include "ADHistWaveView.h"
#include "ADHistDigitView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADHistWaveView
IMPLEMENT_DYNCREATE(CADHistWaveView, CScrollView)
CADHistWaveView::CADHistWaveView()
{
m_ScreenVolume = (int)VOLT_RANGE; // 定义量程为10V
m_ChannelCount = 0;
}
CADHistWaveView::~CADHistWaveView()
{
}
BEGIN_MESSAGE_MAP(CADHistWaveView, CScrollView)
//{{AFX_MSG_MAP(CADHistWaveView)
ON_WM_SIZE()
ON_WM_DESTROY()
ON_WM_HSCROLL()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADHistWaveView drawing
void CADHistWaveView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: calculate the total size of this view
CADHistDoc* pDoc = (CADHistDoc*)GetDocument();
CADHistFrm* pHistFrm = (CADHistFrm*)GetParentFrame();
m_ChannelCount = pDoc->m_ChannelCount;
CSize sizeTotal;
sizeTotal.cx = 0;
sizeTotal.cy = 0;
SetScrollSizes(MM_TEXT, sizeTotal);
pDoc->m_hWndWave = m_hWnd;
CSliderCtrl* pSliderOffset = (CSliderCtrl*)(pHistFrm->m_wndSetupBar.GetDlgItem(IDC_SLIDER_Offset));
pSliderOffset->SetPos(0); // 屏幕显示在开始处
// 创建绘图窗体
CRect rect;
GetClientRect(rect);
m_ADHistScope.Create(WS_CHILD | WS_VISIBLE, rect, this);
m_ADHistScope.SetXUnits(_T("X"));
m_ADHistScope.SetYUnits(_T("Y"));
m_ADHistScope.ShowChannel(0, MAX_CHANNEL_COUNT-1);
for (int Channel=0; Channel<MAX_CHANNEL_COUNT; Channel++) // 初始化电压量程
{
// m_ADHistScope.SetRange(pDoc->m_Header.VoltBottomRange, pDoc->m_Header.VoltTopRange, Channel);
// m_ADHistScope.SetVisableRange(pDoc->m_Header.VoltBottomRange, pDoc->m_Header.VoltTopRange, Channel);
switch (pDoc->m_Header.ADPara.InputRange[Channel])
{
case ACTS1000_INPUT_N10000_P10000mV:
m_ADHistScope.SetRange(-10000.0, 10000.0, Channel);
m_ADHistScope.SetVisableRange(-10000.0, 10000.0, Channel);
break;
case ACTS1000_INPUT_N5000_P5000mV:
m_ADHistScope.SetRange(-5000.0, 5000.0, Channel);
m_ADHistScope.SetVisableRange(-5000.0, 5000.0, Channel);
break;
case ACTS1000_INPUT_N1000_P1000mV:
m_ADHistScope.SetRange(-1000.0, 1000.0, Channel);
m_ADHistScope.SetVisableRange(-1000.0, 1000.0, Channel);
break;
}
}
m_ADHistScope.ShowWindow(SW_SHOWNA);
m_ScrollBar.Create(SBS_HORZ | WS_CHILD | WS_VISIBLE, CRect(rect.left, rect.bottom+20, rect.right, rect.bottom), this, IDC_SCROLLBAR_ScreenCur);
m_ScrollBar.SetScrollRange(0, (8192/m_ChannelCount)); // 设置滑动条范围(字)
}
void CADHistWaveView::OnDraw(CDC *pDC)
{
}
void CADHistWaveView::OnDrawPolyLine()
{
CADHistDoc* pDoc = (CADHistDoc*)GetDocument();
if (NULL != pDoc)
{
LONGLONG iDataLenth = 0;
PWORD pBuff = NULL;
for (int iChannel=0; iChannel<pDoc->m_ChannelCount; iChannel++)
{
pBuff = pDoc->GetBuffer(iChannel, pDoc->m_Offset, &iDataLenth);
if (pBuff != NULL)
{
m_ADHistScope.AppendPoly(pBuff, iChannel, iDataLenth, pDoc->m_Offset, FALSE);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CADHistWaveView diagnostics
#ifdef _DEBUG
void CADHistWaveView::AssertValid() const
{
CScrollView::AssertValid();
}
void CADHistWaveView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CADHistWaveView message handlers
void CADHistWaveView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
if (m_ADHistScope.m_hWnd != NULL)
{
m_ADHistScope.SetWindowPos(NULL, 0, 0, cx, cy-20, SWP_DRAWFRAME);
m_ScrollBar.SetWindowPos(NULL, 0, cy-20, cx, 20, SWP_NOOWNERZORDER);
this->OnDrawPolyLine();
}
}
void CADHistWaveView::OnDestroy()
{
CScrollView::OnDestroy();
}
void CADHistWaveView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CADHistDoc* pDoc = (CADHistDoc*)GetDocument();
CADHistFrm* pHistFrm = (CADHistFrm*)GetParentFrame();
int ChannelCount = pDoc->m_ChannelCount;
int Pos = m_ScrollBar.GetScrollPos(); // 取得滑动条位置(即文件偏移(字))
int nPageSize = 8192/m_ChannelCount/20;
switch(nSBCode)
{
case SB_LINERIGHT:
Pos += 1;
break;
case SB_LINELEFT:
Pos -= 1;
break;
case SB_PAGEDOWN:
Pos += nPageSize;
break;
case SB_PAGEUP:
Pos -= nPageSize;
break;
case SB_THUMBPOSITION:
Pos = nPos;
break;
case SB_THUMBTRACK:
Pos = nPos;
break;
default :
break;
}
if (Pos<0)
Pos = 0;
m_ScrollBar.SetScrollPos(Pos);
pDoc->m_ScreenOffset = Pos - Pos%ChannelCount; // 文档中的屏幕偏移等于滑尺的屏幕位置偏移
LONGLONG i64Pos = Pos;
i64Pos+= pDoc->m_Offset;
LONGLONG ulOld = pDoc->m_Offset;
pDoc->m_Offset = i64Pos;
CString str;
CEdit* pEditOffset = (CEdit*)(pHistFrm->m_wndSetupBar.GetDlgItem(IDC_EDIT_Offset));
CEdit* pEditScreenPos = (CEdit*)(pHistFrm->m_wndSetupBar.GetDlgItem(IDC_EDIT_ScreenPos));
str.Format(_T("%I64d"), i64Pos);
pEditOffset->SetWindowText(str); // 显示文件偏移
str.Format(_T("%I64d"), i64Pos);
pEditScreenPos->SetWindowText(str);
RedrawWindow(); // 重绘数据视图
LONGLONG iDataLenth = 0;
PWORD pBuff = NULL;
for (int iChannel=0; iChannel<pDoc->m_ChannelCount; iChannel++)
{
pBuff = pDoc->GetBuffer(iChannel, pDoc->m_Offset, &iDataLenth);
if (iDataLenth == -1)
{
iDataLenth= 0;
}
if (pBuff != NULL)
{
m_ADHistScope.AppendPoly(pBuff, iChannel, iDataLenth, pDoc->m_Offset, FALSE);
}
}
pDoc->m_Offset = ulOld;
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
BOOL CADHistWaveView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
}

View File

@ -0,0 +1,61 @@
#if !defined(AFX_HistWaveView_H__D442B984_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)
#define AFX_HistWaveView_H__D442B984_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// HistWaveView.h : header file
//
#include "ADHistScope.h"
/////////////////////////////////////////////////////////////////////////////
// CADHistWaveView view
class CADHistWaveView : public CScrollView
{
protected:
CADHistWaveView(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CADHistWaveView)
// Attributes
public:
CScrollBar m_ScrollBar;
int m_ScreenVolume; // ÉèÖÃÆÁÄ»ÏÔʾµÄÁ¿³Ì
CADHistScope m_ADHistScope;
int m_ChannelCount;
// Operations
public:
// int m_nWidth;
void OnDrawPolyLine();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADHistWaveView)
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CADHistWaveView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
//{{AFX_MSG(CADHistWaveView)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_HistWaveView_H__D442B984_8439_11D1_B87A_A3845A0CA5FE__INCLUDED_)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,149 @@
// OScopeCtrl.h : header file
//
#ifndef __OScopeCtrl_H__
#define __OScopeCtrl_H__
/////////////////////////////////////////////////////////////////////////////
// CADScopeCtrl window
class CADScopeCtrl : public CWnd
{
// Construction
public:
CADScopeCtrl();
// Attributes
public:
double AppendPoint(double dNewPoint);
void SetRange(double dLower, double dUpper, int nDecimalPlaces=1);
void SetXUnits(CString string);
void SetYUnits(CString string);
void SetGridColor(COLORREF color);
void SetPlotColor(COLORREF color);
void SetBackgroundColor(COLORREF color);
void InvalidateCtrl();
void Reset();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADScopeCtrl)
public:
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=NULL);
protected:
virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
// Implementation
public:
void DrawAllChannelText(CDC *pDC);
void DrawSingleCHText(CDC *pDC, int nChannelNum);
CPen m_polyPen[MAX_CHANNEL_COUNT];
CPen m_ChannelPen[MAX_CHANNEL_COUNT];
int FindTrigger(int nChannel, int nValue);
void SetStatusBar();
void AppendPoly(int BufferID, int Offset, ULONG nDrawLen);
int m_nPtCount;
int tempCount;
int m_nChannelCount;
int m_nChannelNum;
float PerY;
int m_BufferID;
int m_Offset;
float PixelOfLsb;
// int m_nCenter[32];
POINT pointxy[32][8192]; // 所有通道显示的点数据
CPoint pointTemp[8192]; // 用来存放单通道显示的点数据
SHORT *m_pBuffer;
COLORREF m_clPen[MAX_CHANNEL_COUNT];
int HeightMid[64] ;
int MouseOffset; // 鼠标在绘图区的偏移位置
int m_OldMoveX1; // 各条能移动的线的位置
int m_OldMoveX2;
int m_OldMoveY;
int m_CurMoveX1;
int m_CurMoveX2;
int m_CurMoveY;
COLORREF m_crLineAColor; // A线的颜色
COLORREF m_crLineBColor; // B线的颜色
COLORREF m_crLineVColor; // C线的颜色
CPen m_PenLineA; // A线的画笔
CPen m_PenLineB; // B线的画笔
CPen m_PenLineV; // V线的画笔
int m_CurVoltageY;
int m_OldVoltageY;
float m_VolOffset;
int m_nLineIndex;
BOOL m_bAllChannel;
int m_nShiftPixels;
int m_nYDecimals;
CString m_strXUnitsString;
CString m_strYUnitsString;
COLORREF m_crBackColor;
COLORREF m_crGridColor;
COLORREF m_crPlotColor;
double m_dCurrentPosition;
double m_dPreviousPosition;
LONG m_iDataLength;
virtual ~CADScopeCtrl();
private:
UINT m_nLoop;
void DrawBkGnd(); // 画网格线
void DrawPoint();
void DrawPoly(ULONG nDrawLen,ULONG nDrawIdx);
void ProcessData(ULONG nDrawLen,ULONG nDrawIdx);
protected:
//{{AFX_MSG(CADScopeCtrl)
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
int m_nHalfShiftPixels;
int m_nPlotShiftPixels;
int m_nClientHeight;
int m_nClientWidth;
int m_nPlotHeight;
int m_nPlotWidth; //
BOOL m_bDrawPoly;
BOOL m_bInitialed;
double m_dLowerLimit[MAX_CHANNEL_COUNT]; // lower bounds
double m_dUpperLimit[MAX_CHANNEL_COUNT]; // upper bounds
double m_dRange;
double m_dVerticalFactor;
CRect m_rectClient;
CRect m_rectPlot;
CPen m_penPlot;
CBrush m_brushBack;
CDC m_dcGrid;
CDC m_dcPlot;
CDC m_dcMove;
CBitmap *m_pbitmapOldGrid;
CBitmap *m_pbitmapOldPlot;
CBitmap m_bitmapGrid;
CBitmap m_bitmapPlot;
};
/////////////////////////////////////////////////////////////////////////////
#endif

View File

@ -0,0 +1,193 @@
// ADStatusView.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ADFrm.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#include "ADWaveView.h"
#include "ADStatusView.h"
#include "ParaCfgView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADStatusView
IMPLEMENT_DYNCREATE(CADStatusView, CFormView)
CADStatusView::CADStatusView()
: CFormView(CADStatusView::IDD)
{
//{{AFX_DATA_INIT(CADStatusView)
//}}AFX_DATA_INIT
// bFirstChangeTrigge=TRUE; // 当某些类对象没有准备就绪时不能操作CEdit框
}
CADStatusView::~CADStatusView()
{
}
void CADStatusView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CADStatusView)
DDX_Control(pDX, IDC_Combo_ScreenVolume, m_nScreenVolume);
DDX_Control(pDX, IDC_Combo_MoveVolt, m_nMoveVolt);
DDX_Control(pDX, IDC_EDIT_AnalyzeCount, m_nAnalyzeCount);
DDX_Control(pDX, IDC_EDIT_OverRange, m_nOverRange);
DDX_Control(pDX, IDC_EDIT_OverRatio, m_nOverRatio);
DDX_Control(pDX, IDC_EDIT_TriggerVolt, m_nTringgerVolt);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CADStatusView, CFormView)
//{{AFX_MSG_MAP(CADStatusView)
ON_EN_CHANGE(IDC_EDIT_TriggerVolt, OnChangeEDITTriggerVolt)
ON_BN_CLICKED(IDM_GraphicShow, OnGraphicShow)
ON_BN_CLICKED(IDM_DigitalShow, OnDigitalShow)
ON_BN_CLICKED(IDM_DataSave, OnDataSave)
ON_CBN_SELCHANGE(IDC_Combo_ScreenVolume, OnSelchangeComboScreenVolume)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADStatusView diagnostics
#ifdef _DEBUG
void CADStatusView::AssertValid() const
{
CFormView::AssertValid();
}
void CADStatusView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CADStatusView message handlers
void CADStatusView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
CString str;
// TODO: Add your specialized code here and/or call the base class
str.Format(_T("%d"), gl_ScreenVolume);
str.Format(_T("%d"), m_TriggerVolt);
m_nTringgerVolt.SetWindowText(str);
m_nScreenVolume.SetCurSel(12);
// gl_ScreenVolume = 10000;
m_nMoveVolt.SetWindowText(_T("0"));
m_nAnalyzeCount.SetWindowText(_T("0"));
m_nOverRange.SetWindowText(_T("0"));//要返回的
m_nOverRatio.SetWindowText(_T("0"));//要返回的
if(gl_bTileWave)
{
CButton* pButtonTile = (CButton*)GetDlgItem(IDM_TileWave);
pButtonTile->SetCheck(1);
}
else
{
CButton* pButtonPose = (CButton*)GetDlgItem(IDM_SuperPoseWave);
pButtonPose->SetCheck(1);
}
SetDlgCheck();
}
void CADStatusView::OnChangeEDITTriggerVolt() //改变触发电压的值
{
// TODO: Add your control notification handler code here
CString str;
m_nTringgerVolt.GetWindowText(str);
m_TriggerVolt=_tcstol(str,NULL,10);
// 当重新设置触发电平时,重置超限数和统计总数
m_OverLimitCount=0;
m_AnalyzeAllCount=0;
}
void CADStatusView::SetDlgCheck()
{
CButton* pCheck = (CButton*)GetDlgItem(IDM_DigitalShow);
pCheck->SetCheck(nProcessMode == DATA_MODE ? BST_CHECKED:BST_UNCHECKED);
pCheck->EnableWindow(m_bFirstCreateDeviceFile);
pCheck=(CButton*)GetDlgItem(IDM_GraphicShow);
pCheck->SetCheck(nProcessMode == WAVE_MODE ? BST_CHECKED:BST_UNCHECKED);
pCheck->EnableWindow(m_bFirstCreateDeviceFile);
pCheck=(CButton*)GetDlgItem(IDM_DataSave);
pCheck->SetCheck(nProcessMode == SAVE_MODE ? BST_CHECKED:BST_UNCHECKED);
pCheck->EnableWindow(!m_bFirstCreateDeviceFile);
}
void CADStatusView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
// if(lHint==1||lHint==2) return;
CView::OnUpdate(pSender, lHint, pHint);
}
void CADStatusView::OnDigitalShow()
{//数字方式显示
// TODO: Add your control notification handler code here
nProcessMode = DATA_MODE;
SetDlgCheck();
}
void CADStatusView::OnGraphicShow()
{//波形显示方式
// TODO: Add your control notification handler code here
nProcessMode = WAVE_MODE;
SetDlgCheck();
}
void CADStatusView::OnDataSave()
{//存盘方式显示
// TODO: Add your control notification handler code here
nProcessMode = SAVE_MODE;
SetDlgCheck();
}
void CADStatusView::OnSelchangeComboScreenVolume()
{
// TODO: Add your control notification handler code here
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
CString str;
m_nScreenVolume.GetWindowText(str);
gl_ScreenVolume=_tcstol(str,NULL,10);
CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave));
if (!gl_bDeviceADRun)
{
pWaveView->OnDrawPolyLine(gl_nDocDrawLen,gl_nDocDrawIdx);
}
if(pWaveView->m_ADScopeCtrl.m_bAllChannel == FALSE) //单通道显示时才能测电压
{
pWaveView->m_ADScopeCtrl.SetRange(-gl_ScreenVolume/2.0, gl_ScreenVolume/2.0, pWaveView->m_ADScopeCtrl.m_nChannelNum);
}
}

View File

@ -0,0 +1,77 @@
#if !defined(AFX_ADStatusView_H__E4B4B7A2_D13C_11D6_B1D2_AB386BFF0020__INCLUDED_)
#define AFX_ADStatusView_H__E4B4B7A2_D13C_11D6_B1D2_AB386BFF0020__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ADStatusView.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CADStatusView form view
#ifndef __AFXEXT_H__
#include <afxext.h>
#endif
class CADStatusView : public CFormView
{
protected:
CADStatusView(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CADStatusView)
// Form Data
public:
//{{AFX_DATA(CADStatusView)
enum { IDD = CG_IDD_Capability };
CComboBox m_nScreenVolume;
CComboBox m_nMoveVolt;
CEdit m_nAnalyzeCount;
CEdit m_nOverRange;
CEdit m_nOverRatio;
CEdit m_nTringgerVolt;
//}}AFX_DATA
// Attributes
public:
void SetDlgCheck();
BOOL bFirstChangeTrigge; // Ê״θı䴥·¢µçƽ
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADStatusView)
public:
virtual void OnInitialUpdate();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CADStatusView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
//{{AFX_MSG(CADStatusView)
afx_msg void OnChangeEDITTriggerVolt();
afx_msg void OnGraphicShow();
afx_msg void OnDigitalShow();
afx_msg void OnDataSave();
afx_msg void OnSelchangeComboScreenVolume();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ADStatusView_H__E4B4B7A2_D13C_11D6_B1D2_AB386BFF0020__INCLUDED_)

View File

@ -0,0 +1,376 @@
#include "stdAfx.h"
#include "Sys.h"
#include "ADThread.h"
#include "ADDigitView.h"
#include "math.h"
CWinThread* m_ReadThread; // 子线程句柄
BOOL gl_bTerminateThr = TRUE; // 线程是否删除
BOOL gl_bSmlThenSize = FALSE;
//////////////////////////////////////////////////////////////////////
//-------------------------------------------------------------------------------------------------------------------------------------
UINT ReadDataThread(PVOID hWnd);
//########################################################################
// 启动数据采集线程
BOOL MyStartDeviceAD(HANDLE hDevice)
{
if(!gl_bTerminateThr) // 上一次线程还没有删除
{
AfxMessageBox(_T("上一次的线程还没有中止"));
return FALSE;
}
m_ReadThread = AfxBeginThread(ReadDataThread,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_ReadThread->m_bAutoDelete = true; // 自动删除线程
gl_bDeviceADRun = TRUE; // 告之采集线程可以工作了
m_ReadThread->ResumeThread(); // 启动采集线程ReadDataThread_NotEmpty
return TRUE;
}
BOOL bWriteCnt = 0;
//###############################################################
ACTS1000_PARA_AD gl_OldADPara = ADPara;
BOOL IsChangePara()
{
BOOL bRet;
if(memcmp(&gl_OldADPara, &ADPara, sizeof(ADPara))==0)
bRet = FALSE;
else
bRet = TRUE;
gl_OldADPara = ADPara;
return bRet;
}
BOOL gl_bStoped = FALSE;
// 读取数据 线程函数
UINT ReadDataThread(PVOID hWnd)
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
ULONG ReadOffsetWords = 0;
LONG RetReadSizeWords;
int nADChannel = 0;
DWORD dTmp=0;
HANDLE hDevice = pApp->m_hDevice;
ULONG SampleCnt = 1; // 采集次数
ULONG SampleIndex;
ULONG RemainSizeWords = 0;
ULONG nRetSizeWords;
ULONG nAvailSampsPoints;
ULONG nIndex = 0;
BOOL bSuccess = FALSE;
ULONGLONG nReadSize;
ULONG nRead;
ULONG lSaveTime;
ULONG ulReadCount = MAX_RAM_SIZE;
if(gl_bAutoCollect) // 是手动采集的话,显示完了就停止采集了
{
SampleCnt = 0xFFFFFFFF;
}
gl_bStoped = FALSE;
// for(int i=0; i<MAX_SEGMENT; i++)
// {
// memset(ADBuffer[i], 0, MAX_RAM_SIZE*sizeof(USHORT));
// }
LONG lBufferID = 0;
ULONG nConstReadCnt = 0;// 连续方式下用于获取状态
ACTS1000_STATUS_AD ADStatus;
if(!ACTS1000_InitDeviceAD(hDevice, &ADPara)) // 初始化设备
{
AfxMessageBox(_T("硬件初始化错误,详细信息请查看log文件"), MB_ICONERROR);
goto ExitReadThread;
}
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_MIDL)
{
gl_ReadSizeWords = (ADPara.M_Length + ADPara.N_Length)*gl_nChannelCount;
}
else
{
gl_ReadSizeWords = ADPara.N_Length;
gl_ReadSizeWords = gl_ReadSizeWords*gl_nChannelCount;
}
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_POST || ADPara.TriggerMode == ACTS1000_TRIGMODE_DELAY)
{
if (ADPara.TrigCount==0)
{
gl_ReadSizeWords = 0xFFFFFFFFFFFFFFFF;
}
else
{
gl_ReadSizeWords = gl_ReadSizeWords*ADPara.TrigCount;
}
}
lSaveTime = GetTickCount();
gl_bTerminateThr = FALSE ;
//ULONG nTTT = 0;
if (ADPara.SampleMode == ACTS1000_SAMPMODE_FINITE)
{
for(SampleIndex = 0; SampleIndex<SampleCnt; SampleIndex++)// 循环采集AD数据
{
if(!gl_bDeviceADRun)
goto ExitReadThread;
if (!ACTS1000_StartDeviceAD(hDevice))// 初始化后,启动设备工作
{
MsgBox(_T("启动失败!"));
goto ExitReadThread;
}
//ACTS1000_SetDeviceTrigAD(hDevice);
if (ADPara.bSaveFile)
{
while(TRUE)
{
if(!ACTS1000_GetDevStatusAD(hDevice, &gl_ADStatus))
{
MsgBox(_T("GetDevStatusAD Error"));
goto ExitReadThread;
}
if(gl_ADStatus.bComplete) // 自动存盘单次有限点任务是否完成
{
goto FinComplete;
}
else
{
if(!gl_bDeviceADRun) goto ExitReadThread;
Sleep(1);
}
if (GetTickCount()-lSaveTime>300)
{
if (gl_ADStatus.lSavePoints>FileLenghtWords)
{
FileLenghtWords=gl_ADStatus.lSavePoints;
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
lSaveTime = GetTickCount();
}
}
}
}
else // if (ADPara.bSaveFile)
{
nReadSize = gl_ReadSizeWords;
while (nReadSize>0)
{
if (nReadSize>=ulReadCount)
{
nRead = ulReadCount;
gl_bSmlThenSize = FALSE;
}
else
{
gl_bSmlThenSize = TRUE;
nRead = nReadSize;
}
NextRead:
if(!gl_bDeviceADRun)
goto ExitReadThread;
RetReadSizeWords = ACTS1000_ReadDeviceAD(hDevice, ADBuffer[lBufferID], nRead, &nRetSizeWords, &nAvailSampsPoints,1.0);
if(RetReadSizeWords == 0)
{
AfxMessageBox(_T("读数据出错!"));
goto ExitReadThread;
}
if (nRetSizeWords==0)
{
int a=0;
}
if (nRetSizeWords<=0)
{
goto NextRead;
}
// if (nRetSizeWords != 262144)
// {
// int a= 0;
// }
nReadSize -= nRetSizeWords;
bSuccess = TRUE;
if (nProcessMode == SAVE_MODE)
{
WriteFile(g_ArrFileOut,ADBuffer[lBufferID], nRetSizeWords*sizeof(WORD),&dTmp,NULL);
FileLenghtWords += nRead; // 存盘文件大小增加
}
if (!m_bDrawComp)
{
glBufferID = lBufferID;
gl_Section.Lock();
//ADBuffer[lBufferID][10]= nTTT++;
gl_nDrawLen = nRetSizeWords/gl_nChannelCount;
gl_nDrawIdx = lBufferID;
gl_Section.Unlock();
if (nProcessMode != SAVE_MODE)
{
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
}
}
lBufferID++;
if (lBufferID >= MAX_SEGMENT)
lBufferID = 0;
if (nProcessMode == SAVE_MODE)
{
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
}
}
}
FinComplete:
ACTS1000_StopDeviceAD(hDevice); // 初始化后,启动设备工作
}// 线程循环取样
}
else
{
lBufferID = 0;
if (!ACTS1000_StartDeviceAD(hDevice))// 初始化后,启动设备工作
{
MsgBox(_T("启动失败!"));
goto ExitReadThread;
}
//ACTS1000_SetDeviceTrigAD(hDevice);
if (ADPara.bSaveFile)
{
while(TRUE)
{
if(!ACTS1000_GetDevStatusAD(hDevice, &gl_ADStatus))
{
MsgBox(_T("GetDevStatusAD Error"));
goto ExitReadThread;
}
if(!gl_bDeviceADRun)
goto ExitReadThread;
Sleep(1);
if (GetTickCount()-lSaveTime>300)
{
if (gl_ADStatus.lSavePoints>FileLenghtWords)
{
FileLenghtWords=gl_ADStatus.lSavePoints;
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
lSaveTime = GetTickCount();
}
}
}
}
else
{
nRead = ulReadCount;
while(gl_bDeviceADRun)
{
RetReadSizeWords = ACTS1000_ReadDeviceAD(hDevice, ADBuffer[lBufferID], nRead, &nRetSizeWords, &nAvailSampsPoints,1.0);
if(RetReadSizeWords == 0)
{
AfxMessageBox(_T("读数据出错!"));
goto ExitReadThread;
}
if (nRetSizeWords<=0)
{
Sleep(1);
continue;
}
bSuccess = TRUE;
if (nProcessMode == SAVE_MODE)
{
WriteFile(g_ArrFileOut,ADBuffer[lBufferID], nRetSizeWords*sizeof(WORD),&dTmp,NULL);
FileLenghtWords += nRetSizeWords; // 存盘文件大小增加
}
if (!m_bDrawComp)
{
glBufferID = lBufferID;
gl_Section.Lock();
gl_nDrawLen = nRetSizeWords/gl_nChannelCount;
gl_nDrawIdx = lBufferID;
gl_Section.Unlock();
if (nProcessMode != SAVE_MODE)
{
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
}
}
lBufferID++;
if (lBufferID >= MAX_SEGMENT)
lBufferID = 0;
if (nProcessMode == SAVE_MODE)
{
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
}
nConstReadCnt++;
if (nConstReadCnt%4000==0)
{
if (ACTS1000_GetDevStatusAD(hDevice,&ADStatus))
{
if (ADStatus.bAheadTrig)
{
AfxMessageBox(_T("硬件溢出,1:请降低采样率 2:提高程序效率 3:使用Simple\AD\Continue下的exe测试传输速度!"));
goto ExitReadThread;
}
}
}
}
}
}
ExitReadThread:
SetEvent(hExitEvent); // 发出设备成功退出消息,让关闭设备的线程得此消息
gl_bTerminateThr = TRUE;
gl_bCollected = TRUE; // 完成了一次采集
ACTS1000_StopDeviceAD(hDevice);
ACTS1000_ReleaseDeviceAD(hDevice);
if (!gl_bAutoCollect && bSuccess && gl_bStoped==FALSE)
{
//pApp->m_pADDoc->StopDeviceAD();
}
return TRUE;
}
BOOL MyStopDeviceAD(HANDLE hDevice)
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
gl_bDeviceADRun = FALSE;
if (gl_bAutoTrig)
{
ACTS1000_SetDeviceTrigAD(pApp->m_hDevice);
}
if (gl_bAutoCollect == FALSE)
{
gl_bStoped = TRUE;
WaitForSingleObject(m_ReadThread->m_hThread, 1000);
}
else
{
WaitForSingleObject(m_ReadThread->m_hThread, INFINITE);
}
bCreateDevice = FALSE;
return TRUE;
}

View File

@ -0,0 +1,2 @@
BOOL MyStartDeviceAD(HANDLE hDevice);// 启动采集线程
BOOL MyStopDeviceAD(HANDLE hDevice); // 停止采集线程

View File

@ -0,0 +1,224 @@
// ADWaveView.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ADWaveView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////
#include "ADStatusView.h"
#include "ParaCfgView.h"
extern CADStatusView* pADStatusView;
extern CParaCfgView* pParaCfgView;
///////////////////////
static CPoint pointxy[32][8192];
int WavePointX; //记录鼠标X位置
BOOL bMeasureFreq=FALSE; // 是否计算频率
int StartX, EndX; // 测频率
COLORREF pColor[]=
{
RGB(176,15,172),
RGB(170,21,33),
RGB(22,158,169),
RGB(4,187,109),
RGB(176,15,172),
RGB(170,21,33),
RGB(22,158,169),
RGB(4,187,109),
RGB(176,15,172),
RGB(170,21,33),
RGB(22,158,169),
RGB(4,187,109),
RGB(176,15,172),
RGB(170,21,33),
RGB(22,158,169),
RGB(4,187,109),
};
IMPLEMENT_DYNCREATE(CADWaveView, CScrollView)
CADWaveView::CADWaveView()
{
m_Draw=FALSE;
Offset=0;
brush.CreateSolidBrush (RGB(255,255,255));
CurrentProgress=0; // 置采集进度条起值为0
m_ScaleH_Width = 40;
m_ScaleV_Width = 30;
m_oldPoint.x =m_oldPoint.y =-1;
}
CADWaveView::~CADWaveView()
{
}
BEGIN_MESSAGE_MAP(CADWaveView, CScrollView)
//{{AFX_MSG_MAP(CADWaveView)
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_KEYDOWN()
ON_WM_LBUTTONUP()
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
ON_WM_LBUTTONDBLCLK()
ON_MESSAGE(WM_SHOWWAVE, DrawPolyLine)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADWaveView drawing
BOOL bCreate = FALSE;
void CADWaveView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CADDoc* pDoc = (CADDoc*)GetDocument();
pDoc->m_hWndWave=m_hWnd; // 取得视图句柄以便在DOC中的线程使用
CSize sizeTotal;
// TODO: calculate the total size of this view
const SIZE conPSize={200,1};
const SIZE conLSize={20,1};
sizeTotal.cx = 0;
sizeTotal.cy = 0;
SetScrollSizes(MM_TEXT, sizeTotal);
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
for(int i=0;i<16;i++)
m_Pen[i].CreatePen(PS_SOLID,1,pColor[i]);
////////////////////////////////////////////////////////////////////////
//创建绘图窗体
CRect rect;
GetClientRect(rect);
m_ADScopeCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(10, 0, 400, 600), this);
m_ADScopeCtrl.SetXUnits(_T("X"));
m_ADScopeCtrl.SetYUnits(_T("Y"));
m_ADScopeCtrl.SetRange(-5, 5, 1);
}
void CADWaveView::OnDraw(CDC* pDC)
{
}
/////////////////////////////////////////////////////////////////////////////
// CADWaveView diagnostics
#ifdef _DEBUG
void CADWaveView::AssertValid() const
{
CScrollView::AssertValid();
}
void CADWaveView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CADDoc* CADWaveView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CADDoc)));
return (CADDoc*)m_pDocument;
}
#endif //_DEBUG
void CADWaveView::AnalyzeAccurate()//精度分析
{
int m_TemporyVolt;
CString StrAllCount;
CString StrOverCount;
CString StrOverRatio;
int m_TriggerLsb;
m_TriggerLsb=(int)(m_TriggerVolt*(gl_fLsbCount/VOLT_RANGE));
for(ULONG i=0;i<gl_ReadSizeWords;i++)
{
m_TemporyVolt=(int)((ADBuffer[CurrentIndex][i])-gl_MiddleLsb[i%MAX_CHANNEL_COUNT]);
if(m_TemporyVolt>m_TriggerLsb)
{
m_OverLimitCount=m_OverLimitCount+1;
}
if(m_TemporyVolt<(-m_TriggerLsb))
{
m_OverLimitCount=m_OverLimitCount+1;
}
}
m_AnalyzeAllCount=m_AnalyzeAllCount+gl_ReadSizeWords;
StrAllCount.Format(_T("%3.2e"),m_AnalyzeAllCount);
StrOverCount.Format(_T("%d"),m_OverLimitCount);
StrOverRatio.Format(_T("%4.4f"),m_OverLimitCount*100/m_AnalyzeAllCount);
StrOverRatio=StrOverRatio+"%";
pADStatusView->m_nAnalyzeCount.SetWindowText(StrAllCount);
pADStatusView->m_nOverRange.SetWindowText(StrOverCount);
pADStatusView->m_nOverRatio.SetWindowText(StrOverRatio);
}
void CADWaveView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
}
BOOL CADWaveView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBrush brush;
CRect rect;
GetClientRect(rect);
brush.CreateSolidBrush(RGB(0, 0, 0));
pDC->FillRect(rect, &brush);
return TRUE;
// return CScrollView::OnEraseBkgnd(pDC);
}
void CADWaveView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
GetClientRect(&ClientRect);
PerY=ClientRect.Height()*1.0/gl_nChannelCount;
middle1=(float)((((gl_ScreenVolume)/VOLT_RANGE)*gl_fLsbCount)/(PerY-5));//每像素对应的码值
CRect rect;
GetClientRect(rect);
if(::IsWindow(m_ADScopeCtrl))//bCreate)
{
m_ADScopeCtrl.SetWindowPos(NULL, 0, 0, cx, cy, SWP_DRAWFRAME);
this->OnDrawPolyLine(gl_nDocDrawLen,gl_nDocDrawIdx);
}
}
LRESULT CADWaveView::DrawPolyLine(WPARAM wParam, LPARAM lParam)
{
if(m_bProgress && gl_bDeviceADRun) // 刷新ADDigitView视图时更新进度条的状态
{
CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus.GetDlgItem(IDC_PROGRESS));
pProgress->SetPos(CurrentProgress);
CurrentProgress++;
if(CurrentProgress>50) CurrentProgress=0;
m_bProgress=FALSE;
}
OnDrawPolyLine((ULONG)wParam, (ULONG)lParam); // 开始显示图形
return 1;
}
void CADWaveView::OnDrawPolyLine(ULONG nDrawLen,ULONG nDrawIdx)
{
m_ADScopeCtrl.AppendPoly(nDrawIdx, glOffset, nDrawLen);
}

View File

@ -0,0 +1,87 @@
#if !defined(AFX_ADWAVEVIEW_H__D485DF11_85AB_11D1_B878_A68EB300DD63__INCLUDED_)
#define AFX_ADWaveVIEW_H__D485DF11_85AB_11D1_B878_A68EB300DD63__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ADWaveView.h : header file
//
#include "ADScopeCtrl.h"
/////////////////////////////////////////////////////////////////////////////
// CADWaveView view
class CADWaveView : public CScrollView
{
protected:
CADWaveView(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CADWaveView)
public:
int m_ScaleH_Width;
int m_ScaleV_Width;
// Attributes
public:
//void ADWave(CDC *pDC);
CADScopeCtrl m_ADScopeCtrl;
CPen *OldPen;
// CPen Pen;
CBrush brush;
long Offset; // 记录在8192点中当前偏移位置
CProgressCtrl* pProgress;
int CurrentProgress;
int CurrentX, CurrentY; // 用于控制当前光标
CPoint CurrentPoint;
CADDoc *GetDocument();
// Operations
public:
void OnDrawPolyLine(ULONG nDrawLen,ULONG nDrawIdx);
LRESULT DrawPolyLine(WPARAM wParam, LPARAM lParam);
int * m_pBuffer;
CPen m_Pen[16];
BOOL m_bCapture;
CPoint m_oldPoint;
BOOL m_Draw;
void AnalyzeAccurate();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CADWaveView)
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
protected:
CString m_ClassName;
CSize sizeTotal;//设置波形显示视图的大小
virtual ~CADWaveView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
//{{AFX_MSG(CADWaveView)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
friend class CParaCfgView;
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in ADDigitView.cpp
inline CADDoc* CADWaveView::GetDocument()
{ return (CADDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ADWAVEVIEW_H__D485DF11_85AB_11D1_B878_A68EB300DD63__INCLUDED_)

View File

@ -0,0 +1,707 @@
// AIChanList.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "AIChanList.h"
#include "ParaCfgView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAIChanList
CAIChanList::CAIChanList()
{
m_bEnableEx = TRUE;
m_nCurItem = 0;
m_nCurSubItem = 0;
}
CAIChanList::~CAIChanList()
{
}
BEGIN_MESSAGE_MAP(CAIChanList, CListCtrl)
//{{AFX_MSG_MAP(CAIChanList)
ON_WM_LBUTTONDOWN()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
ON_WM_CREATE()
ON_WM_MOUSEWHEEL()
ON_WM_SETFOCUS()
ON_WM_CONTEXTMENU()
ON_WM_DRAWITEM()
ON_COMMAND(IDM_SameParam, OnSameParam)
ON_MESSAGE(WM_SET_CTRL_FOCUS, OnSetCtrlFocus)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAIChanList message handlers
void CAIChanList::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
if(m_bEnableEx == FALSE) return;
*pResult = 0;
LPNMITEMACTIVATE lpItem = (LPNMITEMACTIVATE)pNMHDR;
m_nChanIdx = lpItem->iItem;
m_nType = lpItem->iSubItem;
if(m_nChanIdx != -1)
{
CRect rcCtrl;
GetSubItemRect(m_nChanIdx, m_nType, LVIR_LABEL, rcCtrl);
RestoreCtrl(rcCtrl);
}
}
extern CSysApp theApp;
BOOL CAIChanList::RestoreCtrl(CRect rcCtrl)
{
CParaCfgView* pParent = (CParaCfgView*)GetParent();
CADDoc* pDoc = (CADDoc*)pParent->GetDocument();
CString strMsg, strTmp, strCur;
int nCurSel = 0, bChannelEn = 0, nSampleRange = 0, nSampleGain = 0, nCouplingType = 0;
switch(m_nType)
{
// case LIST_COL_CHANNEL:
// rcCtrl.bottom = rcCtrl.bottom + 200;
// m_wndCombo.MoveWindow(rcCtrl);
// m_wndCombo.ResetContent();
// for(nChannel=0; nChannel<ACTS1000_AD_MAX_CHANNELS; nChannel++)
// {
// strMsg.Format("AI%d", nChannel);
// m_wndCombo.AddString(strMsg);
// }
//
// //??
// strCur.Format("AI%d", ADPara.bChannelArray[m_nChanIdx]);
// nCurSel = m_wndCombo.FindString(0, strCur);
// if(nCurSel == -1)
// nCurSel = 0;
//
// m_wndCombo.SetCurSel(nCurSel);
// m_wndCombo.EnableWindow(TRUE);
// m_wndCombo.ShowWindow(SW_SHOW);
// m_wndCombo.SendMessage(CB_SHOWDROPDOWN, TRUE, 0);
// m_wndCombo.SetFocus();
// break;
case LIST_COL_EN:
rcCtrl.bottom = rcCtrl.bottom + 200;
m_wndCombo.MoveWindow(rcCtrl);
m_wndCombo.ResetContent();
for(bChannelEn=0; bChannelEn<2; bChannelEn++)
{
m_wndCombo.AddString(g_strChannelEn[bChannelEn]);
}
nCurSel = ADPara.bChannelArray[m_nChanIdx];
m_wndCombo.SetCurSel(nCurSel);
m_wndCombo.EnableWindow(TRUE);
m_wndCombo.ShowWindow(SW_SHOW);
m_wndCombo.SendMessage(CB_SHOWDROPDOWN, TRUE, 0);
m_wndCombo.SetFocus();
break;
case LIST_COL_SAMPRANGE:
rcCtrl.bottom = rcCtrl.bottom + 200;
m_wndCombo.MoveWindow(rcCtrl);
m_wndCombo.ResetContent();
nCurSel = 0;
for(nSampleRange=0; nSampleRange<m_nSampRangeCount; nSampleRange++)
{
m_wndCombo.AddString(g_strAIRange[m_nSampRangeVal[nSampleRange]]);
if (ADPara.InputRange[m_nChanIdx] == m_nSampRangeVal[nSampleRange])
{
nCurSel = nSampleRange;
}
}
//nCurSel = ADPara.InputRange[m_nChanIdx];
m_wndCombo.SetCurSel(nCurSel);
m_wndCombo.EnableWindow(TRUE);
m_wndCombo.ShowWindow(SW_SHOW);
m_wndCombo.SendMessage(CB_SHOWDROPDOWN, TRUE, 0);
m_wndCombo.SetFocus();
break;
case LIST_COL_REFGND:
rcCtrl.bottom = rcCtrl.bottom + 200;
m_wndCombo.MoveWindow(rcCtrl);
m_wndCombo.ResetContent();
for(nCouplingType=0; nCouplingType<2; nCouplingType++)
{
m_wndCombo.AddString(g_strRefGround[nCouplingType]);
}
nCurSel = ADPara.CouplingType[m_nChanIdx];
m_wndCombo.SetCurSel(nCurSel);
m_wndCombo.EnableWindow(TRUE);
m_wndCombo.ShowWindow(SW_SHOW);
m_wndCombo.SendMessage(CB_SHOWDROPDOWN, TRUE, 0);
m_wndCombo.SetFocus();
break;
case LIST_COL_IMPED:
rcCtrl.bottom = rcCtrl.bottom + 200;
m_wndCombo.MoveWindow(rcCtrl);
m_wndCombo.ResetContent();
if (theApp.m_nRevisionID == PCIE8502D_RID)
{
for(nCouplingType=0; nCouplingType<1; nCouplingType++)
{
m_wndCombo.AddString(g_strInputImped[nCouplingType]);
}
}
else
{
for(nCouplingType=0; nCouplingType<2; nCouplingType++)
{
m_wndCombo.AddString(g_strInputImped[nCouplingType]);
}
}
nCurSel = ADPara.InputImped[m_nChanIdx];
m_wndCombo.SetCurSel(nCurSel);
m_wndCombo.EnableWindow(TRUE);
m_wndCombo.ShowWindow(SW_SHOW);
m_wndCombo.SendMessage(CB_SHOWDROPDOWN, TRUE, 0);
m_wndCombo.SetFocus();
break;
}
return TRUE;
}
// 当Edit或ComboBox失去焦点时就会调用此函数以取得改变后的值
LRESULT CAIChanList::OnSetCtrlFocus(WPARAM wParam, LPARAM lParam)
{
CParaCfgView* pParent = (CParaCfgView*)GetParent();
CString strMsg;
int nCurSel = 0;
int nChannel = 0;
ULONG nSampleRange = 0;
ULONG nSampChanCount = 0;
switch(m_nType)
{
case LIST_COL_CHANNEL:
nCurSel = m_wndCombo.GetCurSel();
m_wndCombo.GetLBText(nCurSel, strMsg);
ADPara.bChannelArray[m_nChanIdx] = nCurSel;
SetItemText(m_nChanIdx, m_nType, strMsg);
break;
case LIST_COL_EN:
nCurSel = m_wndCombo.GetCurSel();
m_wndCombo.GetLBText(nCurSel, strMsg);
ADPara.bChannelArray[m_nChanIdx] = nCurSel;
if (gl_ADMainInfo.nChannelCount>2)
{
switch (m_nChanIdx)
{
case 0:
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 0;
ADPara.bChannelArray[2] = 0;
ADPara.bChannelArray[3] = 0;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
break;
case 1:
if (nCurSel == 0)
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 0;
ADPara.bChannelArray[2] = 0;
ADPara.bChannelArray[3] = 0;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
else
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 0;
ADPara.bChannelArray[3] = 0;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
break;
case 2:
if (nCurSel == 0)
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 0;
ADPara.bChannelArray[3] = 0;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
else
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 1;
ADPara.bChannelArray[3] = 1;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
break;
case 3:
if (nCurSel == 0)
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 0;
ADPara.bChannelArray[3] = 0;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
else
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 1;
ADPara.bChannelArray[3] = 1;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
break;
case 4:
case 5:
case 6:
case 7:
if (nCurSel == 0)
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 1;
ADPara.bChannelArray[3] = 1;
ADPara.bChannelArray[4] = 0;
ADPara.bChannelArray[5] = 0;
ADPara.bChannelArray[6] = 0;
ADPara.bChannelArray[7] = 0;
}
else
{
ADPara.bChannelArray[0] = 1;
ADPara.bChannelArray[1] = 1;
ADPara.bChannelArray[2] = 1;
ADPara.bChannelArray[3] = 1;
ADPara.bChannelArray[4] = 1;
ADPara.bChannelArray[5] = 1;
ADPara.bChannelArray[6] = 1;
ADPara.bChannelArray[7] = 1;
}
break;
}
}
//SetItemText(m_nChanIdx, m_nType, strMsg);
//pParent->SetCurveRange(m_nChanIdx, nCurSel);
for(nChannel=0; nChannel<gl_ADMainInfo.nChannelCount; nChannel++)
{
SetItemText(nChannel, m_nType, g_strChannelEn[ADPara.bChannelArray[nChannel]]);
if(ADPara.bChannelArray[nChannel])
{
//g_lChCfg[nSampChanCount] = nChannel;
gl_CHIdx[nChannel] = nSampChanCount;
nSampChanCount++;
}
}
if(nSampChanCount == 0)
{
AfxMessageBox(L"采样通道不能全部禁止,请重新设定");
m_wndCombo.GetLBText(1, strMsg);
SetItemText(m_nChanIdx, m_nType, strMsg);
ADPara.bChannelArray[m_nChanIdx] = 1;
}
else
{
//??? g_nSampChanCount = nSampChanCount;
// ADPara.nSampChanCount = nSampChanCount;
// pParent->OnSelchangeCOMBOnSampChanCount();
gl_nChannelCount = nSampChanCount;
}
pParent->EnableVootRange();
break;
case LIST_COL_SAMPRANGE:
nCurSel = m_wndCombo.GetCurSel();
m_wndCombo.GetLBText(nCurSel, strMsg);
ADPara.InputRange[m_nChanIdx] = m_nSampRangeVal[nCurSel];
SetItemText(m_nChanIdx, m_nType, strMsg);
//???pParent->SetCurveRange(m_nChanIdx, nCurSel);
pParent->EnableVootRange();
break;
case LIST_COL_REFGND:
nCurSel = m_wndCombo.GetCurSel();
m_wndCombo.GetLBText(nCurSel, strMsg);
ADPara.CouplingType[m_nChanIdx] = nCurSel;
SetItemText(m_nChanIdx, m_nType, strMsg);
break;
case LIST_COL_IMPED:
nCurSel = m_wndCombo.GetCurSel();
m_wndCombo.GetLBText(nCurSel, strMsg);
ADPara.InputImped[m_nChanIdx] = nCurSel;
SetItemText(m_nChanIdx, m_nType, strMsg);
break;
}
return TRUE;
}
void CAIChanList::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_bEnableEx == FALSE) return;
// TODO: Add your message handler code here and/or call default
SetFocus();
CListCtrl::OnLButtonDown(nFlags, point);
}
BOOL CAIChanList::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
m_wndCombo.ShowWindow(SW_HIDE);
m_wndCombo.EnableWindow(FALSE);
m_wndEdit.ShowWindow(SW_HIDE);
m_wndEdit.EnableWindow(FALSE);
return CListCtrl::OnMouseWheel(nFlags, zDelta, pt);
}
void CAIChanList::PreSubclassWindow()
{
// TODO: Add your specialized creation code here
CListCtrl::PreSubclassWindow();
// 必须在这里创建
DWORD dwStyle;
CRect Rect(0, 0, 10, 10);
dwStyle = WS_BORDER | WS_CHILD | ES_LEFT | ES_AUTOHSCROLL;
if( !m_wndEdit.Create(dwStyle, Rect, this, 0 ) )
MessageBox(L"m_wndEdit.Create Error");
dwStyle = WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL;
if( !m_wndCombo.Create(dwStyle, Rect, this, 0 ) )
MessageBox(L"m_wndCombo.Create Error");
}
void CAIChanList::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
m_wndCombo.ShowWindow(SW_HIDE);
m_wndCombo.EnableWindow(FALSE);
m_wndEdit.ShowWindow(SW_HIDE);
m_wndEdit.EnableWindow(FALSE);
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CAIChanList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
m_wndCombo.ShowWindow(SW_HIDE);
m_wndCombo.EnableWindow(FALSE);
m_wndEdit.ShowWindow(SW_HIDE);
m_wndEdit.EnableWindow(FALSE);
CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}
BOOL CAIChanList::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHEADER* pNMHeader = (NMHEADER*)lParam;
if(pNMHeader->hdr.code == -12) // 如果鼠标左键在Header上按下时
{
m_wndCombo.ShowWindow(SW_HIDE);
m_wndCombo.EnableWindow(FALSE);
m_wndEdit.ShowWindow(SW_HIDE);
m_wndEdit.EnableWindow(FALSE);
}
return CListCtrl::OnNotify(wParam, lParam, pResult);
}
void CAIChanList::SetSameParam(int nCurItem, int nSubItem)
{
CString strNote;
int nID = 0, nItem = 0;
CParaCfgView* pParent = (CParaCfgView*)GetParent();
int nChannel=0;
ULONG nSampChanCount = 0;
//ACTS1000_PARA_AD CHParam = ADPara.CHParam[nCurItem];
LONG bCHChannelArray = ADPara.bChannelArray[nCurItem];
LONG lCHInputRange = ADPara.InputRange[nCurItem];
LONG lCHCouplingType = ADPara.CouplingType[nCurItem];
LONG lCHInputImped = ADPara.InputImped[nCurItem];
switch(nSubItem)
{
// case LIST_COL_CHANNEL:
// strNote.Format("确定要将其他所有通道号设定成与%d号的一样吗", nCurItem);
// nID = AfxMessageBox(strNote, MB_YESNO);
// if(nID == IDNO)
// break;
//
// strNote.Format("AI%d", bCHChannelArray);
// for(nItem=0; nItem<GetItemCount(); nItem++)
// {
// ADPara.bChannelArray[nItem] = bCHChannelArray;
// SetItemText(nItem, nSubItem, strNote);
// }
// break;
case LIST_COL_EN:
strNote.Format(L"确定要将其他所有通道使能设定成与%d号的一样吗", nCurItem);
nID = AfxMessageBox(strNote, MB_YESNO);
if(nID == IDNO)
break;
strNote = GetItemText(nCurItem, nSubItem);
for(nItem=0; nItem<GetItemCount(); nItem++)
{
ADPara.bChannelArray[nItem] = bCHChannelArray;
SetItemText(nItem, nSubItem, strNote);
}
if(bCHChannelArray)
{
}
else
{
//AfxMessageBox(L"采样通道不能全部禁止,请重新设定");
for(nItem=0; nItem<GetItemCount(); nItem++)
{
ADPara.bChannelArray[nItem] = 0;
SetItemText(nItem, nSubItem, strNote);
}
ADPara.bChannelArray[0] = 1;
SetItemText(0, nSubItem, L"允许");
}
nSampChanCount = 0;
for( nChannel=0; nChannel<gl_ADMainInfo.nChannelCount; nChannel++)
{
if (ADPara.bChannelArray[nChannel]==1)
{
//g_lChCfg[nSampChanCount] = nChannel;
gl_CHIdx[nChannel] = nSampChanCount;
nSampChanCount++;
}
}
//??? g_nSampChanCount = nSampChanCount;
// ADPara.nSampChanCount = nSampChanCount;
// pParent->OnSelchangeCOMBOnSampChanCount();
gl_nChannelCount = nSampChanCount;
pParent->EnableVootRange();
break;
case LIST_COL_SAMPRANGE:
strNote.Format(L"确定要将其他所有采样范围设定成与%d号的一样吗", nCurItem);
nID = AfxMessageBox(strNote, MB_YESNO);
if(nID == IDNO)
break;
strNote = GetItemText(nCurItem, nSubItem);
for(nItem=0; nItem<GetItemCount(); nItem++)
{
ADPara.InputRange[nItem] = lCHInputRange;
SetItemText(nItem, nSubItem, strNote);
//???pParent->SetCurveRange(nItem, lCHInputRange);
}
pParent->EnableVootRange();
break;
case LIST_COL_REFGND:
strNote.Format(L"确定要将其他所有参考地设定成与%d号的一样吗", nCurItem);
nID = AfxMessageBox(strNote, MB_YESNO);
if(nID == IDNO)
break;
strNote = GetItemText(nCurItem, nSubItem);
for(nItem=0; nItem<GetItemCount(); nItem++)
{
ADPara.CouplingType[nItem] = lCHCouplingType;
SetItemText(nItem, nSubItem, strNote);
}
break;
case LIST_COL_IMPED:
strNote.Format(L"确定要将其他所有阻抗设定成与%d号的一样吗", nCurItem);
nID = AfxMessageBox(strNote, MB_YESNO);
if(nID == IDNO)
break;
strNote = GetItemText(nCurItem, nSubItem);
for(nItem=0; nItem<GetItemCount(); nItem++)
{
ADPara.InputImped[nItem] = lCHInputImped;
SetItemText(nItem, nSubItem, strNote);
}
break;
}
} // SetSameParam
void CAIChanList::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
if(m_bEnableEx == FALSE) return;
CString strTemp, strMsg;
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nItem = 0, nSubItem = 0;
nItem = GetSelectionMark();
if(nItem < 0) nItem = 0;
nSubItem = pNMListView->iSubItem;
if(nSubItem < 0) nSubItem = 0;
SetSameParam(nItem, nSubItem);
*pResult = 0;
} // OnColumnclick
void CAIChanList::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)(pNMHDR);
// Take the default processing unless we set this to something else below.
*pResult = CDRF_NEWFONT;
// First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if ( pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.
else // if ( pLVCD->nmcd.dwDrawStage==CDDS_ITEMPREPAINT )
{
*pResult = CDRF_DODEFAULT;
}
}
int CAIChanList::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
CFont axisFont;
axisFont.CreateFont(54, 120, 11, 32, 400,
FALSE, FALSE, 10, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, L"MS Sans Serif");
SetFont(&axisFont);
return 0;
}
BOOL CAIChanList::EnableWindowEx(BOOL bEnable)
{
BOOL bOldEnable = m_bEnableEx;
m_bEnableEx = bEnable;
return bOldEnable;
}
void CAIChanList::OnSetFocus(CWnd* pOldWnd)
{
// 必须隐掉否则当该控件获得焦点时再由其他进程窗口当住再恢复窗前时List会显示模糊。
// CListCtrl::OnSetFocus(pOldWnd);
}
void CAIChanList::OnContextMenu(CWnd* pWnd, CPoint point)
{
int nIndex = 0, nItemCount, nSeledCount = 0;
nItemCount = GetItemCount();
for(nIndex=0; nIndex<nItemCount; nIndex++)
{
UINT nStatus = GetItemState(nIndex, LVIS_SELECTED);
if(nStatus == 0)
{
continue;
}
nSeledCount++;
}
if(nSeledCount == 0)
return;
if (point.x == -1 && point.y == -1)
{
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_ListCHParam));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);
} // OnContextMenu
void CAIChanList::OnSameParam()
{
int nItem = GetSelectionMark();
if(nItem != -1)
{
SetSameParam(m_nCurItem, m_nCurSubItem);
}
}
void CAIChanList::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)(pNMHDR);
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nItem = 0, nSubItem = 0;
m_nCurItem = pNMListView->iItem;
m_nCurSubItem = pNMListView->iSubItem;
*pResult = 0;
}

View File

@ -0,0 +1,85 @@
#if !defined(AFX_AIAICHAN_LIST_H__162EB05F_779E_401B_83B8_2BCD82BC8A83__INCLUDED_)
#define AFX_AICHAN_LIST_H__162EB05F_779E_401B_83B8_2BCD82BC8A83__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CHListCtrl.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CAIChanList window
#include "ChanCombo.h"
#include "ChanEdit.h"
#define LIST_COL_CHANNEL 0
#define LIST_COL_EN 1
#define LIST_COL_SAMPRANGE 2
//#define LIST_COL_GAIN 1
#define LIST_COL_REFGND 3
#define LIST_COL_IMPED 4
class CAIChanList : public CListCtrl
{
// Construction
public:
CAIChanList();
// Attributes
public:
int m_nChanIdx; // ͨµÀ×鵥Ԫϱê
int m_nType;
CChanEdit m_wndEdit; // Build in Edit Control
CChanCombo m_wndCombo; // Build in ComboBox Control
BOOL RestoreCtrl(CRect rcCtrl);
BOOL SetCtrlFocus(CWnd* pWnd, BOOL bFocus);
BOOL m_bEnableEx;
BOOL EnableWindowEx(BOOL bEnable);
void SetSameParam(int nCurItem, int nSubItem);
int m_nCurItem;
int m_nCurSubItem;
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAIChanList)
protected:
virtual void PreSubclassWindow();
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
//}}AFX_VIRTUAL
// Implementation
public:
LRESULT OnSetCtrlFocus(WPARAM wParam, LPARAM lParam);
virtual ~CAIChanList();
// Generated message map functions
protected:
//{{AFX_MSG(CAIChanList)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnDelNode();
afx_msg void OnSameParam();
afx_msg void OnRclick(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_CHPARAMLIST_H__062EB05F_779E_401B_83B8_2BCD82BC8A83__INCLUDED_)

View File

@ -0,0 +1,423 @@
// CfgCtrlBar.cpp : implementation file
//
#include "stdafx.h"
#include "afxpriv.h" // for CDockContext
#include "CfgCtrlBar.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCfgCtrlBar
CCfgCtrlBar::CCfgCtrlBar()
{
m_sizeMin = CSize(32, 32);
m_sizeHorz = CSize(200, 400);
m_sizeVert = CSize(200, 400);
m_sizeFloat = CSize(200, 400);
m_bTracking = FALSE;
m_bInRecalcNC = FALSE;
m_cxEdge = 6;
}
CCfgCtrlBar::~CCfgCtrlBar()
{
}
BEGIN_MESSAGE_MAP(CCfgCtrlBar, CControlBar)
//{{AFX_MSG_MAP(CCfgCtrlBar)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
ON_WM_WINDOWPOSCHANGED()
ON_WM_NCPAINT()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCHITTEST()
ON_WM_NCCALCSIZE()
ON_WM_LBUTTONDOWN()
ON_WM_CAPTURECHANGED()
ON_WM_LBUTTONDBLCLK()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCfgCtrlBar message handlers
void CCfgCtrlBar::OnUpdateCmdUI(class CFrameWnd *pTarget, int bDisableIfNoHndler)
{
UpdateDialogControls(pTarget, bDisableIfNoHndler);
}
BOOL CCfgCtrlBar::Create(CWnd* pParentWnd, CSize sizeDefault, UINT nID, DWORD dwStyle)
{
ASSERT_VALID(pParentWnd); // must have a parent
ASSERT (!((dwStyle & CBRS_SIZE_FIXED) && (dwStyle & CBRS_SIZE_DYNAMIC)));
// save the style
m_dwStyle = CBRS_ALL;
dwStyle &= ~CBRS_ALL;
dwStyle |= CCS_NOPARENTALIGN|CCS_NOMOVEY|CCS_NODIVIDER|CCS_NORESIZE;
m_sizeHorz = sizeDefault;
m_sizeVert = sizeDefault;
m_sizeFloat = sizeDefault;
CString wndclass = AfxRegisterWndClass(CS_DBLCLKS, LoadCursor(NULL, IDC_ARROW),
CreateSolidBrush(GetSysColor(COLOR_BTNFACE)), 0);
if (!CWnd::Create(wndclass, _T("ÅäÖÃÓë·ÖÎöÌõ"), dwStyle, CRect(0,0,0,0),
pParentWnd, nID))
return FALSE;
SetBarStyle(m_dwStyle|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
return TRUE;
}
CSize CCfgCtrlBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
CRect rc;
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rc);
int nHorzDockBarWidth = bStretch ? 32767 : rc.Width() + 4;
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rc);
int nVertDockBarHeight = bStretch ? 32767 : rc.Height() + 4;
if (bHorz)
return CSize(nHorzDockBarWidth,m_sizeVert.cy);
else
return CSize(m_sizeVert.cx,nVertDockBarHeight);
}
CSize CCfgCtrlBar::CalcDynamicLayout(int nLength, DWORD dwMode)
{
if (dwMode & (LM_HORZDOCK | LM_VERTDOCK))
{
if (nLength == -1)
{
GetDockingFrame()->DelayRecalcLayout();
}
return CControlBar::CalcDynamicLayout(nLength,dwMode);
}
if (dwMode & LM_MRUWIDTH)
return m_sizeFloat;
if (dwMode & LM_COMMIT)
{
m_sizeFloat.cx = nLength;
return m_sizeFloat;
}
if (dwMode & LM_LENGTHY)
{
m_sizeFloat.cy = max(m_sizeMin.cy, nLength);
return CSize(m_sizeFloat.cx,m_sizeFloat.cy);
}
else
return CSize(max(m_sizeMin.cx, nLength), m_sizeFloat.cy);
}
void CCfgCtrlBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CControlBar::OnWindowPosChanged(lpwndpos);
if (m_bInRecalcNC) return;
// Find on which side are we docked
UINT nDockBarID = GetParent()->GetDlgCtrlID();
// Return if dropped at same location
if (nDockBarID == m_nDockBarID // no docking side change
&& (lpwndpos->flags & SWP_NOSIZE) // no size change
&& ((m_dwStyle & CBRS_BORDER_ANY) != CBRS_BORDER_ANY))
return;
m_nDockBarID = nDockBarID;
// Force recalc the non-client area
m_bInRecalcNC = TRUE;
SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
SWP_NOACTIVATE | SWP_FRAMECHANGED);
m_bInRecalcNC = FALSE;
}
BOOL CCfgCtrlBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if ((nHitTest != HTSIZE) || m_bTracking)
return CControlBar::OnSetCursor(pWnd, nHitTest, message);
if (IsHorz())
SetCursor(LoadCursor(NULL, IDC_SIZENS));
else
SetCursor(LoadCursor(NULL, IDC_SIZEWE));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////
// Mouse Handling
//
void CCfgCtrlBar::OnLButtonUp(UINT nFlags, CPoint point)
{
if (!m_bTracking)
CControlBar::OnLButtonUp(nFlags, point);
else
{
ClientToWnd(point);
StopTracking(TRUE);
}
}
void CCfgCtrlBar::OnMouseMove(UINT nFlags, CPoint point)
{
if (IsFloating() || !m_bTracking)
{
CControlBar::OnMouseMove(nFlags, point);
return;
}
CPoint cpt = m_rectTracker.CenterPoint();
ClientToWnd(point);
if (IsHorz())
{
if (cpt.y != point.y)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(0, point.y - cpt.y);
OnInvertTracker(m_rectTracker);
}
}
else
{
if (cpt.x != point.x)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(point.x - cpt.x, 0);
OnInvertTracker(m_rectTracker);
}
}
}
void CCfgCtrlBar::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
// Compute the rectangle of the mobile edge
GetWindowRect(m_rectBorder);
m_rectBorder = CRect(0, 0, m_rectBorder.Width(), m_rectBorder.Height());
DWORD dwBorderStyle = m_dwStyle | CBRS_BORDER_ANY;
switch(m_nDockBarID)
{
case AFX_IDW_DOCKBAR_TOP:
dwBorderStyle &= ~CBRS_BORDER_BOTTOM;
lpncsp->rgrc[0].bottom += -m_cxEdge;
m_rectBorder.top = m_rectBorder.bottom - m_cxEdge;
break;
case AFX_IDW_DOCKBAR_BOTTOM:
dwBorderStyle &= ~CBRS_BORDER_TOP;
lpncsp->rgrc[0].top += m_cxEdge;
m_rectBorder.bottom = m_rectBorder.top + m_cxEdge;
break;
case AFX_IDW_DOCKBAR_LEFT:
dwBorderStyle &= ~CBRS_BORDER_RIGHT;
lpncsp->rgrc[0].right += -m_cxEdge;
m_rectBorder.left = m_rectBorder.right - m_cxEdge;
break;
case AFX_IDW_DOCKBAR_RIGHT:
dwBorderStyle &= ~CBRS_BORDER_LEFT;
lpncsp->rgrc[0].left += m_cxEdge;
m_rectBorder.right = m_rectBorder.left + m_cxEdge;
break;
default:
m_rectBorder.SetRectEmpty();
break;
}
SetBarStyle(dwBorderStyle);
}
void CCfgCtrlBar::OnNcPaint()
{
EraseNonClient();
CDC *pDC = GetWindowDC();
pDC->Draw3dRect(m_rectBorder, GetSysColor(COLOR_BTNHIGHLIGHT),
GetSysColor(COLOR_BTNSHADOW));
ReleaseDC(pDC);
}
void CCfgCtrlBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (m_bTracking) return;
if ((nHitTest == HTSIZE) && !IsFloating())
StartTracking();
else
CControlBar::OnNcLButtonDown(nHitTest, point);
}
LRESULT CCfgCtrlBar::OnNcHitTest(CPoint point)
{
if (IsFloating())
return CControlBar::OnNcHitTest(point);
CRect rc;
GetWindowRect(rc);
point.Offset(-rc.left, -rc.top);
if (m_rectBorder.PtInRect(point))
return HTSIZE;
else
return CControlBar::OnNcHitTest(point);
}
void CCfgCtrlBar::OnLButtonDown(UINT nFlags, CPoint point)
{
// only start dragging if clicked in "void" space
if (m_pDockBar != NULL)
{
// start the drag
ASSERT(m_pDockContext != NULL);
ClientToScreen(&point);
m_pDockContext->StartDrag(point);
}
else
{
CWnd::OnLButtonDown(nFlags, point);
}
}
void CCfgCtrlBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// only toggle docking if clicked in "void" space
if (m_pDockBar != NULL)
{
// toggle docking
ASSERT(m_pDockContext != NULL);
m_pDockContext->ToggleDocking();
}
else
{
CWnd::OnLButtonDblClk(nFlags, point);
}
}
void CCfgCtrlBar::StartTracking()
{
SetCapture();
// make sure no updates are pending
RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW);
m_pDockSite->LockWindowUpdate();
m_ptOld = m_rectBorder.CenterPoint();
m_bTracking = TRUE;
m_rectTracker = m_rectBorder;
if (!IsHorz()) m_rectTracker.bottom -= 4;
OnInvertTracker(m_rectTracker);
}
void CCfgCtrlBar::OnCaptureChanged(CWnd *pWnd)
{
if (m_bTracking && pWnd != this)
StopTracking(FALSE); // cancel tracking
CControlBar::OnCaptureChanged(pWnd);
}
void CCfgCtrlBar::StopTracking(BOOL bAccept)
{
OnInvertTracker(m_rectTracker);
m_pDockSite->UnlockWindowUpdate();
m_bTracking = FALSE;
ReleaseCapture();
if (!bAccept) return;
int maxsize, minsize, newsize;
CRect rcc;
m_pDockSite->GetClientRect(rcc);
newsize = IsHorz() ? m_sizeHorz.cy : m_sizeVert.cx;
maxsize = newsize + (IsHorz() ? rcc.Height() : rcc.Width());
minsize = IsHorz() ? m_sizeMin.cy : m_sizeMin.cx;
CPoint point = m_rectTracker.CenterPoint();
switch (m_nDockBarID)
{
case AFX_IDW_DOCKBAR_TOP:
newsize += point.y - m_ptOld.y; break;
case AFX_IDW_DOCKBAR_BOTTOM:
newsize += -point.y + m_ptOld.y; break;
case AFX_IDW_DOCKBAR_LEFT:
newsize += point.x - m_ptOld.x; break;
case AFX_IDW_DOCKBAR_RIGHT:
newsize += -point.x + m_ptOld.x; break;
}
newsize = max(minsize, min(maxsize, newsize));
if (IsHorz())
m_sizeHorz.cy = newsize;
else
m_sizeVert.cx = newsize;
m_pDockSite->DelayRecalcLayout();
}
void CCfgCtrlBar::OnInvertTracker(const CRect& rect)
{
ASSERT_VALID(this);
ASSERT(!rect.IsRectEmpty());
ASSERT(m_bTracking);
CRect rct = rect, rcc, rcf;
GetWindowRect(rcc);
m_pDockSite->GetWindowRect(rcf);
rct.OffsetRect(rcc.left - rcf.left, rcc.top - rcf.top);
rct.DeflateRect(1, 1);
CDC *pDC = m_pDockSite->GetDCEx(NULL,
DCX_WINDOW|DCX_CACHE|DCX_LOCKWINDOWUPDATE);
CBrush* pBrush = CDC::GetHalftoneBrush();
HBRUSH hOldBrush = NULL;
if (pBrush != NULL)
hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
pDC->PatBlt(rct.left, rct.top, rct.Width(), rct.Height(), PATINVERT);
if (hOldBrush != NULL)
SelectObject(pDC->m_hDC, hOldBrush);
m_pDockSite->ReleaseDC(pDC);
}
BOOL CCfgCtrlBar::IsHorz() const
{
return (m_nDockBarID == AFX_IDW_DOCKBAR_TOP ||
m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
}
CPoint& CCfgCtrlBar::ClientToWnd(CPoint& point)
{
if (m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM)
point.y += m_cxEdge;
else if (m_nDockBarID == AFX_IDW_DOCKBAR_RIGHT)
point.x += m_cxEdge;
return point;
}

View File

@ -0,0 +1,87 @@
#if !defined(SIZECBAR_H_INCLUDED)
#define SIZECBAR_H_INCLUDED
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// sizecbar.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CCfgCtrlBar control bar
class CCfgCtrlBar : public CControlBar
{
// Construction / destruction
public:
CCfgCtrlBar();
// Attributes
public:
BOOL IsHorz() const;
// Operations
public:
// Overridables
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCfgCtrlBar)
public:
virtual BOOL Create(CWnd* pParentWnd, CSize sizeDefault, UINT nID, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP);
virtual CSize CalcFixedLayout( BOOL bStretch, BOOL bHorz );
virtual CSize CalcDynamicLayout( int nLength, DWORD dwMode );
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CCfgCtrlBar();
void StartTracking();
void StopTracking(BOOL bAccept);
void OnInvertTracker(const CRect& rect);
// implementation helpers
CPoint& ClientToWnd(CPoint& point);
protected:
CSize m_sizeMin;
CSize m_sizeHorz;
CSize m_sizeVert;
CSize m_sizeFloat;
CRect m_rectBorder;
CRect m_rectTracker;
UINT m_nDockBarID;
CPoint m_ptOld;
BOOL m_bTracking;
BOOL m_bInRecalcNC;
int m_cxEdge;
// Generated message map functions
protected:
//{{AFX_MSG(CCfgCtrlBar)
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
afx_msg void OnNcPaint();
afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
afx_msg LRESULT OnNcHitTest(CPoint point);
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnCaptureChanged(CWnd *pWnd);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(SIZECBAR_H_INCLUDED)

View File

@ -0,0 +1,292 @@
// SizingTabCtrlBar.cpp: Implementierungsdatei
//
#include "stdafx.h"
#include "Sys.h"
#include "CfgTabCtrlBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCfgTabCtrlBar
CCfgTabCtrlBar::CCfgTabCtrlBar()
{
m_nActiveTab = 0;
}
CCfgTabCtrlBar::~CCfgTabCtrlBar()
{
while(!m_views.IsEmpty())
{
TCB_ITEM *pMember=m_views.RemoveHead();
delete pMember;
}
}
BEGIN_MESSAGE_MAP(CCfgTabCtrlBar, CCfgCtrlBar)
//{{AFX_MSG_MAP(CCfgTabCtrlBar)
ON_WM_CREATE()
ON_WM_SIZE()
ON_NOTIFY(TCN_SELCHANGE, IDI_TABCTRLBAR, OnTabSelChange)
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen f黵 Nachrichten CCfgTabCtrlBar
int CCfgTabCtrlBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CCfgCtrlBar::OnCreate(lpCreateStruct) == -1)
return -1;
//Create the Tab Control
CRect rect;
m_tabctrl.Create(WS_VISIBLE|WS_CHILD,//|TCS_BOTTOM ,
rect, this, IDI_TABCTRLBAR);
m_images.Create(IDB_TABIMAGES, 16, 1, RGB(255,0,255)); // 创建位图阵列
m_tabctrl.SetImageList(&m_images); // 将位图阵列置入控件
// set "normal" GUI-font
CFont *font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
m_tabctrl.SetFont(font);
CRect StartButtonRect(10, 6, 180, 36);
CRect StopButtonRect(10, 40, 180, 70);
//m_StartDeviceButton = new CButton();
m_StartDeviceButton.Create(_T("开始数据采集"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON , StartButtonRect, this, IDM_StartDeviceAD);
//m_StopDeviceButton = new CButton();
m_StopDeviceButton.Create(_T("停止数据采集"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , StopButtonRect, this, IDM_StopDeviceAD);
return 0;
}
void CCfgTabCtrlBar::OnSize(UINT nType, int cx, int cy)
{
CCfgCtrlBar::OnSize(nType, cx, cy);
int bottom = (IsHorz() || IsFloating()) ? cy - 82 : cy - 84;
m_tabctrl.MoveWindow( 7, 77, cx , bottom); // 在CControlBar在移动Tab控件位置
CWnd *pWnd;
for (POSITION pos=m_views.GetHeadPosition(); pos; m_views.GetNext(pos))
{
pWnd=m_views.GetAt(pos)->pWnd;
pWnd->MoveWindow(9, 99, cx-18, bottom-25); // 在CControlBar在移动视图类的控件位置
}
}
CWnd* CCfgTabCtrlBar::AddView(LPCTSTR lpszLabel, CRuntimeClass *pViewClass, CCreateContext *pContext)
{
#ifdef _DEBUG
ASSERT_VALID(this);
ASSERT(pViewClass != NULL);
ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));
#endif
CCreateContext context;
if (pContext == NULL)
{
// if no context specified, generate one from the currently selected
// client if possible
CView* pOldView = NULL;
if (pOldView != NULL && pOldView->IsKindOf(RUNTIME_CLASS(CView)))
{
// set info about last pane
ASSERT(context.m_pCurrentFrame == NULL);
context.m_pLastView = pOldView;
context.m_pCurrentDoc = pOldView->GetDocument();
if (context.m_pCurrentDoc != NULL)
context.m_pNewDocTemplate =
context.m_pCurrentDoc->GetDocTemplate();
}
pContext = &context;
}
CWnd* pWnd;
TRY
{
pWnd = (CWnd*)pViewClass->CreateObject();
if (pWnd == NULL)
AfxThrowMemoryException();
}
CATCH_ALL(e)
{
TRACE0("Out of memory creating a view.\n");
// Note: DELETE_EXCEPTION(e) not required
return FALSE;
}
END_CATCH_ALL
ASSERT_KINDOF(CWnd, pWnd);
ASSERT(pWnd->m_hWnd == NULL); // not yet created
DWORD dwStyle = AFX_WS_DEFAULT_VIEW;
CRect rect,rect1;
// Create with the right size and position
if (!pWnd->Create(NULL, NULL, dwStyle, rect, this, 0, pContext))
{
TRACE0("Warning: couldn't create client pane for view.\n");
// pWnd will be cleaned up by PostNcDestroy
return FALSE;
}
m_pActiveView = (CView*) pWnd;
TCB_ITEM *pMember=new TCB_ITEM;
pMember->pWnd=pWnd;
_tcscpy(pMember->szLabel, lpszLabel);
m_views.AddTail(pMember);
int nViews = (int)m_views.GetCount();
if (nViews!=1)
{
pWnd->EnableWindow(FALSE);
pWnd->ShowWindow(SW_HIDE);
}
else
{
((CFrameWnd *)GetParent())->SetActiveView((CView *)m_pActiveView);
}
TC_ITEM tci;
tci.mask = TCIF_TEXT | TCIF_IMAGE;
tci.pszText = (LPTSTR)(LPCTSTR)lpszLabel;
tci.iImage = nViews-1;
m_tabctrl.InsertItem(nViews, &tci);
return pWnd;
}
void CCfgTabCtrlBar::RemoveView(int nView)
{
ASSERT_VALID(this);
ASSERT(nView >= 0);
// remove the page from internal list
m_views.RemoveAt(m_views.FindIndex(nView));
}
void CCfgTabCtrlBar::OnTabSelChange(NMHDR* pNMHDR, LRESULT* pResult)
{
SetActiveView(m_tabctrl.GetCurSel());
}
void CCfgTabCtrlBar::SetActiveView(int nNewTab)
{
ASSERT_VALID(this);
ASSERT(nNewTab >= 0);
if (nNewTab!=-1 && nNewTab!=m_nActiveTab)
{
TCB_ITEM *newMember=m_views.GetAt(m_views.FindIndex(nNewTab));
TCB_ITEM *oldMember=NULL;
if (m_nActiveTab!=-1)
{
oldMember=m_views.GetAt(m_views.FindIndex(m_nActiveTab));
oldMember->pWnd->EnableWindow(FALSE);
oldMember->pWnd->ShowWindow(SW_HIDE);
}
newMember->pWnd->EnableWindow(TRUE);
newMember->pWnd->ShowWindow(SW_SHOW);
newMember->pWnd->SetFocus();
m_pActiveView = (CView *)newMember->pWnd;
((CFrameWnd *)GetParent())->SetActiveView(m_pActiveView);
m_nActiveTab = nNewTab;
// select the tab (if tab programmatically changed)
m_tabctrl.SetCurSel(m_nActiveTab);
}
}
void CCfgTabCtrlBar::SetActiveView(CRuntimeClass *pViewClass)
{
ASSERT_VALID(this);
ASSERT(pViewClass != NULL);
ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));
int nNewTab = 0;
for (POSITION pos=m_views.GetHeadPosition(); pos; m_views.GetNext(pos))
{
TCB_ITEM *pMember=m_views.GetAt(pos);
if (pMember->pWnd->IsKindOf(pViewClass))
{
//first hide old first view
m_pActiveView->EnableWindow(FALSE);
m_pActiveView->ShowWindow(SW_HIDE);
// set new active view
m_pActiveView = (CView*)pMember->pWnd;
// enable, show, set focus to new view
m_pActiveView->EnableWindow(TRUE);
m_pActiveView->ShowWindow(SW_SHOW);
m_pActiveView->SetFocus();
((CFrameWnd *)GetParent())->SetActiveView(m_pActiveView);
m_nActiveTab = nNewTab;
// select the tab
m_tabctrl.SetCurSel(m_nActiveTab);
break;
}
nNewTab++;
}
}
CView* CCfgTabCtrlBar::GetActiveView()
{
return m_pActiveView;
}
CView* CCfgTabCtrlBar::GetView(int nView)
{
ASSERT_VALID(this);
ASSERT(nView >= 0);
if (nView!=-1)
{
TCB_ITEM *pMember=m_views.GetAt(m_views.FindIndex(nView));
return (CView*)pMember->pWnd;
}
else
return NULL;
}
CView* CCfgTabCtrlBar::GetView(CRuntimeClass *pViewClass)
{
ASSERT_VALID(this);
ASSERT(pViewClass != NULL);
ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));
for (POSITION pos=m_views.GetHeadPosition(); pos; m_views.GetNext(pos))
{
TCB_ITEM *pMember=m_views.GetAt(pos);
if (pMember->pWnd->IsKindOf(pViewClass))
{
return (CView*)pMember->pWnd;
}
}
return NULL;
}
/*void CCfgTabCtrlBar::OnKillFocus(CWnd* pNewWnd)
{
CCfgCtrlBar::OnKillFocus(pNewWnd);
// TODO: Add your message handler code here
}*/

View File

@ -0,0 +1,72 @@
#ifndef AFX_SIZINGTABCTRLBAR_H__3804CCE3_C325_11D1_91F5_B4375BB20A38__INCLUDED_
#define AFX_SIZINGTABCTRLBAR_H__3804CCE3_C325_11D1_91F5_B4375BB20A38__INCLUDED_
// SizingTabCtrlBar.h : Header-Datei
//
#include <afxtempl.h>
#include "CfgCtrlBar.h"
typedef struct
{
CWnd *pWnd;
TCHAR szLabel[32];
}TCB_ITEM;
/////////////////////////////////////////////////////////////////////////////
// Fenster CCfgTabCtrlBar
class CCfgTabCtrlBar : public CCfgCtrlBar
{
// Konstruktion
public:
CCfgTabCtrlBar();
// Attribute
public:
CButton m_StartDeviceButton;
CButton m_StopDeviceButton;
// Operationen
public:
// Überschreibungen
void SetActiveView(int nNewTab);
void SetActiveView(CRuntimeClass *pViewClass);
// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
//{{AFX_VIRTUAL(CCfgTabCtrlBar)
//}}AFX_VIRTUAL
// Implementierung
public:
CView* GetActiveView();
CView* GetView(int nView);
CView* GetView(CRuntimeClass *pViewClass);
CWnd* AddView(LPCTSTR lpszLabel, CRuntimeClass *pViewClass, CCreateContext *pContext = NULL);
void RemoveView(int nView);
CTabCtrl m_tabctrl;
CButton m_test;
virtual ~CCfgTabCtrlBar();
// Generierte Nachrichtenzuordnungsfunktionen
protected:
int m_nActiveTab;
CView* m_pActiveView;
CList <TCB_ITEM *,TCB_ITEM *> m_views;
CImageList m_images;
//{{AFX_MSG(CCfgTabCtrlBar)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnTabSelChange(NMHDR* pNMHDR, LRESULT* pResult) ;
// afx_msg void OnKillFocus(CWnd* pNewWnd);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio fügt zusätzliche Deklarationen unmittelbar vor der vorhergehenden Zeile ein.
#endif // AFX_SIZINGTABCTRLBAR_H__3804CCE3_C325_11D1_91F5_B4375BB20A38__INCLUDED_

View File

@ -0,0 +1,63 @@
// ChanCombo.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ChanCombo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChanCombo
CChanCombo::CChanCombo()
{
}
CChanCombo::~CChanCombo()
{
}
BEGIN_MESSAGE_MAP(CChanCombo, CComboBox)
//{{AFX_MSG_MAP(CChanCombo)
ON_WM_KILLFOCUS()
ON_WM_CREATE()
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChanCombo message handlers
void CChanCombo::OnKillFocus(CWnd* pNewWnd)
{
CComboBox::OnKillFocus(pNewWnd);
ShowWindow(SW_HIDE);
EnableWindow(FALSE);
// CWnd* pParent = (CWnd* )GetParent();
// ::SendMessage(pParent->m_hWnd, WM_SET_CTRL_FOCUS, NULL, NULL);
}
int CChanCombo::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CComboBox::OnCreate(lpCreateStruct) == -1)
return -1;
m_Font.CreatePointFont(90, L"ËÎÌå");
SetFont(&m_Font);
return 0;
}
void CChanCombo::OnSelchange()
{
CWnd* pParent = (CWnd* )GetParent();
::SendMessage(pParent->m_hWnd, WM_SET_CTRL_FOCUS, NULL, NULL);
}

View File

@ -0,0 +1,51 @@
#if !defined(AFX_CHAN_COMBO_H__08E497EB_35AE_47F1_962E_DA7AB611098E__INCLUDED_)
#define AFX_CHAN_COMBO_H__08E497EB_35AE_47F1_962E_DA7AB611098E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ChanCombo.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CChanCombo window
class CChanCombo : public CComboBox
{
// Construction
public:
CChanCombo();
CFont m_Font;
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CChanCombo)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CChanCombo();
// Generated message map functions
protected:
//{{AFX_MSG(CChanCombo)
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSelchange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_CHAN_COMBO_H__08E497EB_35AE_47F1_962E_DA7AB611098E__INCLUDED_)

View File

@ -0,0 +1,56 @@
// ChanEdit.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "ChanEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChanEdit
CChanEdit::CChanEdit()
{
}
CChanEdit::~CChanEdit()
{
}
BEGIN_MESSAGE_MAP(CChanEdit, CEdit)
//{{AFX_MSG_MAP(CChanEdit)
ON_WM_CREATE()
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChanEdit message handlers
int CChanEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
m_Font.CreatePointFont(130, L"ºÚÌå");
SetFont(&m_Font);
return 0;
}
void CChanEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
ShowWindow(SW_HIDE);
EnableWindow(FALSE);
CWnd* pParent = (CWnd* )GetParent();
::SendMessage(pParent->m_hWnd, WM_SET_CTRL_FOCUS, NULL, NULL);
}

View File

@ -0,0 +1,52 @@
#if !defined(AFX_CHAN_EDIT_H__C1AFC325_4FA3_421A_A85B_AAFE25FAD9F1__INCLUDED_)
#define AFX_CHAN_EDIT_H__C1AFC325_4FA3_421A_A85B_AAFE25FAD9F1__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CChanEdit.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CChanEdit window
class CChanEdit : public CEdit
{
// Construction
public:
CChanEdit();
// Attributes
public:
protected:
CFont m_Font;
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CChanEdit)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CChanEdit();
// Generated message map functions
protected:
//{{AFX_MSG(CChanEdit)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnKillFocus(CWnd* pNewWnd);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_CHAN_EDIT_H__C1AFC325_4FA3_421A_A85B_AAFE25FAD9F1__INCLUDED_)

View File

@ -0,0 +1,59 @@
@echo off
del /s *.~h
del /s *.~cpp
del /s *.~bpr
del /s *.dof
del /s *.ddp
del /s *.~dfm
del /s *.~ddp
del /s *.log
del /s *.~dpr
del /s *.dcu
del /s *.~pas
del /s *.exp
del /s *.obj
del /s *.sbr
del /s *.idb
del /s *.pch
del /s *.aps
del /s *.bsc
del /s *.obj
del /s *.pdb
del /s *.ncb
del /s *.opt
del /s *.sdf
del /s debug\*.exp
del /s debug\*.bsc
del /s debug\*.obj
del /s debug\*.sbr
del /s debug\*.idb
del /s debug\*.pch
del /s debug\*.ilk
del /s debug\*.pdb
del /s release\*.exp
del /s release\*.bsc
del /s release\*.obj
del /s release\*.sbr
del /s release\*.idb
del /s release\*.pch
del /s release\*.ilk
del /s release\*.pdb
del /s *.suo
del /s *.user
del debug\*.* /q
del release\*.* /q
del /s ipch\*.ipch
rd debug
rd X86 /s /q
rd x64 /s /q
rd ipch /s /q
rd release
rd ipch

View File

@ -0,0 +1,171 @@
// MTabWnd.cpp : implementation file
//
/////////////////////////////////////////////////////////////////////////////
// Derive your mainframe window from this class to get support for the
// MDI tabs. Also adds support for next/previous MDI window selection.
/////////////////////////////////////////////////////////////////////////////
//
// Copyright ?1998 Written by Dieter Fauth
// mailto:fauthd@zvw.de
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name and all copyright
// notices remains intact. If the source code in this file is used in
// any commercial application then a statement along the lines of
// "Portions Copyright ?1999 Dieter Fauth" must be included in
// the startup banner, "About" box or printed documentation. An email
// letting me know that you are using it would be nice as well. That's
// not much to ask considering the amount of work that went into this.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability for any damage/loss of business that
// this product may cause.
//
// ==========================================================================
// HISTORY:
// ==========================================================================
// 1.00 08 May 1999 - Initial release.
// ==========================================================================
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <afxpriv.h>
#include "Sys.h"
#include "MTabWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMDITabFrameWnd
IMPLEMENT_DYNCREATE(CMDITabFrameWnd, CMDIFrameWnd)
CMDITabFrameWnd::CMDITabFrameWnd()
{
}
CMDITabFrameWnd::~CMDITabFrameWnd()
{
}
BEGIN_MESSAGE_MAP(CMDITabFrameWnd, CMDIFrameWnd)
ON_WM_INITMENU()
//{{AFX_MSG_MAP(CMDITabFrameWnd)
ON_COMMAND(ID_WINDOW_NEXT_PANE, OnWindowNextPane)
ON_COMMAND(ID_WINDOW_PREV_PANE, OnWindowPrevPane)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CMDITabFrameWnd::CreateTabs(void)
{
// m_wndTabs是CControlBar派生类
if (!m_wndTabs.Create(this,WS_VISIBLE|WS_CHILD|CBRS_TOP|WS_EX_WINDOWEDGE, IDC_MDI_TAB_CTRL_BAR))
{
TRACE("Failed to create test status bar\n");
return -1; // fail to create
}
m_wndMdiClient.m_pWndTabs = &m_wndTabs;
ASSERT(m_hWndMDIClient != NULL);
// 通过注册m_hWndMDIClient窗口类便可以使它得到添加和移去TAB控件的消息
if (!m_wndMdiClient.SubclassWindow(m_hWndMDIClient) )
{
TRACE("Failed to subclass MDI client\n");
return -1; // fail to create
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CMDITabFrameWnd message handlers
//
void CMDITabFrameWnd::OnWindowNextPane()
{
MDINext();
}
void CMDITabFrameWnd::OnWindowPrevPane()
{
ASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWndMDIClient, WM_MDINEXT, 0, 1);
}
void CMDITabFrameWnd::OnInitMenu(CMenu* pMenu)
{
CMDIFrameWnd::OnInitMenu(pMenu);
// CG: This block added by 'Tip of the Day' component.
{
// TODO: This code adds the "Tip of the Day" menu item
// on the fly. It may be removed after adding the menu
// item to all applicable menu items using the resource
// editor.
// Add Tip of the Day menu item on the fly!
static CMenu* pSubMenu = NULL;
CString strHelp; strHelp.LoadString(CG_IDS_TIPOFTHEDAYHELP);
CString strMenu;
int nMenuCount = pMenu->GetMenuItemCount();
BOOL bFound = FALSE;
for (int i=0; i < nMenuCount; i++)
{
pMenu->GetMenuString(i, strMenu, MF_BYPOSITION);
if (strMenu == strHelp)
{
pSubMenu = pMenu->GetSubMenu(i);
bFound = TRUE;
ASSERT(pSubMenu != NULL);
}
}
CString strTipMenu;
strTipMenu.LoadString(CG_IDS_TIPOFTHEDAYMENU);
if (!bFound)
{
// Help menu is not available. Please add it!
if (pSubMenu == NULL)
{
// The same pop-up menu is shared between mainfrm and frame
// with the doc.
static CMenu popUpMenu;
pSubMenu = &popUpMenu;
pSubMenu->CreatePopupMenu();
pSubMenu->InsertMenu(0, MF_STRING|MF_BYPOSITION,
CG_IDS_TIPOFTHEDAY, strTipMenu);
}
pMenu->AppendMenu(MF_STRING|MF_BYPOSITION|MF_ENABLED|MF_POPUP,
(UINT)pSubMenu->m_hMenu, strHelp);
DrawMenuBar();
}
else
{
// Check to see if the Tip of the Day menu has already been added.
pSubMenu->GetMenuString(0, strMenu, MF_BYPOSITION);
if (strMenu != strTipMenu)
{
// Tip of the Day submenu has not been added to the
// first position, so add it.
pSubMenu->InsertMenu(0, MF_BYPOSITION); // Separator
pSubMenu->InsertMenu(0, MF_STRING|MF_BYPOSITION,
CG_IDS_TIPOFTHEDAY, strTipMenu);
}
}
}
}

View File

@ -0,0 +1,56 @@
#if !defined(AFX_MTABWND_H__E23B47A5_FE45_11D2_BC0D_006008CCD137__INCLUDED_)
#define AFX_MTABWND_H__E23B47A5_FE45_11D2_BC0D_006008CCD137__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// MTabWnd.h : header file
//
#include "TabCtrlBarDoc.h"
#include "MdiClient.h"
/////////////////////////////////////////////////////////////////////////////
// CMDITabFrameWnd frame
class CMDITabFrameWnd : public CMDIFrameWnd
{
DECLARE_DYNCREATE(CMDITabFrameWnd)
protected:
CMDITabFrameWnd(); // protected constructor used by dynamic creation
// Attributes
public:
// Operations
public:
BOOL CreateTabs(void) ;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMDITabFrameWnd)
protected:
//}}AFX_VIRTUAL
public:
// Implementation
protected:
afx_msg void OnInitMenu(CMenu* pMenu);
virtual ~CMDITabFrameWnd();
CTabCtrlBarDoc m_wndTabs;
CMdiClient m_wndMdiClient;
// Generated message map functions
//{{AFX_MSG(CMDITabFrameWnd)
afx_msg void OnWindowNextPane();
afx_msg void OnWindowPrevPane();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MTABWND_H__E23B47A5_FE45_11D2_BC0D_006008CCD137__INCLUDED_)

View File

@ -0,0 +1,160 @@
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "Sys.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern ACTS1000_PARA_AD Para;
extern BOOL bCreateDevice;
extern BOOL gl_bDeviceADRun;
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_ACTIVATE()
ON_WM_ACTIVATEAPP()
ON_BN_CLICKED(IDC_ADDCHANNEL, ClickFunction)
ON_WM_DESTROY()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_SHOWMOUSEVOLT, //显示鼠标的指针的位置
ID_SHOWMOUSEVOLT, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
void CMainFrame::ClickFunction(void)
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(CreateTabs()==-1)
return -1;
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::SetMouseVolt(CString strText)//把鼠标的指针的位置显状态栏上
{
int nIndex=m_wndStatusBar.CommandToIndex(ID_SHOWMOUSEVOLT);
CWindowDC dc(&m_wndStatusBar);
CSize sizeText=dc.GetTextExtent(strText);
m_wndStatusBar.SetPaneInfo(nIndex,ID_SHOWMOUSEVOLT,SBPS_NORMAL,sizeText.cx);
m_wndStatusBar.SetPaneText(2,strText);
}
void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CMDIFrameWnd::OnActivate(nState, pWndOther, bMinimized);
}
void CMainFrame::OnActivateApp(BOOL bActive, DWORD hTask)
{
CMDIFrameWnd::OnActivateApp(bActive, hTask);
// TODO: Add your message handler code here
}
BOOL CMainFrame::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
return CMDIFrameWnd::DestroyWindow();
}
void CMainFrame::OnDestroy()
{
CMDIFrameWnd::OnDestroy();
// TODO: Add your message handler code here
}
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
// if(MessageBox(_T("您真的要退出本系统吗?..."), "提醒您..."), MB_YESNO|MB_ICONINFORMATION)==IDNO)
// return;
CMDIFrameWnd::OnClose();
}
BOOL CMainFrame::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CMDIFrameWnd::OnCreateClient(lpcs, pContext);
}

View File

@ -0,0 +1,70 @@
// MainFrm.h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_MAINFRM_H__D485DF01_85AB_11D1_B878_A68EB300DD63__INCLUDED_)
#define AFX_MAINFRM_H__D485DF01_85AB_11D1_B878_A68EB300DD63__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMainFrame : public CMDITabFrameWnd
{
DECLARE_DYNAMIC(CMainFrame)
public:
CMainFrame();
public:
// Attributes
public:
CStatusBar m_wndStatusBar;
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual BOOL DestroyWindow();
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
//}}AFX_VIRTUAL
// Implementation
public:
void SetMouseVolt(CString strText);
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // control bar embedded members
CToolBar m_wndToolBar;
CReBar m_wndReBar;
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
afx_msg void OnActivateApp(BOOL bActive, DWORD hTask);
afx_msg void ClickFunction();
afx_msg void OnDestroy();
afx_msg void OnClose();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MAINFRM_H__D485DF01_85AB_11D1_B878_A68EB300DD63__INCLUDED_)

View File

@ -0,0 +1,133 @@
// MdiClient.cpp : implementation file
//
/////////////////////////////////////////////////////////////////////////////
// This class does subclass the MDI-CLIENT window.
// Subclassing means that all messages are first routed to this class, then
// to the original window (in this case the MDI-CLIENT).
// We need this to get notifications of the creation and deletion of the
// MDI child frames (contain views).
/////////////////////////////////////////////////////////////////////////////
//
// Copyright ?1998 Written by Dieter Fauth
// mailto:fauthd@zvw.de
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name and all copyright
// notices remains intact. If the source code in this file is used in
// any commercial application then a statement along the lines of
// "Portions Copyright ?1999 Dieter Fauth" must be included in
// the startup banner, "About" box or printed documentation. An email
// letting me know that you are using it would be nice as well. That's
// not much to ask considering the amount of work that went into this.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability for any damage/loss of business that
// this product may cause.
//
// ==========================================================================
// HISTORY:
// ==========================================================================
// 1.00 08 May 1999 - Initial release.
// ==========================================================================
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TabCtrlBarDoc.h"
#include "MdiClient.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMdiClient
CMdiClient::CMdiClient(): m_sizeClient(0, 0)
{
m_crBkColor = GetSysColor(COLOR_DESKTOP);
m_pWndTabs = NULL;
}
CMdiClient::~CMdiClient()
{
}
BEGIN_MESSAGE_MAP(CMdiClient, CWnd)
//{{AFX_MSG_MAP(CMdiClient)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_MESSAGE(WM_MDICREATE,OnMDICreate)
ON_MESSAGE(WM_MDIDESTROY,OnMDIDestroy)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
void CMdiClient::AddHandle(HWND hWnd)
{
ASSERT(m_pWndTabs != NULL);
// 添加列表
m_pWndTabs->AddHandle(hWnd);
}
void CMdiClient::RemoveHandle(HWND hWnd)
{
ASSERT(m_pWndTabs != NULL);
m_pWndTabs->RemoveHandle(hWnd);
}
/////////////////////////////////////////////////////////////////////////////
// CMdiClient message handlers
LRESULT CMdiClient::OnMDICreate(WPARAM wParam, LPARAM lParam)
{
HWND hWnd = (HWND) DefWindowProc(WM_MDICREATE, wParam, lParam);
AddHandle(hWnd);
return (LRESULT) hWnd;
}
LRESULT CMdiClient::OnMDIDestroy(WPARAM wParam, LPARAM lParam)
{
RemoveHandle((HWND) wParam);
return DefWindowProc(WM_MDIDESTROY, wParam, lParam);
}
BOOL CMdiClient::OnEraseBkgnd(CDC* pDC)
{
return CWnd::OnEraseBkgnd(pDC);
}
void CMdiClient::OnSize(UINT nType, int cx, int cy)
{
// 当客户区域变化时,被调用。即当子帧窗口被最大化时,也会产生此消息
CWnd::OnSize(nType, cx, cy);
// 如果应用程序当启动,则保存这个大小参数,即可返回
if ((m_sizeClient.cx == 0) && (m_sizeClient.cy == 0))
{
m_sizeClient.cx = cx;
m_sizeClient.cy = cy;
return ;
}
// 如果客户窗口大小未发生变化,则返回
if ((m_sizeClient.cx == cx) && ( m_sizeClient.cy == cy))
{
return;
}
// 保存新值
m_sizeClient.cx = cx;
m_sizeClient.cy = cy;
// 强制重绘
RedrawWindow(NULL, NULL,
RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_ALLCHILDREN);
return;
}

View File

@ -0,0 +1,61 @@
#if !defined(AFX_MDICLIENT_H__07D11962_0399_11D3_BC0D_89BC9BB36074__INCLUDED_)
#define AFX_MDICLIENT_H__07D11962_0399_11D3_BC0D_89BC9BB36074__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// MdiClient.h : header file
//
class CTabBar;
/////////////////////////////////////////////////////////////////////////////
// CMdiClient window
class CMdiClient : public CWnd
{
// Construction
public:
CMdiClient();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMdiClient)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMdiClient();
CTabCtrlBarDoc *m_pWndTabs;
COLORREF m_crBkColor;
CSize m_sizeClient; // ¿Í»§Çø´óС
protected:
void RemoveHandle(HWND hWnd);
void AddHandle(HWND hWnd);
// Generated message map functions
protected:
//{{AFX_MSG(CMdiClient)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
afx_msg LRESULT OnMDICreate(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMDIDestroy(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MDICLIENT_H__07D11962_0399_11D3_BC0D_89BC9BB36074__INCLUDED_)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,179 @@
#if !defined(AFX_ParaCfgView_H__6F78B8A1_CC79_11D6_B1D2_CF0B5E784620__INCLUDED_)
#define AFX_ParaCfgView_H__6F78B8A1_CC79_11D6_B1D2_CF0B5E784620__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ParaCfgView.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CParaCfgView form view
#ifndef __AFXEXT_H__
#include <afxext.h>
#endif
#include "ADFrm.h"
#include "afxwin.h"
#include "AIChanList.h"
#include "ADDoc.h"
class CParaCfgView : public CFormView
{
protected:
CParaCfgView(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CParaCfgView)
public:
CADFrame* m_pADFrm;
BOOL m_bErrorDlg;
// Form Data
public:
//{{AFX_DATA(CParaCfgView)
enum { IDD = CG_IDD_ADCHANNEL };
CEdit m_Edit_TrigInterva;
CButton m_Check_TimerTrig;
CButton m_Button_SoftTirg;
CComboBox m_Combo_SyncTrigSignal;
CButton m_Check_bMasterEn;
CButton m_Check_bClkOutEn;
CButton m_Check_bTrigOutEn;
CEdit m_Edit_nSampleLenth;
//CButton m_Check_bAvailableTrig;
CEdit m_Edit_TrigLevelVolt;
CEdit m_Edit_TrigCount;
CEdit m_Edit_TrigWindow;
CEdit m_Edit_FreqDivision;
CEdit m_Edit_Frequency;
CEdit m_Edit_TrigOutWidth;
CEdit m_Edit_N_Length;
CEdit m_Edit_M_Length;
CComboBox m_Combo_ReferenceClock;
CComboBox m_Combo_TrigOutPolarity;
CComboBox m_Combo_ClkOutSel;
CComboBox m_ComBo_TriggerMode;
CComboBox m_Combo_SampleLenth;
CComboBox m_Combo_TriggerDir;
CComboBox m_Combo_TriggerSource;
CStatic m_Static_Offset;
CSpinButtonCtrl m_Spin_BufferID;
CSliderCtrl m_Slider_Offset;
CEdit m_Edit_BufferID;
CButton m_Check_Auto;
LONG m_TrigLevelVolt;
CAIChanList m_List_CHParam;
//}}AFX_DATA
// Attributes
public:
long Array[80];
int CountItem;
BOOL m_bInitial;
SCROLLINFO si;
long cyChar;
int iVertPos;
int m_nBits;
int m_nChannelDataBit;
LONG m_lSingleCH;
// Operations
public:
void EnableVootRange();
void StartAD();
void SetInputRangeComboSel(int* pInputRange);
void EnableWindows(BOOL Flag=TRUE);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CParaCfgView)
public:
virtual void OnInitialUpdate();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CParaCfgView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
//{{AFX_MSG(CParaCfgView)
afx_msg void OnSelchangeCOMBOTriggerSource();
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSelchangeCOMBOOutTriggerDir();
afx_msg void OnCustomdrawSLIDEROffset(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnChangeEDITBufferID();
afx_msg void OnCHECKAuto();
afx_msg void OnSelchangeCOMBOVoltRange();
afx_msg void OnSelchangeCOMBOTriggerMode();
// afx_msg void OnKillfocusCOMBObAvailableTrig();
afx_msg void OnSelchangeCOMBOReferenceClock();
// afx_msg void OnCHECKbAvailableTrig();
afx_msg void OnChangeEDITTrigLevelVolt();
afx_msg void OnChangeEDITMLength();
afx_msg void OnChangeEDITNLength();
afx_msg void OnCHECKbMasterEn();
afx_msg void OnCHECKbClkOutEn();
afx_msg void OnCHECKbTrigOutEn();
afx_msg void OnSelchangeCOMBOSyncTrigSignal();
afx_msg void OnBUTTONSoftTirg();
afx_msg void OnKillfocusEDITTrigInterval();
afx_msg void OnTimer(UINT_PTR nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEnKillfocusEditMLength();
public:
afx_msg void OnEnKillfocusEditNLength();
afx_msg void OnCheckCh();
afx_msg void OnEnChangeEditTrigcount();
afx_msg void OnEnChangeEditTrigWindow();
public:
afx_msg void OnCbnSelchangeComboClkoutsel();
public:
afx_msg void OnCbnSelchangeComboTrigoutpolarity();
public:
afx_msg void OnEnChangeEditTrigoutwidth();
public:
afx_msg void OnEnKillfocusEditTrigoutwidth();
public:
afx_msg void OnEnKillfocusEditTrigwindow();
public:
afx_msg void OnEnKillfocusEditFreqdivision();
public:
afx_msg void OnEnKillfocusEditFrequency();
public:
CComboBox m_Combo_TimeBaseClock;
public:
afx_msg void OnCbnSelchangeComboTimebaseclock();
public:
CComboBox m_ComBo_SampleMode;
public:
afx_msg void OnCbnSelchangeComboSamplemode();
public:
CComboBox m_Combo_PFISel;
public:
afx_msg void OnCbnSelchangeComboPfisel();
public:
CButton m_Check_bSaveFile;
public:
CEdit m_Edit_FilePath;
public:
afx_msg void OnBnClickedCheckbsavefile();
public:
afx_msg void OnEnKillfocusEditFilepath();
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ParaCfgView_H__6F78B8A1_CC79_11D6_B1D2_CF0B5E784620__INCLUDED_)

View File

@ -0,0 +1,630 @@
// PopupMenu.cpp: implementation of the CPopupMenu class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PopupMenu.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
#ifndef OBM_CHECK
#define OBM_CHECK 32760 // from winuser.h
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPopupMenu::CPopupMenu()
{
crMenuText = GetSysColor(COLOR_MENUTEXT);
crMenuTextSel = GetSysColor(COLOR_HIGHLIGHTTEXT);
cr3dFace = GetSysColor(COLOR_3DFACE);
crMenu = GetSysColor(COLOR_MENU);
crHighlight = GetSysColor(COLOR_HIGHLIGHT);
cr3dHilight = GetSysColor(COLOR_3DHILIGHT);
cr3dShadow = GetSysColor(COLOR_3DSHADOW);
crGrayText = GetSysColor(COLOR_GRAYTEXT);
m_clrBtnFace = GetSysColor(COLOR_BTNFACE);
m_clrBtnHilight = GetSysColor(COLOR_BTNHILIGHT);
m_clrBtnShadow = GetSysColor(COLOR_BTNSHADOW);
iSpawnItem = 0;
pSpawnItem = NULL;
iImageItem = 0;
pImageItem = NULL;
szImage = CSize(20, 20);
hMenuFont = NULL;
NONCLIENTMETRICS ncm;
memset(&ncm, 0, sizeof(ncm));
ncm.cbSize = sizeof(ncm);
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, static_cast<PVOID>(&ncm), 0);
hGuiFont = ::CreateFontIndirect(&ncm.lfMenuFont);
// David 08/04/98 - start - bold font handling
hMenuBoldFont = NULL;
CreateBoldFont();
// David 08/04/98 - end - bold font handling
}
CPopupMenu::~CPopupMenu()
{
if (iSpawnItem > 0)
{
for (int t = 0; t < iSpawnItem; t++)
{
if (pSpawnItem[t])
delete pSpawnItem[t];
}
GlobalFree(static_cast<HGLOBAL>(pSpawnItem));
}
if (iImageItem > 0)
{
GlobalFree(static_cast<HGLOBAL>(pImageItem));
}
if (hMenuFont)
::DeleteObject(static_cast<HGDIOBJ>(hMenuFont));
if (hMenuBoldFont)
::DeleteObject(static_cast<HGDIOBJ>(hMenuBoldFont));
}
void CPopupMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
// CRect rcItem(lpDrawItemStruct->rcItem);
// pDC->FillSolidRect(rcItem, RGB(255,0,0));
if (lpDrawItemStruct->CtlType == ODT_MENU)
{
UINT state = lpDrawItemStruct->itemState;
BOOL bEnab = !(state & ODS_DISABLED);
BOOL bSelect = (state & ODS_SELECTED) ? TRUE : FALSE;
BOOL bChecked = (state & ODS_CHECKED) ? TRUE : FALSE;
// David 08/04/98 - start - bold font handling
BOOL bBold = (state & ODS_DEFAULT) ? TRUE : FALSE;
// David 08/04/98 - end - bold font handling
SpawnItem* pItem = reinterpret_cast<SpawnItem*>(lpDrawItemStruct->itemData);
if (pItem)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CFont* pft;
// David 08/04/98 - start - bold font handling
if (!bBold)
pft = CFont::FromHandle(static_cast<HFONT>(hMenuFont) ? hMenuFont : hGuiFont);
else
pft = CFont::FromHandle(static_cast<HFONT>(hMenuBoldFont) ? hMenuBoldFont : hGuiFont);
// David 08/04/98 - end - bold font handling
CFont* of = pDC->SelectObject(pft);
CRect rc(lpDrawItemStruct->rcItem);
CRect rcImage(rc), rcText(rc);
rcImage.right = rcImage.left + rc.Height();
rcImage.bottom = rc.bottom;
if (pItem->iCmd == -3) // is a separator
{
CPen pnDk(PS_SOLID, 1, cr3dShadow);
CPen pnLt(PS_SOLID, 1, cr3dHilight);
CPen * opn = pDC->SelectObject(&pnDk);
pDC->MoveTo(rc.left + 2, rc.top + 2);
pDC->LineTo(rc.right - 2, rc.top + 2);
pDC->SelectObject(&pnLt);
pDC->MoveTo(rc.left + 2, rc.top + 3);
pDC->LineTo(rc.right - 2, rc.top + 3);
pDC->SelectObject(opn);
}
else if (pItem->iCmd == -4) // is a title item
{
CString cs(pItem->cText), cs1;
CRect rcBdr(rcText);
if (bSelect && bEnab)
{
rcText.top ++;
rcText.left += 2;
}
pDC->FillSolidRect(rcText, crMenu);
pDC->DrawText(cs, rcText, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
if (bSelect && bEnab)
pDC->Draw3dRect(rcBdr, cr3dShadow, cr3dHilight);
}
else
{
rcText.left += rcImage.right + 1;
int obk = pDC->SetBkMode(TRANSPARENT);
COLORREF ocr;
if (bSelect)
{
if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))
pDC->FillSolidRect(rcText, crHighlight);
else
pDC->FillSolidRect(rc, crHighlight);
ocr = pDC->SetTextColor(crMenuTextSel);
}
else
{
if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))
pDC->FillSolidRect(rcText, crMenu);
else
pDC->FillSolidRect(rc/*rcText*/, crMenu);
ocr = pDC->SetTextColor(crMenuText);
}
if (pItem->iImageIdx >= 0)
{
int ay = (rcImage.Height() - szImage.cy) / 2;
int ax = (rcImage.Width() - szImage.cx) / 2;
if (bSelect && bEnab)
pDC->Draw3dRect(rcImage, cr3dHilight, cr3dShadow);
else
{
pDC->Draw3dRect(rcImage, crMenu, crMenu);
}
if (bEnab)
{
ilList.Draw(pDC, pItem->iImageIdx, CPoint(rcImage.left + ax,
rcImage.top +ay), ILD_NORMAL);
}
else
{
HICON hIcon = ilList.ExtractIcon(pItem->iImageIdx);
pDC->DrawState(CPoint(rcImage.left + ax, rcImage.top + ay), szImage,
static_cast<HICON>(hIcon), DST_ICON | DSS_DISABLED,
static_cast<CBrush*>(NULL));
}
}
else
{
/*
if (bChecked)
{
int ay = (rcImage.Height() - szImage.cy) / 2;
int ax = (rcImage.Width() - szImage.cx) / 2;
ilOther.Draw(pDC, 0, CPoint(rcImage.left + ax, rcImage.top + ay - 2), ILD_NORMAL);
}
*/
if (bChecked)
{
CRect rcTemp = rcImage;
rcTemp.DeflateRect(2, 2);
DrawCheckmark(*pDC, rcTemp, bSelect);
}
if (bSelect || lpDrawItemStruct->itemAction == ODA_SELECT)
{
COLORREF colorBG = GetSysColor(bSelect ? COLOR_HIGHLIGHT : COLOR_MENU);
// selected or selection state changed: paint text background
CRect rcBG(lpDrawItemStruct->rcItem); // the whole rectangle
rcBG.left += rcImage.Width(); // do not paint over it!
CBrush brush(colorBG);
CBrush* pOldBrush = pDC->SelectObject(&brush);
pDC->PatBlt(rcBG.left, rcBG.top, rcBG.Width(), rcBG.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
}
}
CString cs(pItem->cText), cs1;
CSize sz;
sz = pDC->GetTextExtent(cs);
int ay1 = (rcText.Height() - sz.cy) / 2;
rcText.top += ay1;
rcText.left += 2;
rcText.right -= 15;
int tf = cs.Find('\t');
if (tf >= 0)
{
cs1 = cs.Right(cs.GetLength() - tf - 1);
cs = cs.Left(tf);
if (!bEnab)
{
if (!bSelect)
{
CRect rcText1(rcText);
rcText1.InflateRect(-1, - 1);
pDC->SetTextColor(cr3dHilight);
pDC->DrawText(cs, rcText1, DT_VCENTER | DT_LEFT);
pDC->DrawText(cs1, rcText1, DT_VCENTER | DT_RIGHT);
pDC->SetTextColor(crGrayText);
pDC->DrawText(cs, rcText, DT_VCENTER | DT_LEFT);
pDC->DrawText(cs1, rcText, DT_VCENTER | DT_RIGHT);
}
else
{
pDC->SetTextColor(crMenu);
pDC->DrawText(cs, rcText, DT_VCENTER | DT_LEFT);
pDC->DrawText(cs1, rcText, DT_VCENTER | DT_RIGHT);
}
}
else
{
pDC->DrawText(cs, rcText, DT_VCENTER | DT_LEFT);
pDC->DrawText(cs1, rcText, DT_VCENTER | DT_RIGHT);
}
}
else
{
if (!bEnab)
{
if (!bSelect)
{
CRect rcText1(rcText);
rcText1.InflateRect(-1, - 1);
pDC->SetTextColor(cr3dHilight);
pDC->DrawText(cs, rcText1, DT_VCENTER | DT_LEFT | DT_EXPANDTABS);
pDC->SetTextColor(crGrayText);
pDC->DrawText(cs, rcText, DT_VCENTER | DT_LEFT | DT_EXPANDTABS);
}
else
{
pDC->SetTextColor(crMenu);
pDC->DrawText(cs, rcText, DT_VCENTER | DT_LEFT | DT_EXPANDTABS);
}
}
else
pDC->DrawText(cs, rcText, DT_VCENTER | DT_LEFT | DT_EXPANDTABS);
}
pDC->SetTextColor(ocr);
pDC->SetBkMode(obk);
}
pDC->SelectObject(of);
}
}
}
void CPopupMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// lpMeasureItemStruct->itemWidth = 200;
// lpMeasureItemStruct->itemHeight = 25;
if (lpMeasureItemStruct->CtlType == ODT_MENU)
{
SpawnItem* pItem = reinterpret_cast<SpawnItem*>(lpMeasureItemStruct->itemData);
if (pItem)
{
if (pItem->iCmd == -3) // is a separator
{
lpMeasureItemStruct->itemWidth = 10;
lpMeasureItemStruct->itemHeight = 6;
}
else
{
CString cs(pItem->cText);
if (!cs.IsEmpty())
{
CClientDC dc(AfxGetMainWnd());
CFont* pft = CFont::FromHandle(hMenuFont ? hMenuFont : hGuiFont);
CFont* of = dc.SelectObject(pft);
CSize osz = dc.GetOutputTabbedTextExtent(cs, 0, NULL);
if (pItem->iCmd == -4)
{
CRect rci(0, 0, 0, 0);
dc.DrawText(cs, rci, DT_CALCRECT | DT_TOP | DT_VCENTER | DT_SINGLELINE);
lpMeasureItemStruct->itemHeight = rci.Height();
lpMeasureItemStruct->itemWidth = rci.Width();
}
else
{
lpMeasureItemStruct->itemHeight = szImage.cy + 5;
if (osz.cy > static_cast<int>(lpMeasureItemStruct->itemHeight))
lpMeasureItemStruct->itemHeight = static_cast<int>(osz.cy);
lpMeasureItemStruct->itemWidth = osz.cx + 2 + 15;
lpMeasureItemStruct->itemWidth += lpMeasureItemStruct->itemHeight > static_cast<UINT>(szImage.cx)
? static_cast<UINT>(lpMeasureItemStruct->itemHeight) : static_cast<UINT>(szImage.cx);
}
dc.SelectObject(of);
}
else
{
lpMeasureItemStruct->itemHeight = szImage.cy + 5;
lpMeasureItemStruct->itemWidth = 100;
}
}
}
}
}
BOOL CPopupMenu::CreateBoldFont()
{
if (hMenuBoldFont)
::DeleteObject(static_cast<HGDIOBJ>(hMenuBoldFont));
LOGFONT lgFont;
::GetObject (hMenuFont ? hMenuFont : hGuiFont, sizeof(lgFont), &lgFont);
lgFont.lfWeight = FW_BOLD;
hMenuBoldFont = CreateFontIndirect(&lgFont);
return !!hMenuBoldFont;
}
BOOL CPopupMenu::AddToolBarResource(UINT resId)
{
// David 08/04/98 - start - put CMenuSpawn in DLL
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(resId), RT_TOOLBAR);
if (!hInst)
return FALSE;
// David 08/04/98 - end - put CMenuSpawn in DLL
HRSRC hRsrc = ::FindResource(/*AfxGetResourceHandle()*/hInst, MAKEINTRESOURCE(resId), RT_TOOLBAR);
if (hRsrc == NULL)
return FALSE;
HGLOBAL hGlb = ::LoadResource(/*AfxGetResourceHandle()*/hInst, hRsrc);
if (hGlb == NULL)
return FALSE;
ToolBarData* pTBData = static_cast<ToolBarData*>(::LockResource(hGlb));
if (pTBData == NULL)
return FALSE;
ASSERT(pTBData->wVersion == 1);
CBitmap bmp;
bmp.LoadBitmap(resId);
int nBmpItems = ilList.Add(&bmp, RGB(192, 192, 192));
bmp.DeleteObject();
WORD* pItem = reinterpret_cast<WORD*>(pTBData + 1);
for (int i = 0; i < pTBData->wItemCount; i++, pItem++)
{
if (*pItem != ID_SEPARATOR)
AddImageItem(nBmpItems++, static_cast<WORD>(*pItem));
}
// ** it seem that Windows doesn't free these resource (from Heitor Tome)
::UnlockResource(hGlb);
::FreeResource(hGlb);
// **
return TRUE;
}
BOOL CPopupMenu::LoadToolBarResource(UINT resId)
{
// 从动态库(.Dll .Exe中寻找资源实例
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(resId), RT_TOOLBAR);
// 如果资源不存在
if (!hInst)
return FALSE;
// 寻找资源句柄
HRSRC hRsrc = ::FindResource(/*AfxGetResourceHandle()*/hInst, MAKEINTRESOURCE(resId), RT_TOOLBAR);
if (hRsrc == NULL)
return FALSE;
// 读入资源,其返回指针
HGLOBAL hGlb = ::LoadResource(/*AfxGetResourceHandle()*/hInst, hRsrc);
if (hGlb == NULL)
return FALSE;
// ToolBarData为自定义。此处是锁定资源对象
ToolBarData* pTBData = static_cast<ToolBarData*>(::LockResource(hGlb));
if (pTBData == NULL)
return FALSE;
ASSERT(pTBData->wVersion == 1);
//
szImage.cx = static_cast<int>(pTBData->wWidth);
szImage.cy = static_cast<int>(pTBData->wHeight);
// 创建位图列表
if (ilList.Create(szImage.cx, szImage.cy, ILC_COLOR4 | ILC_MASK, pTBData->wItemCount, 0) == FALSE)
return FALSE;
// 设置位图的背景色
ilList.SetBkColor(cr3dFace);
// 以上为了初始化位图列表
CBitmap bmp;
// 装载位图资源
bmp.LoadBitmap(resId);
// 往位图列表中加入位图
ilList.Add(&bmp, RGB(0, 192, 192));
bmp.DeleteObject();
WORD* pItem = reinterpret_cast<WORD*>(pTBData + 1);
int nBmpItems = 0;
for (int i = 0; i < pTBData->wItemCount; i++, pItem++)
{
if (*pItem != ID_SEPARATOR)
AddImageItem(nBmpItems++, static_cast<WORD>(*pItem));
}
// ** it seem that Windows doesn't free these resource (from Heitor Tome)
::UnlockResource(hGlb);
::FreeResource(hGlb);
// **
return TRUE;
}
void CPopupMenu::AddImageItem(const int idx, WORD cmd)
{
if (iImageItem == 0)
pImageItem = static_cast<ImageItem*>(GlobalAlloc(GPTR, sizeof(ImageItem)));
else
pImageItem = static_cast<ImageItem*>(GlobalReAlloc(static_cast<HGLOBAL>(pImageItem),
sizeof(ImageItem) * (iImageItem + 1), GMEM_MOVEABLE | GMEM_ZEROINIT));
ASSERT(pImageItem);
pImageItem[iImageItem].iCmd = static_cast<int>(cmd);
pImageItem[iImageItem].iImageIdx = idx;
iImageItem ++;
}
void CPopupMenu::RemapMenu(CMenu* pMenu)
{
static int iRecurse = 0;
iRecurse ++;
ASSERT(pMenu);
int nItem = pMenu->GetMenuItemCount();
while ((--nItem) >= 0)
{
UINT itemId = pMenu->GetMenuItemID(nItem);
if (itemId == static_cast<UINT>(-1))
{
CMenu* pops = pMenu->GetSubMenu(nItem);
if (pops)
RemapMenu(pops);
if (iRecurse > 0)
{
CString cs;
pMenu->GetMenuString(nItem, cs, MF_BYPOSITION);
if (cs != "")
{
SpawnItem* sp = AddSpawnItem(cs, (iRecurse == 1) ? -4 : -2);
pMenu->ModifyMenu(nItem, MF_BYPOSITION | MF_OWNERDRAW,
static_cast<UINT>(-1), reinterpret_cast<LPCTSTR>(sp));
}
}
}
else
{
if (itemId != 0)
{
UINT oldState = pMenu->GetMenuState(nItem, MF_BYPOSITION);
if (!(oldState & MF_OWNERDRAW) && !(oldState & MF_BITMAP))
{
ASSERT(oldState != (UINT) - 1);
CString cs;
pMenu->GetMenuString(nItem, cs, MF_BYPOSITION);
SpawnItem* sp = AddSpawnItem(cs, itemId);
pMenu->ModifyMenu(nItem, MF_BYPOSITION | MF_OWNERDRAW | oldState,
static_cast<LPARAM>(itemId), reinterpret_cast<LPCTSTR>(sp));
}
}
else
{
UINT oldState = pMenu->GetMenuState(nItem, MF_BYPOSITION);
if (!(oldState & MF_OWNERDRAW) && !(oldState & MF_BITMAP))
{
ASSERT(oldState != static_cast<UINT>(-1));
SpawnItem* sp = AddSpawnItem(_T("--"), -3);
pMenu->ModifyMenu(nItem, MF_BYPOSITION | MF_OWNERDRAW | oldState,
static_cast<LPARAM>(itemId), reinterpret_cast<LPCTSTR>(sp));
}
}
}
}
iRecurse --;
}
CPopupMenu::SpawnItem * CPopupMenu::AddSpawnItem(const TCHAR* txt, const int cmd)
{
if (iSpawnItem == 0)
pSpawnItem = static_cast<SpawnItem**>(GlobalAlloc(GPTR, sizeof(SpawnItem)));
else
pSpawnItem = static_cast<SpawnItem**>(GlobalReAlloc(static_cast<HGLOBAL>(pSpawnItem),
sizeof(SpawnItem) * (iSpawnItem + 1), GMEM_MOVEABLE | GMEM_ZEROINIT));
ASSERT(pSpawnItem);
SpawnItem* p = new SpawnItem;
ASSERT(p);
pSpawnItem[iSpawnItem] = p;
_tcscpy(p->cText, txt);
p->iCmd = cmd;
if (cmd >= 0)
p->iImageIdx = FindImageItem(cmd);
else p->iImageIdx = cmd;
iSpawnItem++;
return p;
}
int CPopupMenu::FindImageItem(const int cmd)
{
for (int t = 0; t < iImageItem; t++)
{
if (pImageItem[t].iCmd == cmd)
return pImageItem[t].iImageIdx;
}
return -1;
}
void CPopupMenu::EnableMenuItems(CMenu* pMenu, CWnd* pParent)
{
ASSERT(pMenu);
ASSERT(pParent);
int nItem = pMenu->GetMenuItemCount();
CCmdUI state;
state.m_pMenu = pMenu;
state.m_nIndex = nItem - 1;
state.m_nIndexMax = nItem;
while ((--nItem) >= 0)
{
UINT itemId = pMenu->GetMenuItemID(nItem);
if (itemId == static_cast<UINT>(-1))
{
CMenu* pops = pMenu->GetSubMenu(nItem);
if (pops)
EnableMenuItems(pops, pParent);
}
else
{
if (itemId != 0)
{
state.m_nID = itemId;
pParent->OnCmdMsg(itemId, CN_UPDATE_COMMAND_UI, &state, NULL);
state.DoUpdate(pParent, TRUE);
}
}
state.m_nIndex = nItem - 1;
}
}
BOOL CPopupMenu::DrawCheckmark(CDC& dc, const CRect& rc, BOOL bSelected)
{
// Use Windows standard
HBITMAP hbmCheck = ::LoadBitmap(NULL, reinterpret_cast<LPCTSTR>(OBM_CHECK));
// Center bitmap in distination rectangle
BITMAP bm;
::GetObject(hbmCheck, sizeof(bm), &bm);
int cx = bm.bmWidth;
int cy = bm.bmHeight;
CRect rcDest = rc;
CPoint ptSrc = -CPoint((rc.Width() - cx)/2, (rc.Height() - cy)/2);
// Select checkmark into memory DC
CDC memdc;
memdc.CreateCompatibleDC(&dc);
HBITMAP hOldBM = reinterpret_cast<HBITMAP>(::SelectObject(memdc, hbmCheck));
// Set background color based on selected state
COLORREF colorOld = dc.SetBkColor(GetSysColor(bSelected ? COLOR_MENU : COLOR_3DLIGHT));
dc.BitBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
&memdc, ptSrc.x, ptSrc.y, SRCCOPY);
dc.SetBkColor(colorOld);
::SelectObject(memdc, hOldBM); // restore
// draw pushed-in hilight.
dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT);
return TRUE;
}

View File

@ -0,0 +1,75 @@
// PopupMenu.h: interface for the CPopupMenu class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_POPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_)
#define AFX_POPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CPopupMenu : public CMenu
{
public:
struct ToolBarData
{
// struct for toolbar resource; guess you already know it ;)
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
};
struct SpawnItem
{
int iImageIdx;
int iCmd;
TCHAR cText[128];
};
struct ImageItem
{
int iImageIdx;
int iCmd;
};
CPopupMenu();
virtual ~CPopupMenu();
HFONT hMenuBoldFont;
BOOL CreateBoldFont();
HFONT hMenuFont, hGuiFont;
CSize szImage;
int FindImageItem(const int cmd);
SpawnItem* AddSpawnItem(const TCHAR* txt, const int cmd);
void AddImageItem(const int idx, WORD cmd);
void RemapMenu(CMenu* pMenu);
CImageList ilList;
CImageList ilOther;
COLORREF crMenuText, crMenuTextSel;
COLORREF cr3dFace, crMenu, crHighlight, cr3dHilight, cr3dShadow, crGrayText;
COLORREF m_clrBtnFace, m_clrBtnHilight, m_clrBtnShadow;
int iSpawnItem;
SpawnItem** pSpawnItem;
int iImageItem;
ImageItem* pImageItem;
BOOL LoadToolBarResource(UINT resId);
BOOL AddToolBarResource(UINT resId);
void EnableMenuItems(CMenu* pMenu, CWnd* pParent);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
private:
BOOL DrawCheckmark(CDC& dc, const CRect& rc, BOOL bSelected);
};
#endif // !defined(AFX_POPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_)

View File

@ -0,0 +1,215 @@
// QSortData.cpp: implementation of the CQSortData class.
//////////////////////////////////////////////////////////////////////
//*******************************************************************
//
// QSortData类的使用说明
// 能够对SHORT指针指向的一组数据先进行指定长度的排序,求出中间数(出现概率最大的数)
// 原型CQSortData::Sort(SHORT *data, int left, int right)
//
//*******************************************************************
#include "stdafx.h"
#include "QSortData.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CQSortData::CQSortData()
{
m_SortDir = 0; // 升序
m_DataMiddle.Value = 0;
m_DataMiddle.CountNum = 0;
m_DataTypes = 1;
m_bNewData = FALSE;
}
CQSortData::~CQSortData()
{
}
int CQSortData::GetMaxData() // 取最大数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataMax;
}
int CQSortData::GetMinData() // 取最小数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataMin;
}
int CQSortData::GetMidData() // 取中间数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataMiddle.Value;
}
int CQSortData::GetMidDataCount()
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataMiddle.CountNum;
}
int CQSortData::GetDataTypes() // 出现的数据种数
{
if(m_bNewData)
{
ProcessData();
m_bNewData = FALSE;
}
return m_DataTypes;
}
int CQSortData::GetSortDir() // 取得排序方向(升序或降序)
{
return m_SortDir;
}
void CQSortData::SetSortDir(int nDir) // 设置排序方向(缺省为 =0升序)
{
m_SortDir = nDir;
}
//#################################################################
// 对data指针指向的缓冲区从下标为left到right的元素进行 升序排序
void CQSortData::SortAsc(LONG *data, int left, int right)
{
register int i,j;
LONG m,t;
i=left;j=right;
m=data[(int)(left+right)/2];
do{
while(data[i]<m && i<right)
i++;
while(m<data[j] && j>left)
j--;
if(i <= j) { //交换i, j 的值
t = data[i];
data[i] = data[j];
data[j] = t;
i++;j--;
}
}while(i<=j);
if(left<j) SortAsc(data,left,j);
if(i<right) SortAsc(data,i,right);
}
//#################################################################
// 对data指针指向的缓冲区从下标为left到right的元素进行 降序排序
void CQSortData::SortDsc(LONG *data, int left, int right)
{
register int i,j;
LONG m,t;
i=left;j=right;
m=data[(int)(left+right)/2];
do{
while(data[i]>m && i<right)
i++;
while(m>data[j] && j>left)
j--;
if(i<=j) {
t=data[i];
data[i]=data[j];
data[j]=t;
i++;j--;
}
}while(i<=j);
if(left<j) SortDsc(data,left,j);
if(i<right) SortDsc(data,i,right);
}
//############################################################
//
void CQSortData::Sort(LONG *data, int left, int right)
{
if(!m_SortDir)
{
SortAsc(data, left, right); // 升序排序(省缺)
m_DataMin = data[left];
m_DataMax = data[right];
}
else
{
SortDsc(data, left, right); //降序排序
m_DataMin = data[right];
m_DataMax = data[left];
}
m_bNewData = TRUE;
nBufferSize = right - left;
Buffer = data; // 把指针data的值传递给Buffer指针
}
//#################################################################
// 从Result数组中查找中间数出现频率最大的数
void CQSortData::ProcessData(void)
{
Result = new SORT_COUNT[nBufferSize]; // 动态分配合适大小的内存
Result[0].Value = Buffer[0];
Result[0].CountNum = 0;
m_DataMiddle.CountNum = 0;
m_DataMiddle.Value = Result[0].Value;
int k = 0;
for (int i=0; i<nBufferSize; i++)
{
if (Buffer[i] == Result[k].Value)
{
Result[k].CountNum++; // 统计第个数出现的次数, 保存在Result[]中
}
else
{
if(Result[k].CountNum > m_DataMiddle.CountNum )
{
m_DataMiddle.CountNum = Result[k].CountNum ;
m_DataMiddle.Value = Result[k].Value ;
}
k++;
Result[k].Value = Buffer[i];
Result[k].CountNum = 1;
m_DataTypes++;
}
}
if(Result[k].CountNum > m_DataMiddle.CountNum )
{
m_DataMiddle.CountNum = Result[k].CountNum ;
m_DataMiddle.Value = Result[k].Value ;
}
//如果没有中间数
if(m_DataMiddle.CountNum == 1)
{
AfxMessageBox(_T("没有中间数"));
m_DataMiddle.CountNum = 0;
}
delete [] Result; // 释放动态分配的内存
Result = NULL;
}

View File

@ -0,0 +1,50 @@
// QSortData.h: interface for the CQSortData class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_QSORTDATA_H__05802C51_F215_4B0C_A99D_F1D37D869F96__INCLUDED_)
#define AFX_QSORTDATA_H__05802C51_F215_4B0C_A99D_F1D37D869F96__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define MAX_BUFFER 8192 //最大的排序个数
typedef struct _SORTCOUNT{
int Value;
int CountNum;
}SORT_COUNT, *pSORT_COUNT;
class CQSortData
{
public:
CQSortData();
public:
void SetSortDir(int nDir = 0);
int GetSortDir();
void Sort(LONG *data,int left,int right);
int GetDataTypes();
int GetMidDataCount();
int GetMidData();
int GetMinData();
int GetMaxData();
virtual ~CQSortData();
private:
BOOL m_bNewData;
int m_DataMax; // 最大数
int m_DataMin; // 最小数
int m_DataTypes; // 数据种数
int m_SortDir; // 排序方向(升序或降序)
int nBufferSize; // 需动态分配的内存大小
SORT_COUNT m_DataMiddle; // 中间数
pSORT_COUNT Result; // _SORTCOUNT结构体指针, 指向分析后的数据
LONG * Buffer;
private:
void SortAsc(LONG *data, int left, int right); // 升序排列
void SortDsc(LONG *data, int left, int right); // 降序排列
void ProcessData(void);
};
#endif // !defined(AFX_QSORTDATA_H__05802C51_F215_4B0C_A99D_F1D37D869F96__INCLUDED_)

View File

@ -0,0 +1,67 @@
========================================================================
工程功能说明
========================================================================
1、免编程序对于只想使用采样结果数据的客户或用MatLab、Excel、Access等分
析及数据库软件的高级用户,可以借助本高级程序的帮助,采样存盘,再通过安装
光盘上相应的磁盘数据转换软件将其转换为需要的文件格式,即在不需要编写任何
代码的情况下实现您的这一迫切需求。
2、强大技术支持该程序集MDI多文档多视图、基于多线程多功能模块于一身向您
清楚地展示了怎样更好的实现数据采集的连续性、高速性、可靠性。而它所具备的
这些功能该程序完全以源代码的方式向您展示,向您全部开发。
3、功能强大其代码的复杂度就必然要增加很多如果您不需要这么多功能而只是
想用我公司的驱动程序接口以最快的速度编写自己的采集及控制程序,那么请您参
考相应功能的简易程序它通常只有一个简单的cpp文件只简单演示驱动调用的
完整流程,不包括其他如窗体操作、文档管理等复杂问题。
4、工程分AD、历史数据回放两个模块
5、AD部分:窗体左边以数字方式显示电压值,右边以图形方式显示波形
6、AD电压量程分多档在此须注意在选择双极性电压量程时采集的AD数据值在
换算成电压值时AD原码值的高位需要求反具体可以参考ADDigitView.cpp中的
函数CADDigitView::ADDigit(CDC *pDC)
========================================================================
工程文件说明
========================================================================
ACTS1011.h 驱动接口头文件(用户开发自已的应用程序时,将此文件复制到您的工程中,且此文件不要改动)
ACTS1011_32.lib 驱动接口导入库文件(用户开发自已的应用程序时,将此文件复制到您的工程中)32位用
ACTS1011_64.lib 驱动接口导入库文件(用户开发自已的应用程序时,将此文件复制到您的工程中)64位用
ADThread.cpp 使用子线程进行AD采样的源代码演示
HistDataDoc.cpp HistDataFrm.cpp HistDataView.cpp AD历史数据回放的源代码演示
DIOView.cpp 演示了如何操作开关量输入输出过程
DAView.cpp 演示了如何操作模拟量输出过程
stdafx.h 包含了用户自定义的各种全局变量,自定义变量类型等信息
========================================================================
工程完善记录
========================================================================
2019/04/12 V6.00.00 新增此演示程序 LYB
========================================================================
工程中主要类关系
========================================================================
CWinApp
CSysApp
CMDIFrameWnd
CMDITabFrameWnd
CMainFrame
CMDIChildWnd
CADFrm
CDocument
CADDoc
CScrollView
CADDigitView
CADWaveView
CFormView
CADParaCfgView
CADStatusView
CWnd
COScopeCtrl

View File

@ -0,0 +1,69 @@
========================================================================
工程功能说明
========================================================================
1、免编程序对于只想使用采样结果数据的客户或用MatLab、Excel、Access等分
析及数据库软件的高级用户,可以借助本高级程序的帮助,采样存盘,再通过安装
光盘上相应的磁盘数据转换软件将其转换为需要的文件格式,即在不需要编写任何
代码的情况下实现您的这一迫切需求。
2、强大技术支持该程序集MDI多文档多视图、基于多线程多功能模块于一身向您
清楚地展示了怎样更好的实现数据采集的连续性、高速性、可靠性。而它所具备的
这些功能该程序完全以源代码的方式向您展示,向您全部开发。
3、功能强大其代码的复杂度就必然要增加很多如果您不需要这么多功能而只是
想用我公司的驱动程序接口以最快的速度编写自己的采集及控制程序,那么请您参
考相应功能的简易程序它通常只有一个简单的cpp文件只简单演示驱动调用的
完整流程,不包括其他如窗体操作、文档管理等复杂问题。
4、工程分AD、历史数据回放两个模块
5、AD部分:窗体左边以数字方式显示电压值,右边以图形方式显示波形
6、AD电压量程分多档在此须注意在选择双极性电压量程时采集的AD数据值在
换算成电压值时AD原码值的高位需要求反具体可以参考ADDigitView.cpp中的
函数CADDigitView::ADDigit(CDC *pDC)
========================================================================
工程文件说明
========================================================================
ACTS1011.h 驱动接口头文件(用户开发自已的应用程序时,将此文件复制到您的工程中,且此文件不要改动)
ACTS1011_32.lib 驱动接口导入库文件(用户开发自已的应用程序时,将此文件复制到您的工程中)32位用
ACTS1011_64.lib 驱动接口导入库文件(用户开发自已的应用程序时,将此文件复制到您的工程中)64位用
ADThread.cpp 使用子线程进行AD采样的源代码演示
HistDataDoc.cpp HistDataFrm.cpp HistDataView.cpp AD历史数据回放的源代码演示
DIOView.cpp 演示了如何操作开关量输入输出过程
DAView.cpp 演示了如何操作模拟量输出过程
stdafx.h 包含了用户自定义的各种全局变量,自定义变量类型等信息
========================================================================
工程完善记录
========================================================================
2017/03/20 V6.00.00 新增此演示程序 LYB
2018/01/19 V6.00.01 修改此演示程序 LYB
2018/03/22 V6.00.02 修改此演示程序 LYB
========================================================================
工程中主要类关系
========================================================================
CWinApp
CSysApp
CMDIFrameWnd
CMDITabFrameWnd
CMainFrame
CMDIChildWnd
CADFrm
CDocument
CADDoc
CScrollView
CADDigitView
CADWaveView
CFormView
CADParaCfgView
CADStatusView
CWnd
COScopeCtrl

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

View File

@ -0,0 +1,13 @@
//
// DLL.RC2 - resources Microsoft Visual C++ does not edit directly
//
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// Add manually edited resources here...
/////////////////////////////////////////////////////////////////////////////

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

View File

@ -0,0 +1,13 @@
//
// SYS.RC2 - resources Microsoft Visual C++ does not edit directly
//
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// Add manually edited resources here...
/////////////////////////////////////////////////////////////////////////////

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

View File

@ -0,0 +1,44 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__D485DEFF_85AB_11D1_B878_A68EB300DD63__INCLUDED_)
#define AFX_STDAFX_H__D485DEFF_85AB_11D1_B878_A68EB300DD63__INCLUDED_
#pragma warning(disable:4996)
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxcview.h>
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#include <afxmt.h>
/////////////////////////////////
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
/////////////////////////////////
// Óû§Ìî¼Ó²¿·Ö
#include "UserDef.h"
#define WM_SHOWWAVE WM_USER+100
#define WM_SHOWDIGIT WM_USER+101
#define WM_SET_CTRL_FOCUS WM_USER+107
#include "ADHistDoc.h"
#include "ADHistWaveView.h"
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__D485DEFF_85AB_11D1_B878_A68EB300DD63__INCLUDED_)

View File

@ -0,0 +1,8 @@
// stdafx.cpp : source file that includes just the standard includes
// Sys.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
#pragma comment(lib,"winmm") // ¶àýÌå¿â¼ÓÈë±àÒë¶ÓÁÐ

View File

@ -0,0 +1,814 @@
// Sys.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "Sys.h"
#include "MainFrm.h"
#include "ADFrm.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#include "ADWaveView.h"
#include "ADHistFrm.h"
#include "ADHistDoc.h"
#include "ADHistDigitView.h"
#include "ADCalibration.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
#include "ADStatusView.h"
#include "ParaCfgView.h"
extern CADStatusView* pADStatusView;
extern CParaCfgView* pParaCfgView;
// CSysApp
BEGIN_MESSAGE_MAP(CSysApp, CWinApp)
//{{AFX_MSG_MAP(CSysApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_UPDATE_COMMAND_UI(IDM_CloseFile, OnUpdateCloseFile)
ON_UPDATE_COMMAND_UI(IDM_DataFileNew, OnUpdateDataFileNew)
ON_COMMAND(IDM_CloseFile, OnCloseFile)
ON_COMMAND(IDM_DataFileNew, OnDataFileNew)
ON_COMMAND(IDM_StartDeviceAD, OnStartDeviceAD)
ON_COMMAND(IDM_StopDeviceAD, OnStopDeviceAD)
ON_UPDATE_COMMAND_UI(IDM_StopDeviceAD, OnUpdateStopDeviceAD)
ON_COMMAND(IDM_Open_AD, OnOpenAD)
ON_UPDATE_COMMAND_UI(IDM_Open_AD, OnUpdateOpenAD)
ON_COMMAND(IDM_HistoryData, OnHistoryData)
ON_UPDATE_COMMAND_UI(IDM_HistoryData, OnUpdateHistoryData)
ON_UPDATE_COMMAND_UI(IDM_Open_DA, OnUpdateOpenDA)
ON_UPDATE_COMMAND_UI(IDM_StartDeviceAD, OnUpdateStartDeviceAD)
ON_UPDATE_COMMAND_UI(IDM_MDataSave, OnUpdateDataSave)
ON_UPDATE_COMMAND_UI(IDM_MDigitalShow, OnUpdateDigitalShow)
ON_UPDATE_COMMAND_UI(IDM_MGraphicShow, OnUpdateGraphicShow)
ON_COMMAND(IDM_MDataSave, OnMDataSave)
ON_COMMAND(IDM_MDigitalShow, OnMDigitalShow)
ON_COMMAND(IDM_MGraphicShow, OnMGraphicShow)
ON_COMMAND(IDM_ListDeviceDlg, OnListDeviceDlg)
ON_COMMAND(IDM_ADCalibration, OnADCalibration)
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSysApp construction
CSysApp::CSysApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_bCreateADFrm = FALSE;
m_bCreateDAFrm = FALSE;
m_ADFrame = NULL;
m_bDeviceCount = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CSysApp object
CSysApp theApp;
ULONGLONG gl_ReadSizeWords; // 读入的数据长度
ULONGLONG gl_DDR2Lenth;
ULONGLONG gl_pulDDR2Length;
/////////////////////////////////////////////////////////////////////////////
// CSysApp initialization
BOOL CSysApp::InitInstance()
{
for(int i=0; i<MAX_SEGMENT; i++)
{
ADBuffer[i] = (USHORT*)ACTS1000_AllocateBuffer(MAX_RAM_SIZE*sizeof(USHORT));
}
ADDrawBuffer = (USHORT*)ACTS1000_AllocateBuffer(MAX_RAM_SIZE*sizeof(USHORT));
//CString strMutex;
TCHAR szMutex[256];
BOOL bCreate=FALSE;
//HANDLE hDevice;
//m_hDevice = INVALID_HANDLE_VALUE; // 在该应用程序使用的全局设备对象未被创建时,应置初值,视为设备无效
m_CurrentDeviceID=0; // 指定当前设备的ID标示符
/////
int DeviceID = 0;
while (TRUE)
{
swprintf_s(szMutex, L"ACTS1000-%d", DeviceID);
// 创建互斥对象
m_hMutex=::CreateMutex(NULL, NULL, szMutex); // m_pszExeName为本程序的执行名
if (GetLastError() == ERROR_ALREADY_EXISTS) // 第二次创建应用程序
{
DeviceID++;
continue; // 如果已经创建,则继续下一个设备的应用程序创建
}
else
{
m_CurrentDeviceID = DeviceID;
m_hDevice = ACTS1000_CreateDevice(m_CurrentDeviceID);
if (m_hDevice == INVALID_HANDLE_VALUE)
{
AfxMessageBox(L"对不起,您的所有设备已被相应程序管理,您不能再创建新实例,或设备不存在", MB_ICONWARNING, 0);
}
break;
}
}
/*int DeviceCount;
hDevice = ACTS1000_CreateDevice(0); // 创建设备对象保存在App中可供其他任何子窗体或子功能使用
if(hDevice!=INVALID_HANDLE_VALUE) // 如果设备句柄有效
{
DeviceCount = ACTS1000_GetDeviceCount(hDevice);
ACTS1000_ReleaseDevice(hDevice);
}
else
{
DeviceCount = 0; // 如果没有创建成功则认为设备数量为0
}
for(int i=0; i<DeviceCount; i++)
{
strMutex.Format(_T("ACTS1000-%d"), i);
// 创建互斥对象
m_hMutex=::CreateMutex(NULL, NULL, strMutex); // m_pszExeName为本程序的执行名
if(GetLastError()==ERROR_ALREADY_EXISTS) // 第二次创建应用程序
{
bCreate=FALSE;
continue; // 如果已经创建,则继续下一个设备的应用程序创建
}
else
{
bCreate=TRUE;
m_CurrentDeviceID=i;
break;
}
}
if(DeviceCount!=0)
{
if(bCreate==FALSE) // 当该实例不能被创建时
{
AfxMessageBox(_T("对不起,您的所有设备已被相应程序管理,您不能再创建新实例..."),MB_ICONWARNING,0);
return FALSE;
}
m_hDevice = ACTS1000_CreateDevice(m_CurrentDeviceID);
}
*/
ACTS1000_GetMainInfo(m_hDevice,&gl_ADMainInfo); // DDR2的长度(单位MB)
gl_pulDDR2Length = gl_ADMainInfo.nDepthOfMemory;
gl_DDR2Lenth = gl_pulDDR2Length*1024*1024;
m_nRevisionID = 0;
if(!ACTS1000_GetBusInfo(m_hDevice, NULL, NULL, NULL, &m_nRevisionID))
{
//AfxMessageBox("获得设备总线信息失败");
//return;
}
ACTS1000_GetSupportRangeInfo(m_hDevice, &m_nSampRangeCount,m_nSampRangeVal);
/*ULONG nInx = 0;
for (int i=0; i<m_nSampRangeCount; i++)
{
m_nSampRangeVal[i]= i;
}*/
gl_wMaxLSB = (WORD)(gl_ADMainInfo.nSampCodeCount - 1);
gl_fLsbCount = (float)gl_ADMainInfo.nSampCodeCount;
gl_lLsbHalf = (WORD)(gl_ADMainInfo.nSampCodeCount/2);
///////////////////////////////////////////////
// 判断用户的显示器模式是否为1024*768
int Len=GetSystemMetrics(SM_CXSCREEN); // 取得屏幕宽度
if(Len<1024) // 如果屏幕宽度大小1024
{
if(AfxMessageBox(_T("请最好使用1024*768或以上的显示器分辨率继续吗"),MB_ICONWARNING|MB_YESNO,0)==IDNO)
{
ExitInstance();
return FALSE;
}
}
///////////////////////////////////////////////
// 应用程序正常创建代码:
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(16); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
// 添加AD采集模板
pADTemplate = new CMultiDocTemplate(
IDR_AD,
RUNTIME_CLASS(CADDoc),
RUNTIME_CLASS(CADFrame), // custom MDI child frame
RUNTIME_CLASS(CADDigitView));
AddDocTemplate(pADTemplate);
// 添加历史数据回放模板
pHistDataTemplate = new CMultiDocTemplate(
IDR_HistoryData,
RUNTIME_CLASS(CADHistDoc),
RUNTIME_CLASS(CADHistFrm), // custom MDI child frame
RUNTIME_CLASS(CADHistDigitView));
AddDocTemplate(pHistDataTemplate);
// Enable DDE Execute open
// 让WINDOWS登记该程序的缺省数据文件名扩展名
EnableShellOpen();
RegisterShellFileTypes(TRUE);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
//if (!ProcessShellCommand(cmdInfo))
// return FALSE;
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
// The main window has been initialized, so show and update it.
// pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->ShowWindow(SW_SHOWMAXIMIZED); // 使主窗口最大化
pMainFrame->UpdateWindow();
// Enable drag/drop open
m_pMainWnd->DragAcceptFiles(); // 支持拖放功能
::SetProp(m_pMainWnd->GetSafeHwnd(), m_pszExeName, (HANDLE)1);
LONG nPhyID = 0;
if (m_hDevice != INVALID_HANDLE_VALUE)
{
ACTS1000_GetDeviceCurrentID(m_hDevice, NULL, &nPhyID);
}
CString MainFrmName; TCHAR str[100];
switch (gl_ADMainInfo.nDeviceType>>16)
{
case PXIE_BUS:
if (m_nRevisionID >= PCIE8502D_RID && m_nRevisionID <0xFF)
{
_stprintf(str, _T("ACTS1000-PXIE%04X(%02X)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_nRevisionID, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}
else if (m_nRevisionID == 0)
_stprintf(str, _T("ACTS1000-PXIE%04X-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_CurrentDeviceID, nPhyID, gl_pulDDR2Length);
else
_stprintf(str, _T("ACTS1000-PXIE%04X(%C)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF,'A'+ m_nRevisionID-1, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
/*if (m_nRevisionID >= PCIE8502D_RID && m_nRevisionID <0xFF)
{
_stprintf(str, _T("ACTS1000-PXIE%04X(%02X)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_nRevisionID, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}
else if (m_nRevisionID == 0x01)
{
_stprintf(str, _T("ACTS1000-PXIE%04X(A)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}
else
{
_stprintf(str, _T("ACTS1000-PXIE%04X-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_CurrentDeviceID, nPhyID, gl_pulDDR2Length);
}*/
break;
case PCIE_BUS:
if (m_nRevisionID >= PCIE8502D_RID && m_nRevisionID <0xFF)
{
_stprintf(str, _T("ACTS1000-PCIE%04X(%02X)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_nRevisionID, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}
else if (m_nRevisionID == 0)
_stprintf(str, _T("ACTS1000-PCIE%04X-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_CurrentDeviceID, nPhyID, gl_pulDDR2Length);
else
_stprintf(str, _T("ACTS1000-PCIE%04X(%C)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF,'A'+ m_nRevisionID-1, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
/*if (m_nRevisionID >= PCIE8502D_RID && m_nRevisionID <0xFF)
{
_stprintf(str, _T("ACTS1000-PCIE%04X(%02X)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_nRevisionID, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}
else if (m_nRevisionID == 0x01)
{
_stprintf(str, _T("ACTS1000-PCIE%04X(A)-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}
else
{
_stprintf(str, _T("ACTS1000-PCIE%04X-%d-%d[%dM] "), gl_ADMainInfo.nDeviceType&0xFFFF, m_CurrentDeviceID,nPhyID, gl_pulDDR2Length);
}*/
break;
default:
_stprintf(str, _T("ACTS1000-%04X-%d-[%dM] "), gl_ADMainInfo.nDeviceType, m_CurrentDeviceID,gl_pulDDR2Length);
}
MainFrmName = pMainFrame->GetTitle();
MainFrmName = str+MainFrmName;
pMainFrame->SetTitle(MainFrmName);
OnOpenAD(); // 打开AD设备
m_ADFrame->BringWindowToTop(); // 将AD模板置于屏幕顶端
// 取得操作系统版本
DWORD dwVersion = GetVersion();
// Get the Windows version.
DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
// Get the build number.
if ((dwVersion < 0x80000000) || (dwWindowsMajorVersion < 4)) // Windows NT
gl_nSampleMode = DMA_MODE; // DMA方式
else // Windows Me/98/95
gl_nSampleMode = PRO_MODE; // 查询方式
gl_nSampleMode = PRO_MODE; // 查询方式
// CG: This line inserted by 'Tip of the Day' component.
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonSet();
public:
virtual BOOL OnInitDialog();
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_Set, &CAboutDlg::OnBnClickedButtonSet)
END_MESSAGE_MAP()
// App command to run the dialog
void CSysApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CSysApp message handlers
void CSysApp::OnUpdateOpenAD(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(this->m_bCreateADFrm==FALSE?1:0);
}
void CSysApp::OnOpenAD(void)
{
if (m_ADFrame != NULL)
{
m_ADFrame->BringWindowToTop();
return;
}
BeginWaitCursor(); // 开始漏斗鼠标
CDocument* pDoc;
pDoc=pADTemplate->CreateNewDocument(); // 创建新文档
m_pADDoc=(CADDoc*)pDoc; // 保存文档对象
// 创建该文档对象的子帧窗口
m_ADFrame=(CADFrame*)pADTemplate->CreateNewFrame(pDoc, NULL);
// 设置默认的文档标题
// 创建文档实例
// 初始化FRAME子帧窗口且触发FRAME的OnUpdate函数
pADTemplate->InitialUpdateFrame(m_ADFrame, pDoc);
pDoc->SetTitle(_T("AD数采测试"));
if(pADStatusView != NULL)
{
pDoc->AddView ((CView*)pADStatusView);
}
if(pParaCfgView != NULL)
{
pDoc->AddView((CView*)pParaCfgView);
}
EndWaitCursor(); // 停止漏斗鼠标
}
void CSysApp::OnHistoryData()
{
// TODO: Add your command handler code here
CString strNewFileName;
// 弹出文件对话框
if (!(DoPromptFileName(strNewFileName, IDS_ProccessHistoryData,
OFN_HIDEREADONLY , TRUE, NULL))) // OFN_CREATEPROMPT:当文件不存在时,是否要求新建
return;
// CFile file;
// CFileStatus status;
// if (!file.GetStatus(strNewFileName, status))
// {
// strNewFileName=strNewFileName+" 不存在!";
// AfxMessageBox(strNewFileName,MB_ICONSTOP, 0);
// return; // 如果文件不存
// }
CFile File;
FILE_HEADER m_Header;
//File.Open(strNewFileName, GENERIC_READ);
if (!File.Open(strNewFileName, GENERIC_READ))
{
AfxMessageBox(L"打开文件失败");
return ;
}
File.Seek(0,CFile::begin);
int a =File.Read((WORD*)&m_Header,sizeof(m_Header)); // 文件信息由HistDigitView类将其置在HistDataFrm的对话框条上OnInitialUpdate
File.Close();
if (a == 0)
{
AfxMessageBox(L"文件大小为0");
return;
}
CADHistDoc* pDoc;
BeginWaitCursor(); // 开始漏斗鼠标
pDoc=(CADHistDoc*)pHistDataTemplate->OpenDocumentFile(strNewFileName); // 先传递文件名到pDoc的消息函数OnOpenDocument
EndWaitCursor(); // 停止漏斗鼠标
}
void CSysApp::OnUpdateHistoryData(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CSysApp::OnUpdateDataFileNew(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable((!gl_bDeviceADRun)&&m_bFirstCreateDeviceFile);
}
void CSysApp::OnCloseFile()
{
// TODO: Add your command handler code here
m_pADDoc->OnCloseFile();
}
void CSysApp::OnDataFileNew()
{
// TODO: Add your command handler code here
m_pADDoc->OnDataFileNew();
}
void CSysApp::OnUpdateOpenDA(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CSysApp::OnStartDeviceAD()
{
// TODO: Add your command handler code here
m_pADDoc->StartDeviceAD();
}
void CSysApp::OnUpdateStartDeviceAD(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(gl_bDeviceADRun==FALSE?1:0);
}
void CSysApp::OnStopDeviceAD()
{
// TODO: Add your command handler code here
m_pADDoc->StopDeviceAD();
}
void CSysApp::OnUpdateStopDeviceAD(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(gl_bDeviceADRun==TRUE?1:0);
}
void CSysApp::OnUpdateCloseFile(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio (FALSE);
if((nProcessMode == SAVE_MODE) && (bCreateDevice))
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(!m_bCloseFile);
}
void CSysApp::OnUpdateDataSave(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
if(m_bFirstCreateDeviceFile)
pCmdUI->Enable(FALSE);
pCmdUI->SetCheck(nProcessMode == SAVE_MODE ? 1:0);
}
void CSysApp::OnUpdateDigitalShow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(nProcessMode == DATA_MODE ? 1:0);
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
// 在线程中取得视图指针
CADDigitView* pDigitView=(CADDigitView*)(CWnd::FromHandle(pDoc->m_hWndDigit));
if(nProcessMode == SAVE_MODE) // 如果为存盘方式
{
pDigitView->EnableWindow(FALSE);
}
else
{
pDigitView->EnableWindow(TRUE);
}
}
void CSysApp::OnUpdateGraphicShow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
pCmdUI->SetCheck(nProcessMode == WAVE_MODE ? 1:0);
CSysApp *pApp=(CSysApp *)AfxGetApp();
CADDoc* pDoc=pApp->m_pADDoc;
// 在线程中取得视图指针
CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave));
if(nProcessMode == SAVE_MODE) // 如果为存盘方式
{
pWaveView->EnableWindow(FALSE);
}
else
{
pWaveView->EnableWindow(TRUE);
}
}
void CSysApp::OnMDataSave()
{
// TODO: Add your command handler code here
nProcessMode = SAVE_MODE;
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
}
void CSysApp::OnMDigitalShow()
{
// TODO: Add your command handler code here
nProcessMode = DATA_MODE;
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
}
void CSysApp::OnMGraphicShow()
{
// TODO: Add your command handler code here
nProcessMode = WAVE_MODE;
if(pADStatusView != NULL)
pADStatusView->SetDlgCheck();
}
CDocument* CSysApp::OpenDocumentFile(LPCTSTR lpszFileName)
{
// TODO: Add your specialized code here and/or call the base class
CString str;
// CFile file;
// CFileStatus status;
// if (!file.GetStatus(lpszFileName, status))
// {
// str=lpszFileName;
// str=str+" 不存在!";
// AfxMessageBox(lpszFileName,MB_ICONSTOP, 0);
// return NULL; // 如果文件不存
// }
//
CFile File;
FILE_HEADER m_Header;
//File.Open(lpszFileName, GENERIC_READ);
if (!File.Open(lpszFileName, GENERIC_READ))
{
AfxMessageBox(L"打开文件失败");
return NULL;
}
File.Seek(0, CFile::begin);
File.Read((WORD*)&m_Header, sizeof(m_Header)); // 文件信息由HistDigitView类将其置在HistDataFrame的对话框条上OnInitialUpdate
File.Close();
if(m_Header.DeviceNum != DEFAULT_DEVICE_NUM)
{
if(AfxMessageBox(_T("对不起,该文件不能解析, 是否继续"),MB_YESNO, 0)==IDNO)
return NULL;
//bFile = FALSE;
}
CADHistDoc* pDoc;
BeginWaitCursor(); // 开始漏斗鼠标
pDoc=(CADHistDoc*)pHistDataTemplate->OpenDocumentFile(lpszFileName); // 先传递文件名到pDoc的消息函数OnOpenDocument
str = lpszFileName;
//str="历史数据:"+ str;
str="历史数据:";
pDoc->SetTitle(str); // 置文档新标题
EndWaitCursor(); // 停止漏斗鼠标
return pDoc;
//return CWinApp::OpenDocumentFile(lpszFileName);
}
void CSysApp::OnListDeviceDlg()
{
// TODO: Add your command handler code here
ACTS1000_ListDeviceDlg(m_hDevice); // 列表该类设备
}
int CSysApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
ReleaseMutex(m_hMutex);
if(m_hDevice != INVALID_HANDLE_VALUE)
{
ACTS1000_ReleaseDevice(m_hDevice);
m_hDevice = INVALID_HANDLE_VALUE;
}
for(int i=0; i<MAX_SEGMENT; i++)
{
ACTS1000_FreeBuffer(ADBuffer[i]);
}
ACTS1000_FreeBuffer(ADDrawBuffer);
return CWinApp::ExitInstance();
}
void CSysApp::OnADCalibration()
{
// TODO: Add your command handler code here
CADCalibration dlg;
dlg.DoModal();
}
void CAboutDlg::OnBnClickedButtonSet()
{
// TODO: 在此添加控件通知处理程序代码
if (theApp.m_hDevice != INVALID_HANDLE_VALUE)
{
CString str;
LONG nPhysIdx;
ULONG nSerialNum, nPassWord;
CEdit* pEdit;
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_PhysID);
pEdit->GetWindowText(str);
nPhysIdx = _tcstoul(str, NULL, 10);
if (nPhysIdx>255)
{
nPhysIdx = 255;
}
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SN);
pEdit->GetWindowText(str);
nSerialNum = _tcstoul(str, NULL, 10);
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_PassWord);
pEdit->GetWindowText(str);
nPassWord = _tcstoul(str, NULL, 10);
ACTS1000_SetDevicePhysID(theApp.m_hDevice, nPhysIdx);
ACTS1000_SetPassword(nPassWord);
if (!ACTS1000_SetSerialNum(theApp.m_hDevice, nSerialNum))
{
AfxMessageBox(L"设置序列号失败");
}
}
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
if (theApp.m_hDevice != INVALID_HANDLE_VALUE)
{
CString str;
ULONG nSerialNum;
LONG nPhysIdx, nDeviceLgcID;
ACTS1000_GetDeviceCurrentID(theApp.m_hDevice, &nDeviceLgcID, &nPhysIdx);
ACTS1000_GetSerialNum(theApp.m_hDevice, &nSerialNum);
CEdit* pEdit;
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_PhysID);
str.Format(L"%u", nPhysIdx);
pEdit->SetWindowText(str);
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SN);
str.Format(L"%u", nSerialNum);
pEdit->SetWindowText(str);
CString strVer;
ULONG ulFmwVersion, ulDriverVersion;
if (ACTS1000_GetDevVersion(theApp.m_hDevice, &ulFmwVersion, &ulDriverVersion))
{
CStatic* pStatic;
pStatic = (CStatic*)GetDlgItem(IDC_STATIC_FmwVersion);
str.Format(_T("%u"),ulFmwVersion);
pStatic->SetWindowText(str);
pStatic = (CStatic*)GetDlgItem(IDC_STATIC_DriverVersion);
str.Format(_T("%u"),ulDriverVersion);
pStatic->SetWindowText(str);
}
}
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

View File

@ -0,0 +1,943 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(中华人民共和国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 4, 2\r\n"
"#pragma code_page(936)\r\n"
"#endif //_WIN32\r\n"
"#include ""res\\Sys.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""l.chs\\afxres.rc"" // Standard components\r\n"
"#include ""l.chs\\afxprint.rc"" // printing/print preview resources\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Toolbar
//
IDR_MAINFRAME TOOLBAR 16, 15
BEGIN
BUTTON ID_FILE_NEW
BUTTON ID_FILE_OPEN
BUTTON ID_FILE_SAVE
SEPARATOR
BUTTON ID_EDIT_CUT
BUTTON ID_EDIT_COPY
BUTTON ID_EDIT_PASTE
SEPARATOR
BUTTON ID_FILE_PRINT
SEPARATOR
BUTTON ID_APP_ABOUT
END
IDR_TABVIEW_MENU TOOLBAR 16, 16
BEGIN
BUTTON ID_VIEW_FULLSCREEN
BUTTON ID_FILE_CLOSE
BUTTON 32775
BUTTON ID_FILE_SAVE
BUTTON ID_WINDOW_SAVE_ALL
BUTTON ID_FILE_PRINT
BUTTON ID_WINDOW_NEW
BUTTON ID_WINDOW_NEXT
BUTTON ID_WINDOW_PREVIOUS
BUTTON ID_WINDOW_CASCADE
BUTTON ID_WINDOW_TILE_HORZ
BUTTON ID_WINDOW_TILE_VERT
BUTTON ID_WINDOW_MANAGE
END
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MAINFRAME MENU
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "AD数采测试", IDM_Open_AD
MENUITEM SEPARATOR
MENUITEM "回放AD数据", IDM_HistoryData
MENUITEM SEPARATOR
MENUITEM "最近文件", ID_FILE_MRU_FILE1
MENUITEM SEPARATOR
MENUITEM "退出(&X)", ID_APP_EXIT
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "关于 Sys(&A)...", ID_APP_ABOUT
END
END
IDR_AD MENU
BEGIN
POPUP "文件操作(&F)"
BEGIN
MENUITEM "新建数据文件", IDM_DataFileNew
MENUITEM "打开数据文件", IDM_HistoryData
MENUITEM "关闭数据文件", IDM_CloseFile
MENUITEM SEPARATOR
MENUITEM "最近文件", ID_FILE_MRU_FILE1
MENUITEM SEPARATOR
MENUITEM "关闭数采系统", ID_FILE_CLOSE
MENUITEM "退出应用程序", ID_APP_EXIT
END
POPUP "设备管理(&M)"
BEGIN
MENUITEM "开始数据采集 F11", IDM_StartDeviceAD
MENUITEM "停止数据采集 F12", IDM_StopDeviceAD
MENUITEM SEPARATOR
MENUITEM "列表该类设备", IDM_ListDeviceDlg
MENUITEM SEPARATOR
END
POPUP "数据处理(&D)"
BEGIN
MENUITEM "数字方式显示", IDM_MDigitalShow
MENUITEM "图形方式显示", IDM_MGraphicShow
MENUITEM "数据存盘处理", IDM_MDataSave
MENUITEM SEPARATOR
MENUITEM "叠加显示", IDM_SuperPoseWave
MENUITEM "平铺显示", IDM_TileWave
MENUITEM SEPARATOR
MENUITEM "减掉中间值 F5", IDM_MoveVolt
END
POPUP "设备校准"
BEGIN
MENUITEM "AD校准(注意:仅支持输入阻抗为1M欧校准)", IDM_ADCalibration
END
POPUP "视图控制(&V)"
BEGIN
MENUITEM "状态栏(&S)", IDM_ShowStatusBar
MENUITEM "配置/分析条", IDM_ShowCfgAnalBar
END
POPUP "窗口管理(&W)"
BEGIN
MENUITEM "层叠窗口(&C)", ID_WINDOW_CASCADE
MENUITEM "横向平铺窗口(&H)", ID_WINDOW_TILE_HORZ
MENUITEM "纵向平铺窗口(&V)", ID_WINDOW_TILE_VERT
MENUITEM "排列图标(&A)", ID_WINDOW_ARRANGE
END
POPUP "系统帮助(&H)"
BEGIN
MENUITEM "关于 Sys(&A)...", ID_APP_ABOUT
END
END
IDR_ChooseMode MENU
BEGIN
POPUP "显示方式"
BEGIN
MENUITEM "十进制显示(偏移码)", IDM_TenShow
MENUITEM "十六进制显示(原码)", IDM_SixteenShow
MENUITEM "电压显示(偏移码)", IDM_DigitalVoltShowMode
END
END
IDR_HistoryData MENU
BEGIN
POPUP "文件操作(&F)"
BEGIN
MENUITEM "打开数据文件", IDM_HistoryData
MENUITEM SEPARATOR
MENUITEM "最近文件", ID_FILE_MRU_FILE1
MENUITEM SEPARATOR
MENUITEM "AD数采测试", IDM_Open_AD
MENUITEM SEPARATOR
MENUITEM "关闭本系统", ID_FILE_CLOSE
END
POPUP "数据回放"
BEGIN
MENUITEM "开始回放\tF9", IDM_History_Start
MENUITEM "停止回放\tF10", IDM_History_Stop
MENUITEM SEPARATOR
MENUITEM "波形回放", IDM_History_Wave
END
POPUP "窗口管理(&W)"
BEGIN
MENUITEM "刷新屏幕", IDM_ClearView
MENUITEM SEPARATOR
MENUITEM "层叠窗口(&C)", ID_WINDOW_CASCADE
MENUITEM "横向平铺窗口(&H)", ID_WINDOW_TILE_HORZ
MENUITEM "纵向平铺窗口(&V)", ID_WINDOW_TILE_VERT
MENUITEM "排列图标(&A)", ID_WINDOW_ARRANGE
END
END
IDR_HisMouseR MENU
BEGIN
POPUP "显示方式"
BEGIN
MENUITEM "十进制显示(偏移码)", IDM_TenShow
MENUITEM "十六进制显示(原码)", IDM_SixteenShow
MENUITEM "电压显示(偏移码)", IDM_DigitalVoltShowMode
MENUITEM SEPARATOR
MENUITEM "刷新数字列表", IDM_REFURBISH
END
END
IDR_ListCHParam MENU
BEGIN
POPUP "通道组"
BEGIN
MENUITEM "同类参数", 32825
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDR_MAINFRAME ACCELERATORS
BEGIN
"C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
"N", ID_FILE_NEW, VIRTKEY, CONTROL, NOINVERT
"O", ID_FILE_OPEN, VIRTKEY, CONTROL, NOINVERT
"P", ID_FILE_PRINT, VIRTKEY, CONTROL, NOINVERT
"S", ID_FILE_SAVE, VIRTKEY, CONTROL, NOINVERT
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT
VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT
VK_F10, IDM_History_Stop, VIRTKEY, NOINVERT
VK_F11, IDM_StartDeviceAD, VIRTKEY, NOINVERT
VK_F12, IDM_StopDeviceAD, VIRTKEY, NOINVERT
VK_F5, IDM_MoveVolt, VIRTKEY, NOINVERT
VK_F6, ID_NEXT_PANE, VIRTKEY, NOINVERT
VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT, NOINVERT
VK_F9, IDM_History_Start, VIRTKEY, NOINVERT
VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT
"X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT
END
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 271, 251
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于 Sys"
FONT 9, "宋体", 0, 0, 0x0
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "Sys V6.00.02 版",IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "版权所有 (C) 2028",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "确定",IDOK,142,219,61,19,WS_GROUP
GROUPBOX "帮助提示",IDC_STATIC,13,42,237,80
LTEXT "F5当您按下此键则采集的数据将被减去该通道此批数据的中间值再被显示到屏幕上。当您把屏幕量程设到足够小时您可以利用F5键的功能将放大且跳出屏幕以外的波形平移到屏幕中央以便您观测其数据精度。同时您也以通过数字显示窗口该通道的数据相对于原点即零点的跳变点数LSB便可以以数据更精确观测采样精度。当您再次按动F5键时则不再有平移波形等功能。",IDC_STATIC,24,60,208,57
LTEXT "物理ID[0:255]",IDC_STATIC,107,151,55,8
GROUPBOX "",IDC_STATIC,14,133,234,79
EDITTEXT IDC_EDIT_PhysID,169,147,56,14,ES_AUTOHSCROLL
LTEXT "序列号",IDC_STATIC,107,186,55,8
EDITTEXT IDC_EDIT_SN,169,184,56,14,ES_AUTOHSCROLL
GROUPBOX "",IDC_STATIC,91,137,150,67
LTEXT "密码",IDC_STATIC,107,167,55,8
EDITTEXT IDC_EDIT_PassWord,169,166,56,14,ES_PASSWORD | ES_AUTOHSCROLL
PUSHBUTTON "设置",IDC_BUTTON_Set,48,219,61,19
LTEXT "固件版本",IDC_STATIC,29,147,55,8
LTEXT "驱动版本",IDC_STATIC,29,175,55,8
LTEXT "002180110",IDC_STATIC_FmwVersion,29,160,55,8
LTEXT "180110002",IDC_STATIC_DriverVersion,29,189,55,8
END
IDR_MAINFRAME DIALOG 0, 0, 330, 16
STYLE DS_SETFONT | WS_CHILD
FONT 9, "宋体"
BEGIN
LTEXT "TODO: 对话栏布局",IDC_STATIC,12,4,300,8
END
CG_IDD_Status DIALOG 0, 0, 690, 15
STYLE DS_SETFONT | WS_CHILD
FONT 8, "MS Sans Serif"
BEGIN
EDITTEXT IDC_EDIT_CountTime,228,2,51,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "A-B时间",IDC_STATIC,192,4,36,8
LTEXT "偏移位置",IDC_STATIC,5,4,35,10
EDITTEXT IDC_EDIT_Offset,40,2,40,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "方格时间",IDC_STATIC,84,4,32,8
LTEXT "当前电压",IDC_STATIC,298,4,35,10
EDITTEXT IDC_EDIT_Volt,333,2,35,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "毫伏",IDC_STATIC,371,4,20,10
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER,584,4,99,7
LTEXT "动态显示进度",IDC_STATIC,528,3,49,8
EDITTEXT IDC_EDIT_MeasureFreq,451,1,72,14,ES_AUTOHSCROLL | ES_READONLY
LTEXT "外部信号频率",IDC_STATIC,400,3,49,8
LTEXT "div",IDC_STATIC_TimeOfDiv,118,2,73,10,SS_SUNKEN | NOT WS_GROUP
END
CG_IDD_ADCHANNEL DIALOGEX 0, 0, 133, 506
STYLE DS_SETFONT | WS_CHILD
FONT 9, "宋体", 0, 0, 0x0
BEGIN
CONTROL "自动采集",IDC_CHECK_Auto,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,464,44,10
CONTROL "Spin1",IDC_SPIN_BufferID,"msctls_updown32",UDS_SETBUDDYINT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,110,462,11,15
EDITTEXT IDC_EDIT_BufferID,92,463,18,13,ES_AUTOHSCROLL
COMBOBOX IDC_COMBO_TriggerSource,57,247,56,116,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO_OutTriggerDir,57,261,56,121,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "Slider1",IDC_SLIDER_Offset,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,5,479,78,14
LTEXT "缓冲ID",IDC_STATIC,65,464,24,10
LTEXT "采样频率",IDC_STATIC,7,51,33,8
LTEXT "触发源 ",IDC_STATIC,7,249,41,8,SS_NOTIFY
LTEXT "触发方向",IDC_STATIC,7,263,34,8
GROUPBOX "",IDC_STATIC,1,457,128,40
LTEXT "Static",IDC_STATIC_Offset,88,479,30,14,SS_SUNKEN
GROUPBOX "触发 ",IDC_STATIC,1,221,128,137
LTEXT "采样长度",IDC_STATIC,7,154,33,9
LTEXT "触发模式",IDC_STATIC,7,235,33,8,SS_NOTIFY
COMBOBOX IDC_COMBO_TriggerMode,57,233,56,64,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "触发电平",IDC_STATIC,7,278,36,8
EDITTEXT IDC_EDIT_TrigLevelVolt,57,276,47,12,ES_AUTOHSCROLL
GROUPBOX "时钟",IDC_STATIC,1,359,128,56
COMBOBOX IDC_COMBO_ReferenceClock,60,368,63,155,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_EDIT_N_Length,48,178,67,12,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_M_Length,48,165,67,12,ES_AUTOHSCROLL
LTEXT "M段(字)",IDC_STATIC,7,167,30,9
LTEXT "N段(字)",IDC_STATIC,7,180,29,9
LTEXT "(mV)",IDC_STATIC,106,278,17,8
EDITTEXT IDC_EDIT_SampleLenth,48,152,67,12,ES_AUTOHSCROLL | WS_DISABLED
LTEXT "参考时钟",IDC_STATIC,8,370,36,8
CONTROL "是否为主设备",IDC_CHECK_bMasterEn,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,427,62,8
COMBOBOX IDC_COMBO_SyncTrigSignal,69,439,56,155,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "同步触发源",IDC_STATIC,6,441,47,8
GROUPBOX "",IDC_STATIC,1,186,128,35
PUSHBUTTON "软件触发",IDC_BUTTON_SoftTirg,6,196,53,20
CONTROL "定时触发",IDC_CHECK_TimerTrig,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70,193,45,11
EDITTEXT IDC_EDIT_TrigInterval,69,205,27,12,ES_AUTOHSCROLL
LTEXT "mS",IDC_STATIC,104,206,8,8
LTEXT "触发次数",IDC_STATIC,7,306,36,8
EDITTEXT IDC_EDIT_TrigCount,57,303,57,12,ES_AUTOHSCROLL
LTEXT "触发灵敏度",IDC_STATIC,7,292,42,8
EDITTEXT IDC_EDIT_TrigWindow,57,289,47,12,ES_AUTOHSCROLL
LTEXT "nS",IDC_STATIC,106,292,9,8
CONTROL "时钟输出",IDC_CHECK_bClkOutEn,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,6,400,44,10
CONTROL "触发输出",IDC_CHECK_bTrigOutEn,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,332,44,10
GROUPBOX "同步",IDC_STATIC,1,416,128,40
COMBOBOX IDC_COMBO_ClkOutSel,60,398,63,155,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO_TrigOutPolarity,57,330,63,155,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "输出宽度",IDC_STATIC,7,345,36,8
EDITTEXT IDC_EDIT_TrigOutWidth,57,345,41,12,ES_AUTOHSCROLL
LTEXT "nS",IDC_STATIC,105,348,9,8
LTEXT "分 频 数",IDC_STATIC,7,39,33,8
EDITTEXT IDC_EDIT_FreqDivision,47,37,50,12,ES_AUTOHSCROLL
LTEXT "Hz",IDC_STATIC,101,51,8,8
EDITTEXT IDC_EDIT_Frequency,47,50,50,12,ES_AUTOHSCROLL
COMBOBOX IDC_COMBO_TimeBaseClock,60,383,63,155,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "采样时基",IDC_STATIC,8,385,36,8
LTEXT "采样模式",IDC_STATIC,7,64,33,8,SS_NOTIFY
COMBOBOX IDC_COMBO_SampleMode,47,62,65,64,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_LIST_CHParam,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,78,124,70
COMBOBOX IDC_COMBO_PFISel,57,316,63,121,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
LTEXT "PFI选择",IDC_STATIC_PFI,8,320,31,8,NOT WS_VISIBLE
CONTROL "自动存盘路径",IDC_CHECK_bSaveFile,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,5,65,10
EDITTEXT IDC_EDIT_FilePath,7,20,118,15,ES_AUTOHSCROLL
END
CG_IDD_HistoryDlg DIALOGEX 0, 0, 685, 89
STYLE DS_SETFONT | WS_CHILD
FONT 9, "宋体", 0, 0, 0x1
BEGIN
GROUPBOX "文件信息",IDC_STATIC_CardType,7,7,172,52
PUSHBUTTON "开始回放",IDM_History_Start,573,13,105,20
PUSHBUTTON "停止回放",IDM_History_Stop,573,37,105,21
GROUPBOX "",IDC_STATIC,190,12,65,46
LTEXT "文件偏移(点)",IDC_STATIC,7,64,50,15,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_Offset,58,64,55,15,ES_AUTOHSCROLL
CONTROL "Slider1",IDC_SLIDER_Offset,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,121,64,458,17,WS_EX_TRANSPARENT
LTEXT "文件长度",IDC_STATIC,361,18,33,12,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_FileLength,399,18,50,12,ES_AUTOHSCROLL | ES_READONLY
COMBOBOX IDC_COMBO_Rate,295,18,57,167,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
LTEXT "回放速度",IDC_STATIC,260,20,33,8
LTEXT "屏幕位置",IDC_STATIC,260,39,33,8
EDITTEXT IDC_EDIT_ScreenPos,297,38,57,12,ES_AUTOHSCROLL | ES_READONLY
EDITTEXT IDC_EDIT_PerChannel,400,38,50,13,ES_AUTOHSCROLL | ES_READONLY
LTEXT "通道点数",IDC_STATIC,360,38,33,13,SS_CENTERIMAGE
LISTBOX IDC_FILESINFO,13,16,159,39,NOT LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
LTEXT "0",IDC_STATIC_PositionA,503,11,49,10,SS_SUNKEN
LTEXT "0",IDC_STATIC_PositionB,504,25,49,10,SS_SUNKEN
CONTROL "A点位置:",IDC_RADIO_PositionA,"Button",BS_AUTORADIOBUTTON,455,12,48,10
CONTROL "B点位置:",IDC_RADIO_PositionB,"Button",BS_AUTORADIOBUTTON,455,25,48,10
LTEXT "频率大小:",IDC_STATIC,463,49,37,8
LTEXT "0",IDC_STATIC_Frequency,504,50,49,10,SS_SUNKEN
GROUPBOX "",IDC_STATIC,451,4,111,63
LTEXT "AB距离:",IDC_STATIC,471,38,29,8
LTEXT "0",IDC_STATIC_DistanceAB,504,37,49,10,SS_SUNKEN
PUSHBUTTON "刷新数字视图",IDC_BUTTON_RefrushData,193,25,58,14
PUSHBUTTON "定位",IDC_Goto,597,61,46,18
END
CG_IDD_Capability DIALOGEX 0, 0, 116, 381
STYLE DS_SYSMODAL | DS_SETFONT | WS_CHILD
EXSTYLE WS_EX_TOOLWINDOW
MENU IDR_AD
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
GROUPBOX "精度分析",IDC_STATIC,4,14,108,129
LTEXT "触发电平",IDC_STATIC,9,49,34,14,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_TriggerVolt,45,49,64,14,ES_AUTOHSCROLL
LTEXT "超限次数",IDC_STATIC,9,105,35,14,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_OverRange,45,105,64,14,ES_AUTOHSCROLL | ES_READONLY
LTEXT "分析总数",IDC_STATIC,9,85,34,14,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_AnalyzeCount,45,85,64,14,ES_AUTOHSCROLL | ES_READONLY
LTEXT "超限比率",IDC_STATIC,9,122,36,14,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_OverRatio,45,122,64,14,ES_AUTOHSCROLL | ES_READONLY
LTEXT "平移电压",IDC_STATIC,9,68,36,14,SS_CENTERIMAGE
LTEXT "屏幕量程",IDC_STATIC,9,28,36,12,SS_CENTERIMAGE
GROUPBOX "数据处理方式",IDC_STATIC,3,148,108,60
CONTROL "数字方式显示",IDM_DigitalShow,"Button",BS_AUTORADIOBUTTON | WS_GROUP,17,161,68,14
CONTROL "图形方式显示",IDM_GraphicShow,"Button",BS_AUTORADIOBUTTON,17,175,69,12
CONTROL "数据存盘处理",IDM_DataSave,"Button",BS_AUTORADIOBUTTON,17,189,68,14
ICON IDR_MAINFRAME,IDC_STATIC,42,348,20,20
COMBOBOX IDC_Combo_MoveVolt,45,67,64,101,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_Combo_ScreenVolume,45,28,64,148,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "平铺显示",IDM_TileWave,"Button",BS_AUTORADIOBUTTON | WS_GROUP,17,264,48,11
CONTROL "叠加显示",IDM_SuperPoseWave,"Button",BS_AUTORADIOBUTTON,17,281,48,11
GROUPBOX "显示模式",IDC_STATIC,3,242,108,65
END
CG_IDD_DIALOG_Save DIALOGEX 0, 0, 694, 17
STYLE DS_SETFONT | WS_CHILD
FONT 9, "宋体", 0, 0, 0x1
BEGIN
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER,526,4,155,7
LTEXT "文件名:",IDC_STATIC,5,4,31,11,SS_CENTERIMAGE
LTEXT "",IDC_FileName,39,4,157,11,SS_CENTERIMAGE,WS_EX_STATICEDGE
LTEXT "磁盘可用空间:",IDC_STATIC,200,3,56,11,SS_CENTERIMAGE
LTEXT "",IDC_DiskFree,258,3,58,11,SS_CENTERIMAGE,WS_EX_STATICEDGE
LTEXT "全盘存储进度:",IDC_STATIC,469,4,52,11
LTEXT "文件存储大小:",IDC_STATIC,322,3,52,11,SS_CENTERIMAGE
LTEXT "",IDC_FileLenght,379,3,84,11,SS_CENTERIMAGE,WS_EX_STATICEDGE
END
IDD_DIALOG_Calibration DIALOG 0, 0, 286, 86
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Device Calibration"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "Calibration",IDC_BUTTON_Calibration,95,12,72,25
CONTROL "Progress1",IDC_PROGRESS_Calibration,"msctls_progress32",WS_BORDER,15,43,256,10
CTEXT "",IDC_STATIC_Calibration,25,59,239,11
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "CompanyName", "北京阿尔泰科贸有限公司"
VALUE "FileDescription", "Sys Microsoft 基础类应用程序"
VALUE "FileVersion", "V6.00.00.00.03"
VALUE "InternalName", "Sys"
VALUE "LegalCopyright", "版权所有 (C) 2005"
VALUE "OriginalFilename", "Sys.EXE"
VALUE "ProductName", "Sys 应用程序"
VALUE "ProductVersion", "05.11.23"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 264
TOPMARGIN, 7
BOTTOMMARGIN, 244
END
CG_IDD_Status, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 683
TOPMARGIN, 7
BOTTOMMARGIN, 8
END
CG_IDD_ADCHANNEL, DIALOG
BEGIN
RIGHTMARGIN, 132
TOPMARGIN, 1
BOTTOMMARGIN, 501
END
CG_IDD_HistoryDlg, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 678
TOPMARGIN, 7
BOTTOMMARGIN, 82
END
CG_IDD_Capability, DIALOG
BEGIN
RIGHTMARGIN, 115
BOTTOMMARGIN, 378
END
CG_IDD_DIALOG_Save, DIALOG
BEGIN
LEFTMARGIN, 5
RIGHTMARGIN, 683
TOPMARGIN, 3
BOTTOMMARGIN, 14
END
IDD_DIALOG_Calibration, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 279
TOPMARGIN, 7
BOTTOMMARGIN, 79
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//
CG_IDD_HistoryDlg DLGINIT
BEGIN
IDC_COMBO_Rate, 0x403, 2, 0
0x0031,
IDC_COMBO_Rate, 0x403, 2, 0
0x0032,
IDC_COMBO_Rate, 0x403, 2, 0
0x0034,
IDC_COMBO_Rate, 0x403, 2, 0
0x0038,
IDC_COMBO_Rate, 0x403, 3, 0
0x3031, "\000"
IDC_COMBO_Rate, 0x403, 3, 0
0x3032, "\000"
IDC_COMBO_Rate, 0x403, 3, 0
0x3038, "\000"
IDC_COMBO_Rate, 0x403, 5, 0
0x3031, 0x3432, "\000"
IDC_COMBO_Rate, 0x403, 5, 0
0x3032, 0x3834, "\000"
0
END
CG_IDD_Capability DLGINIT
BEGIN
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x2031, 0x2020, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x2032, 0x2020, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x2035, 0x2020, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3031, 0x2020, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3032, 0x2020, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3035, 0x2020, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3031, 0x2030, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3032, 0x2030, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3035, 0x2030, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3031, 0x3030, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3032, 0x3030, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3035, 0x3030, 0x2020, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3031, 0x3030, 0x2030, 0x566d, "\000"
IDC_Combo_ScreenVolume, 0x403, 9, 0
0x3032, 0x3030, 0x2030, 0x566d, "\000"
0
END
CG_IDD_ADCHANNEL DLGINIT
BEGIN
IDC_COMBO_TriggerSource, 0x403, 9, 0
0xedc8, 0xfebc, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_TriggerSource, 0x403, 9, 0
0x5444, 0x2852, 0x4650, 0x2949, "\000"
IDC_COMBO_TriggerSource, 0x403, 13, 0
0xaccd, 0xbdb2, 0xc5d0, 0xc5ba, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_TriggerSource, 0x403, 10, 0
0xa8cd, 0xc0b5, 0xb430, 0xb7a5, 0x00a2,
IDC_COMBO_TriggerSource, 0x403, 10, 0
0xa8cd, 0xc0b5, 0xb431, 0xb7a5, 0x00a2,
IDC_COMBO_TriggerSource, 0x403, 10, 0
0xa8cd, 0xc0b5, 0xb432, 0xb7a5, 0x00a2,
IDC_COMBO_TriggerSource, 0x403, 10, 0
0xa8cd, 0xc0b5, 0xb433, 0xb7a5, 0x00a2,
IDC_COMBO_OutTriggerDir, 0x403, 11, 0
0xc2cf, 0xb5bd, 0xd8d1, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_OutTriggerDir, 0x403, 11, 0
0xcfc9, 0xfdc9, 0xd8d1, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_OutTriggerDir, 0x403, 15, 0
0xcfc9, 0xc2cf, 0xdfb1, 0xd8d1, 0xf9be, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_TriggerMode, 0x403, 9, 0
0xd0d6, 0xe4bc, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_TriggerMode, 0x403, 7, 0
0xf3ba, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_TriggerMode, 0x403, 7, 0
0xa4d4, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_TriggerMode, 0x403, 13, 0
0xb2d3, 0xfebc, 0xd3d1, 0xb1ca, 0xa5b4, 0xa2b7, "\000"
IDC_COMBO_ReferenceClock, 0x403, 9, 0
0xe5b0, 0xd8d4, 0xb1ca, 0xd3d6, "\000"
IDC_COMBO_ReferenceClock, 0x403, 8, 0
0xe2cd, 0xbfb2, 0x3031, 0x004d,
IDC_COMBO_ReferenceClock, 0x403, 11, 0
0x5850, 0x5f49, 0x4c43, 0x314b, 0x4d30, "\000"
IDC_COMBO_ReferenceClock, 0x403, 13, 0
0x5850, 0x6549, 0x435f, 0x4b4c, 0x3031, 0x4d30, "\000"
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0030,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0031,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0032,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0033,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0034,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0035,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0036,
IDC_COMBO_SyncTrigSignal, 0x403, 6, 0
0x5254, 0x4749, 0x0037,
IDC_COMBO_ClkOutSel, 0x403, 9, 0
0xceb2, 0xbcbf, 0xb1ca, 0xd3d6, "\000"
IDC_COMBO_ClkOutSel, 0x403, 9, 0
0xf9bb, 0xbcd7, 0xb1ca, 0xd3d6, "\000"
IDC_COMBO_TrigOutPolarity, 0x403, 11, 0
0xbab8, 0xf6c2, 0xe5b3, 0xe4ca, 0xf6b3, "\000"
IDC_COMBO_TrigOutPolarity, 0x403, 11, 0
0xfdd5, 0xf6c2, 0xe5b3, 0xe4ca, 0xf6b3, "\000"
IDC_COMBO_TimeBaseClock, 0x403, 9, 0
0xdac4, 0xbfb2, 0xb1ca, 0xd3d6, "\000"
IDC_COMBO_TimeBaseClock, 0x403, 9, 0
0xe2cd, 0xbfb2, 0xb1ca, 0xd3d6, "\000"
IDC_COMBO_SampleMode, 0x403, 11, 0
0xd0d3, 0xdecf, 0xe3b5, 0xc9b2, 0xf9d1, "\000"
IDC_COMBO_SampleMode, 0x403, 9, 0
0xacc1, 0xf8d0, 0xc9b2, 0xf9d1, "\000"
IDC_COMBO_PFISel, 0x403, 9, 0
0xa5b4, 0xa2b7, 0xe4ca, 0xf6b3, "\000"
IDC_COMBO_PFISel, 0x403, 9, 0
0xa5b4, 0xa2b7, 0xe4ca, 0xebc8, "\000"
0
END
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\MainFrm.ico"
IDR_AD ICON "res\\AD.ico"
IDR_HistoryData ICON "res\\Hist.ico"
IDR_DIO ICON "res\\idr_dio.ico"
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDR_MAINFRAME "阿尔泰驱动演示系统"
IDR_AD "\nSys\nSys\n阿尔泰文件 (*.pci)\n.pci\nSys.Document\nSys Document\n阿尔泰公司文件"
CG_IDS_TIPOFTHEDAYHELP "&Help"
END
STRINGTABLE
BEGIN
AFX_IDS_APP_TITLE "Sys"
AFX_IDS_IDLEMESSAGE "就绪"
END
STRINGTABLE
BEGIN
ID_INDICATOR_EXT "扩展名"
ID_INDICATOR_CAPS "大写"
ID_INDICATOR_NUM "数字"
ID_INDICATOR_SCRL "滚动"
ID_INDICATOR_OVR "改写"
ID_INDICATOR_REC "记录"
ID_SHOWMOUSEVOLT " "
END
STRINGTABLE
BEGIN
ID_FILE_NEW "建立新文档\n新建"
ID_FILE_OPEN "打开一个现有文档\n打开"
ID_FILE_CLOSE "关闭活动文档\n关闭"
ID_FILE_SAVE "保存活动文档\n保存"
ID_FILE_SAVE_AS "将活动文档以一个新文件名保存\n另存为"
ID_FILE_PAGE_SETUP "改变打印选项\n页面设置"
ID_FILE_PRINT_SETUP "改变打印机及打印选项\n打印设置"
ID_FILE_PRINT "打印活动文档\n打印"
ID_FILE_PRINT_PREVIEW "显示整页\n打印预览"
END
STRINGTABLE
BEGIN
ID_APP_ABOUT "显示程序信息,版本号和版权\n关于"
ID_APP_EXIT "退出应用程序;提示保存文档\n退出"
END
STRINGTABLE
BEGIN
ID_FILE_MRU_FILE1 "打开该文档"
ID_FILE_MRU_FILE2 "打开该文档"
ID_FILE_MRU_FILE3 "打开该文档"
ID_FILE_MRU_FILE4 "打开该文档"
ID_FILE_MRU_FILE5 "打开该文档"
ID_FILE_MRU_FILE6 "打开该文档"
ID_FILE_MRU_FILE7 "打开该文档"
ID_FILE_MRU_FILE8 "打开该文档"
ID_FILE_MRU_FILE9 "打开该文档"
ID_FILE_MRU_FILE10 "打开该文档"
ID_FILE_MRU_FILE11 "打开该文档"
ID_FILE_MRU_FILE12 "打开该文档"
ID_FILE_MRU_FILE13 "打开该文档"
ID_FILE_MRU_FILE14 "打开该文档"
ID_FILE_MRU_FILE15 "打开该文档"
ID_FILE_MRU_FILE16 "打开该文档"
END
STRINGTABLE
BEGIN
ID_NEXT_PANE "切换到下一个窗格\n下一窗格"
ID_PREV_PANE "切换回前一个窗格\n前一窗格"
END
STRINGTABLE
BEGIN
ID_WINDOW_NEW "为活动文档打开另一个窗口\n新建窗口"
ID_WINDOW_ARRANGE "将图标排列在窗口底部\n排列图标"
ID_WINDOW_CASCADE "排列窗口成相互重叠\n层叠窗口"
ID_WINDOW_TILE_HORZ "排列窗口成互不重叠\n平铺窗口"
ID_WINDOW_TILE_VERT "排列窗口成互不重叠\n平铺窗口"
ID_WINDOW_SPLIT "将活动的窗口分隔成窗格\n分隔"
END
STRINGTABLE
BEGIN
ID_EDIT_CLEAR "删除被选对象\n删除"
ID_EDIT_CLEAR_ALL "全部删除\n全部删除"
ID_EDIT_COPY "复制被选对象并将其置于剪贴板上\n复制"
ID_EDIT_CUT "剪切被选对象并将其置于剪贴板上\n剪切"
ID_EDIT_FIND "查找指定的正文\n查找"
ID_EDIT_PASTE "插入剪贴板内容\n粘贴"
ID_EDIT_REPEAT "重复上一步操作\n重复"
ID_EDIT_REPLACE "用不同的正文替换指定的正文\n替换"
ID_EDIT_SELECT_ALL "选择整个文档\n选择全部"
ID_EDIT_UNDO "撤消最后一步操作\n撤消"
ID_EDIT_REDO "重新执行先前已撤消的操作\n重新执行"
END
STRINGTABLE
BEGIN
ID_VIEW_TOOLBAR "显示或隐藏工具栏\n显隐工具栏"
ID_VIEW_STATUS_BAR "显示或隐藏状态栏\n显隐状态栏"
END
STRINGTABLE
BEGIN
AFX_IDS_SCSIZE "改变窗口大小"
AFX_IDS_SCMOVE "改变窗口位置"
AFX_IDS_SCMINIMIZE "将窗口缩小成图标"
AFX_IDS_SCMAXIMIZE "把窗口放大到最大尺寸"
AFX_IDS_SCNEXTWINDOW "切换到下一个文档窗口"
AFX_IDS_SCPREVWINDOW "切换到先前的文档窗口"
AFX_IDS_SCCLOSE "关闭活动的窗口并提示保存所有文档"
END
STRINGTABLE
BEGIN
AFX_IDS_SCRESTORE "把窗口恢复到正常大小"
AFX_IDS_SCTASKLIST "激活任务表"
AFX_IDS_MDICHILD "激活该窗口"
END
STRINGTABLE
BEGIN
AFX_IDS_PREVIEW_CLOSE "关闭打印预览模式\n取消预阅"
IDS_ProccessHistoryData "打开磁盘数据文件"
END
STRINGTABLE
BEGIN
IDS_NEW_FILE "新建数据文件"
END
STRINGTABLE
BEGIN
CG_ID_VIEW_SETUPDLG "Show or hide SetupDlg\nToggle SetupDlg"
ID_WINDOW_NEXT_PANE "Switch to the next window pane\nNext Pane"
CG_ID_VIEW_SHOWSTATUS "Show or hide ShowStatus\nToggle ShowStatus"
ID_WINDOW_PREV_PANE "Switch back to the previous window pane\nPrevious Pane"
CG_ID_VIEW_SHOWSTATUS1 "Show or hide ShowStatus1\nToggle ShowStatus1"
CG_ID_VIEW_DIALOGBAR "Show or hide DialogBar\nToggle DialogBar"
END
STRINGTABLE
BEGIN
CG_ID_VIEW_DLGBAR "Show or hide 设备管理\nToggle 设备管理"
CG_IDS_TIPOFTHEDAY "Displays a Tip of the Day."
CG_IDS_TIPOFTHEDAYMENU "Ti&p of the Day..."
CG_IDS_DIDYOUKNOW "Did you know..."
CG_IDS_FILE_ABSENT "Tips file does not exist in the prescribed directory"
CG_IDP_FILE_CORRUPT "Trouble reading the tips file"
END
STRINGTABLE
BEGIN
IDM_CloseFile "关闭文件使用"
END
STRINGTABLE
BEGIN
IDR_HistoryData "\nSys\nSys\n阿尔泰文件 (*.pci)\n.pci\nSys.Document\nSys Document"
END
#endif // 中文(中华人民共和国) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 德语(德国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
#ifdef _WIN32
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_TABIMAGES BITMAP "res\\TabImage.bmp"
#endif // 德语(德国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE 4, 2
#pragma code_page(936)
#endif //_WIN32
#include "res\Sys.rc2" // non-Microsoft Visual C++ edited resources
#include "l.chs\afxres.rc" // Standard components
#include "l.chs\afxprint.rc" // printing/print preview resources
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@ -0,0 +1,26 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Sys", "Sys.vcproj", "{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Debug|Win32.ActiveCfg = Debug|Win32
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Debug|Win32.Build.0 = Debug|Win32
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Debug|x64.ActiveCfg = Debug|x64
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Debug|x64.Build.0 = Debug|x64
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Release|Win32.ActiveCfg = Release|Win32
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Release|Win32.Build.0 = Release|Win32
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Release|x64.ActiveCfg = Release|x64
{991B07A8-2680-4D33-BCE4-F733A1AB6D7E}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,273 @@
// tabbar.cpp : implementation file
//
// This class implements a tab control for MDI windows.
// The tab labels are filled automatically with the titles of the MDI frames.
/////////////////////////////////////////////////////////////////////////////
//
// Copyright ?1998 Written by Dieter Fauth
// mailto:fauthd@zvw.de
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name and all copyright
// notices remains intact. If the source code in this file is used in
// any commercial application then a statement along the lines of
// "Portions Copyright ?1999 Dieter Fauth" must be included in
// the startup banner, "About" box or printed documentation. An email
// letting me know that you are using it would be nice as well. That's
// not much to ask considering the amount of work that went into this.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability for any damage/loss of business that
// this product may cause.
//
// ==========================================================================
// HISTORY:
// ==========================================================================
// 1.00 08 May 1999 - Initial release.
// ==========================================================================
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <afxpriv.h>
#include <..\src\mfc\afximpl.h>
#include "resource.h"
#include "TabCtrlBarDoc.h"
// RCS info
static char rcsid[] = "$Id: $";
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////////
// CTabCtrlBarDoc
CTabCtrlBarDoc::CTabCtrlBarDoc()
{
}
/*
CTabCtrlBarDoc::~CTabCtrlBarDoc()
{
}
*/
IMPLEMENT_DYNAMIC(CTabCtrlBarDoc, CControlBar)
BEGIN_MESSAGE_MAP(CTabCtrlBarDoc, CControlBar)
//{{AFX_MSG_MAP(CTabCtrlBarDoc)
ON_WM_SIZE()
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_NOTIFY(TCN_SELCHANGE, IDC_MDI_TAB_CTRL, OnSelchange)
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////////
BOOL CTabCtrlBarDoc::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID)
{
ASSERT_VALID(pParentWnd); // must have a parent
// save the style (some of these style bits are MFC specific)
// m_dwStyle = (UINT)dwStyle;
m_dwStyle = CBRS_ALL;
// translate MFC style bits to windows style bits
dwStyle &= ~CBRS_ALL;
dwStyle |= CCS_NOPARENTALIGN|CCS_NOMOVEY|CCS_NODIVIDER|CCS_NORESIZE;
if (pParentWnd->GetStyle() & WS_THICKFRAME)
dwStyle |= SBARS_SIZEGRIP;
//dwStyle=CBRS_ALL;
// initialize common controls
// VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
// create the HWND
CRect rect; rect.SetRectEmpty();
/*
rect.left=10;
rect.top=10;
rect.right=10;
rect.bottom=20;
*/
return CWnd::Create(STATUSCLASSNAME, NULL, dwStyle, rect, pParentWnd, nID);
}
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlBarDoc message handlers
int CTabCtrlBarDoc::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect; rect.SetRectEmpty();
//Create the Tab Control
if (!m_tabctrl.Create(WS_VISIBLE|WS_CHILD, rect, this, IDC_MDI_TAB_CTRL))
{
TRACE0("Unable to create tab control bar\n");
return -1;
}
// set "regular" GUI-font
// Use a smaller font for smaller tabs
CFont *font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
m_tabctrl.SetFont(font);
return 0;
}
void CTabCtrlBarDoc::OnSize(UINT nType, int cx, int cy)
{
CControlBar::OnSize(nType, cx, cy);
CRect rect;
if (m_tabctrl.GetSafeHwnd())
{
GetWindowRect(rect);
m_tabctrl.AdjustRect(TRUE, &rect);
m_tabctrl.SetWindowPos(&wndTop ,0,0,rect.Width()-7, rect.Height(), SWP_SHOWWINDOW);
}
}
void CTabCtrlBarDoc::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
SetTitles();
}
// This is called in idle time.
// Here we update the tab labels and selection
void CTabCtrlBarDoc::SetTitles(void)
{
CString csName;
TC_ITEM tci;
TCHAR buf[MAX_PATH+1];
CMDIFrameWnd *pMainframe = ((CMDIFrameWnd *)AfxGetMainWnd());
if (pMainframe == NULL)
return; // no official mainframe window yet
CMDIChildWnd* pActive = pMainframe->MDIGetActive( NULL );
// update all tab labels if neccessary
int numitems = m_tabctrl.GetItemCount();
for (int item = 0; item < numitems; item++)
{
csName.Empty();
tci.mask = TCIF_PARAM|TCIF_TEXT;
tci.pszText = buf;
tci.cchTextMax = MAX_PATH;
if (!m_tabctrl.GetItem(item, &tci))
continue; // skip bad ones (never saw one yet)
CWnd *pFrame = FromHandle((HWND) tci.lParam);
ASSERT(pFrame != NULL);
if ( pFrame->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) )
{
pFrame->GetWindowText(csName);
if (buf != csName) // avoid flicker
{
tci.mask = TCIF_TEXT;
tci.pszText = csName.LockBuffer();
m_tabctrl.SetItem(item, &tci);
csName.UnlockBuffer();
}
if (pActive == pFrame) // mark the active one
m_tabctrl.SetCurSel(item);
}
}
}
// Add a new window handle to the tab control
// Also creates a new tab
void CTabCtrlBarDoc::AddHandle(HWND hWnd)
{
CWnd *pFrame = FromHandle(hWnd);
ASSERT(pFrame != NULL);
if ( pFrame->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) )
{
TC_ITEM tci;
tci.mask = TCIF_PARAM|TCIF_TEXT;
tci.pszText = _T("");
tci.lParam = (long) hWnd;
m_tabctrl.InsertItem(m_tabctrl.GetItemCount(), &tci);
}
}
// Remove a new window handle from the tab control
// Also removes the tab
void CTabCtrlBarDoc::RemoveHandle(HWND hWnd)
{
TC_ITEM tci;
int numitems = m_tabctrl.GetItemCount();
for (int item = 0; item < numitems; item++)
{
tci.mask = TCIF_PARAM;
m_tabctrl.GetItem(item, &tci);
if (tci.lParam == (long) hWnd)
{
m_tabctrl.DeleteItem(item);
break;
}
}
}
// The user clicked onto a tab.
// Now select a new MDI child frame
void CTabCtrlBarDoc::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
{
int idx = m_tabctrl.GetCurSel();
TC_ITEM tci;
tci.mask = TCIF_PARAM;
if (m_tabctrl.GetItem(idx, &tci))
{
CWnd *pFrame = FromHandle((HWND) tci.lParam);
ASSERT(pFrame != NULL);
ASSERT_KINDOF(CMDIChildWnd, pFrame);
((CMDIFrameWnd *)AfxGetMainWnd())->MDIActivate(pFrame);
}
*pResult = 0;
}
// Almost a copy from CStatusbar:
// The framework calls this function to get an idea of the size.
CSize CTabCtrlBarDoc::CalcFixedLayout(BOOL, BOOL bHorz)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
// determinme size of font being used by the status bar
TEXTMETRIC tm;
{
CClientDC dc(NULL);
HFONT hFont = (HFONT)SendMessage(WM_GETFONT);
HGDIOBJ hOldFont = NULL;
if (hFont != NULL)
hOldFont = dc.SelectObject(hFont);
VERIFY(dc.GetTextMetrics(&tm));
if (hOldFont != NULL)
dc.SelectObject(hOldFont);
}
// get border information
CRect rect; rect.SetRectEmpty();
CalcInsideRect(rect, bHorz);
int rgBorders[3];
DefWindowProc(SB_GETBORDERS, 0, (LPARAM)&rgBorders);
// determine size, including borders
CSize size;
size.cx = 32767;
size.cy = tm.tmHeight - tm.tmInternalLeading - 1
+ rgBorders[1] * 2 + ::GetSystemMetrics(SM_CYBORDER) * (2+3)
- rect.Height();
return size;
}

View File

@ -0,0 +1,61 @@
// titlebar.h : header file
//
#ifndef _TABBAR_H_58A62F03_FEFE_11D2_BC0D_006008CCD137
#define _TABBAR_H_58A62F03_FEFE_11D2_BC0D_006008CCD137
/////////////////////////////////////////////////////////////////////////////
#include "TabCtrlDoc.h"
/////////////////////////////////////////////////////////////////////////////
// CTabBar window
//#define CTabBar_parent CControlBar
class CTabCtrlBarDoc : public CControlBar
{
DECLARE_DYNAMIC(CTabCtrlBarDoc)
// Construction
public:
// Construction
public:
CTabCtrlBarDoc();
// Attributes
public:
void RemoveHandle(HWND hWnd);
void AddHandle(HWND hWnd);
void SetTitles(void);
// Operations
public:
BOOL Create(CWnd* pParentWnd,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
UINT nID = AFX_IDW_STATUS_BAR);
// Implementation
public:
// virtual ~CTabBar();
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
protected:
// CTabCtrl m_tabctrl; // works also, but the Ex version gives a nice look
CTabCtrlDoc m_tabctrl;
// Overrides
virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTabCtrlBarDoc)
//}}AFX_VIRTUAL
protected:
// Generated message map functions
//{{AFX_MSG(CTabCtrlBarDoc)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
afx_msg void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
#endif

View File

@ -0,0 +1,208 @@
// TabCtrlEx.cpp : implementation file
//
#include "stdafx.h"
#include "TabCtrlDoc.h"
#include "PopupMenu.h"
#include "Resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlDoc
CTabCtrlDoc::CTabCtrlDoc()
{
m_crSelColour = RGB(0,0,255);
m_crUnselColour = RGB(50,50,50);
}
CTabCtrlDoc::~CTabCtrlDoc()
{
m_SelFont.DeleteObject();
m_UnselFont.DeleteObject();
}
BEGIN_MESSAGE_MAP(CTabCtrlDoc, CTabCtrl)
//{{AFX_MSG_MAP(CTabCtrlDoc)
ON_WM_CREATE()
ON_WM_RBUTTONDOWN()
ON_WM_SETFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlDoc message handlers
int CTabCtrlDoc::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTabCtrl::OnCreate(lpCreateStruct) == -1) return -1;
ModifyStyle(0, TCS_OWNERDRAWFIXED);
return 0;
}
void CTabCtrlDoc::PreSubclassWindow()
{
CTabCtrl::PreSubclassWindow();
ModifyStyle(0, TCS_OWNERDRAWFIXED);
}
void CTabCtrlDoc::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rect = lpDrawItemStruct->rcItem;
int nTabIndex = lpDrawItemStruct->itemID;
if (nTabIndex < 0) return;
BOOL bSelected = (nTabIndex == GetCurSel());
TCHAR label[64];
TC_ITEM tci;
tci.mask = TCIF_TEXT|TCIF_IMAGE;
tci.pszText = label;
tci.cchTextMax = 63;
if (!GetItem(nTabIndex, &tci )) return;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
if (!pDC) return;
int nSavedDC = pDC->SaveDC();
// For some bizarre reason the rcItem you get extends above the actual
// drawing area. We have to workaround this "feature".
rect.top += ::GetSystemMetrics(SM_CYEDGE);
pDC->SetBkMode(TRANSPARENT);
pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE));
// Draw image
CImageList* pImageList = GetImageList();
if (pImageList && tci.iImage >= 0) {
rect.left += pDC->GetTextExtent(_T(" ")).cx; // Margin
// Get height of image so we
IMAGEINFO info;
pImageList->GetImageInfo(tci.iImage, &info);
CRect ImageRect(info.rcImage);
int nYpos = rect.top;
pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT);
rect.left += ImageRect.Width();
}
if (bSelected) {
pDC->SetTextColor(m_crSelColour);
pDC->SelectObject(&m_SelFont);
rect.top -= ::GetSystemMetrics(SM_CYEDGE);
pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
} else {
pDC->SetTextColor(m_crUnselColour);
pDC->SelectObject(&m_UnselFont);
pDC->DrawText(label, rect, DT_SINGLELINE|DT_BOTTOM|DT_CENTER);
}
pDC->RestoreDC(nSavedDC);
}
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlDoc operations
void CTabCtrlDoc::SetColours(COLORREF bSelColour, COLORREF bUnselColour)
{
m_crSelColour = bSelColour;
m_crUnselColour = bUnselColour;
Invalidate();
}
void CTabCtrlDoc::SetFonts(CFont* pSelFont, CFont* pUnselFont)
{
ASSERT(pSelFont && pUnselFont);
LOGFONT lFont;
int nSelHeight, nUnselHeight;
m_SelFont.DeleteObject();
m_UnselFont.DeleteObject();
pSelFont->GetLogFont(&lFont);
m_SelFont.CreateFontIndirect(&lFont);
nSelHeight = lFont.lfHeight;
pUnselFont->GetLogFont(&lFont);
m_UnselFont.CreateFontIndirect(&lFont);
nUnselHeight = lFont.lfHeight;
SetFont( (nSelHeight > nUnselHeight)? &m_SelFont : &m_UnselFont);
}
void CTabCtrlDoc::SetFonts(int nSelWeight, BOOL bSelItalic, BOOL bSelUnderline,
int nUnselWeight, BOOL bUnselItalic, BOOL bUnselUnderline)
{
// Free any memory currently used by the fonts.
m_SelFont.DeleteObject();
m_UnselFont.DeleteObject();
// Get the current font
LOGFONT lFont;
CFont *pFont = GetFont();
if (pFont)
pFont->GetLogFont(&lFont);
else {
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
lFont = ncm.lfMessageFont;
}
// Create the "Selected" font
lFont.lfWeight = nSelWeight;
lFont.lfItalic = bSelItalic;
lFont.lfUnderline = bSelUnderline;
m_SelFont.CreateFontIndirect(&lFont);
// Create the "Unselected" font
lFont.lfWeight = nUnselWeight;
lFont.lfItalic = bUnselItalic;
lFont.lfUnderline = bUnselUnderline;
m_UnselFont.CreateFontIndirect(&lFont);
SetFont( (nSelWeight > nUnselWeight)? &m_SelFont : &m_UnselFont);
}
void CTabCtrlDoc::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// 当鼠标在CControlBar控件上按动右键时弹出浮动菜单
POINT ptScreen = point;
// 转换鼠标坐标到屏幕坐标
ClientToScreen(&ptScreen);
// 自定义类从CMenu派生
CPopupMenu cMenu;
// 创建弹出式浮动菜单
cMenu.CreatePopupMenu();
// 添加菜单项ID_VIEW_VIEWTAB是菜单命令ID值
// 添加分隔符
cMenu.AppendMenu(MF_STRING, ID_FILE_CLOSE, _T("关闭本窗口"));
this->GetCurSel();
cMenu.LoadToolBarResource(IDR_TABVIEW_MENU);
cMenu.RemapMenu(&cMenu);
cMenu.EnableMenuItems(&cMenu, AfxGetMainWnd());
cMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, ptScreen.x,
ptScreen.y, AfxGetMainWnd());
//*/
//AfxMessageBox(_T("鼠标右键tab");
//CMDIFrameWnd::OnRButtonDown(nFlags, point);
}
void CTabCtrlDoc::OnSetFocus(CWnd* pOldWnd)
{
CTabCtrl::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
}

View File

@ -0,0 +1,60 @@
#if !defined(AFX_TABCTRLEX_H__28407441_38AF_11D1_ABBA_00A0243D1382__INCLUDED_)
#define AFX_TABCTRLEX_H__28407441_38AF_11D1_ABBA_00A0243D1382__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// TabCtrlEx.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlDoc window
class CTabCtrlDoc : public CTabCtrl
{
// Construction/destruction
public:
CTabCtrlDoc();
virtual ~CTabCtrlDoc();
// Attributes:
public:
// Operations
public:
void SetFonts(CFont* pSelFont, CFont* pUnselFont);
void SetFonts(int nSelWeight=FW_SEMIBOLD, BOOL bSelItalic=FALSE, BOOL bSelUnderline=FALSE,
int nUnselWeight=FW_MEDIUM, BOOL bUnselItalic=FALSE, BOOL bUnselUnderline=FALSE);
void SetColours(COLORREF bSelColour, COLORREF bUnselColour);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTabCtrlDoc)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
protected:
COLORREF m_crSelColour, m_crUnselColour;
CFont m_SelFont, m_UnselFont;
// Generated message map functions
protected:
//{{AFX_MSG(CTabCtrlDoc)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnSetFocus(CWnd* pOldWnd);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_TABCTRLEX_H__28407441_38AF_11D1_ABBA_00A0243D1382__INCLUDED_)

View File

@ -0,0 +1,172 @@
#include "ACTS1000.h" // 包含驱动程序接口
#include "ADThread.h"
//#############################################################
// 定义用于控制数据位数及量程的常数
#define VOLT_RANGE 1000.0 // 量程mV(注意必须带小数)
// 定义其他常量
#define MAX_CHANNEL_COUNT ACTS1000_AD_MAX_CHANNELS
#define MAX_SEGMENT 16
#define MAX_RAM_SIZE (1024*256) // 每通道RAM的最大容量(点或字)
#define MAX_RAM_SIZE_32M (1024*1024*32) // 每通道RAM的最大容量(点或字)
//#############################################################
// Header define
#define PCI_BUS 0x01
#define USB_BUS 0x02
#define ISA_BUS 0x03
#define PC104_BUS 0x04
#define PXI_BUS 0x05
#define PXIE_BUS 0x2012
#define PCIE_BUS 0x2011
#define PRO_MODE 0x01 // 非空采集
#define INT_MODE 0x02 // 中断采集
#define DMA_MODE 0x03 // DMA采集
#define AD_FILE_TYPE 0x00 // 存储AD数据的文件
#define DA_FILE_TYPE 0x01 // 存储DA数据的文件
#define DIO_FILE_TYPE 0x02 // 存储DIO数据的文件
#define DEFAULT_FILE_TYPE AD_FILE_TYPE
//#define DEFAULT_BUS_TYPE PXIE_BUS // 设备类型(PCI)
#define DEFAULT_DEVICE_NUM 0x6666 // 设备编号,程序编号是否为本程序保存的数据文件
#define DEFAULT_VOLTBOTTOM_RANGE -50000
#define DEFAULT_VOLTTOP_RANGE 5000
#define DEFAULT_DATA_WIDTH 0x14 // 设备的精度(14位)
#define HEAD_END_FLAG 0xAA55AA55
#define PCIE8502D_RID 0xD0
#define DATA_MODE 1 // 数字显示
#define WAVE_MODE 2 // 波形显示
#define SAVE_MODE 3 // 存盘处理
// 数字窗口显示模式
#define DEC_DATAMODE 0 // 十进制显示
#define HEX_DATAMODE 1 // 十六进制显示
#define VOLT_DATAMODE 2 // 电压值显示
typedef struct _FILE_HEADER
{
LONG HeadSizeBytes; // 文件头信息长度
LONG FileType;
// 该设备数据文件共有的成员
LONG BusType; // 设备总线类型(DEFAULT_BUS_TYPE)
LONG DeviceNum; // 该应用程序标志(DEFAULT_DEVICE_NUM)
LONG DeviceType; // 该设备的编号8514 8504 8512 8502...
LONG VoltBottomRange; // 量程下限(mV)
LONG VoltTopRange; // 量程上限(mV)
LONG ChannelCount; // 通道总数
LONG DataWidth; // 设备的精度(分辩率)
LONG bXorHighBit; // 是否高位求反(为1则求反)
ACTS1000_PARA_AD ADPara; // 保存硬件参数
ACTS1000_STATUS_AD ADStatus; // 保存硬件参数
ACTS1000_AD_MAIN_INFO ADMainInfo; // 保存硬件参数
LONG CrystalFreq; // 晶振频率
ULONGLONG CreateFTime; // 创建文件时间
ULONG nRevisionID;
BYTE Reserved0[124]; // 结构体整体大小1024字节
LONG HeadEndFlag; // 头信息结束位
} FILE_HEADER, *PFILE_HEADER;
//#############################################################
// external declare
extern WORD* ADBuffer[MAX_SEGMENT]; // 缓冲队列
extern WORD* ADDrawBuffer;
extern BOOL m_bDrawComp;
extern ACTS1000_PARA_AD ADPara;
extern ACTS1000_PARA_AD OldADPara;
extern ACTS1000_STATUS_AD pADStatus;
extern ACTS1000_AD_MAIN_INFO gl_ADMainInfo;
extern WORD gl_wMaxLSB;
extern float gl_fLsbCount;
extern WORD gl_lLsbHalf;
extern int gl_ScreenVolume;
extern int m_TriggerVolt;
extern int WavePointX;
extern int CurrentIndex;
extern HANDLE hDevice;
extern CEdit* pCountEdit;
extern BOOL m_BounceStop;
extern BOOL m_AnalyzeCheck;
extern BOOL m_bCreateDevice;
extern int glOffset;
extern int glBufferID;
extern int m_BounceCount;
extern float m_AnalyzeAllCount;
extern UINT m_OverLimitCount;
extern BOOL m_bProgress;
extern float Center, PerY;
extern CRect ClientRect;
extern float middle1;
extern BOOL bDrawing;
extern int nChannelArrayClient[MAX_CHANNEL_COUNT];
extern int DisplayChannel[MAX_CHANNEL_COUNT];
extern BOOL m_bFirstCreateDeviceFile;
extern int m_ProcessDigitalMode;
extern int m_ProcessGraphicMode;
extern int m_AnalyzeChannel;
extern int m_UpperLimit;
extern int m_LowerLimit;
extern ULONGLONG gl_pulDDR2Length;
extern BOOL gl_bRt;
extern ULONGLONG gl_DDR2Lenth;
extern CEdit* pRangeEdit;
extern CEdit* pRatioEdit;
extern int m_ProcessMoveVolt;
extern int nProcessMode;
extern BOOL bBunch;
extern int m_DigitalDataShowMode;
extern SHORT InUserRegion[MAX_SEGMENT][16384];
extern BOOL gl_bAutoCollect;
extern float OutAnalogValve;
extern int ReadIndex;
extern HANDLE g_ArrFileOut;
extern HANDLE hEvent;
extern HANDLE hExitEvent;
extern BOOL gl_bDeviceADRun;
extern BOOL gl_bAutoTrig;
extern BOOL bCreateDevice;
extern ULONGLONG FileLenghtWords;
extern BOOL gl_Event;
extern BOOL gl_bCollected;
extern BOOL m_bCloseFile;
extern int gl_MiddleLsb[MAX_CHANNEL_COUNT];
extern int gl_nSampleMode;
extern BOOL gl_bTileWave;
extern ULONG gl_nSampleLenth;
extern float gl_PerLsbVoltM[MAX_CHANNEL_COUNT];
extern LONG gl_nTriggerPos;
extern ULONG gl_StartAddr;
extern int gl_nChannelCount;
extern int gl_nSaveFileCount;
extern BOOL gl_bSmlThenSize;
extern ULONGLONG gl_ReadSizeWords;
#define MsgBox AfxMessageBox
CString strMsg;
extern CString g_strFileFullName;
extern ULONG gl_ChannelArrary[MAX_CHANNEL_COUNT];
extern ACTS1000_STATUS_AD gl_ADStatus;
extern ULONG m_nSampRangeCount;
extern ULONG m_nSampRangeVal[8];
extern TCHAR g_strChannelEn[2][64];
extern TCHAR g_strGain[4][64];
extern TCHAR g_strRefGround[3][64];
extern TCHAR g_strAIRange[3][64];
extern TCHAR g_strInputImped[2][64];
extern ULONG gl_CHIdx[MAX_CHANNEL_COUNT];
extern CCriticalSection gl_Section;
extern ULONG gl_nDrawLen;
extern ULONG gl_nDocDrawLen;
extern ULONG gl_nDrawIdx;
extern ULONG gl_nDocDrawIdx;

View File

@ -0,0 +1,302 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Sys.rc
//
#define IDD_ABOUTBOX 100
#define IDC_MDI_TAB_CTRL_BAR 101
#define CG_ID_VIEW_SETUPDLG 103
#define ID_WINDOW_NEXT_PANE 104
#define CG_IDD_Capability 104
#define CG_ID_VIEW_SHOWSTATUS 105
#define ID_WINDOW_PREV_PANE 106
#define CG_IDD_Status 106
#define CG_ID_VIEW_SHOWSTATUS1 107
#define CG_IDD_HistoryDlg 108
#define CG_ID_VIEW_DIALOGBAR 109
#define IDC_MDI_TAB_CTRL 110
#define IDI_TABCTRLBAR 110
#define IDB_TABIMAGES 111
#define IDW_PROP_BAR 112
#define IDR_ADSTATUS_TMPL 114
#define IDR_ADSTATUS_TMPL1 115
#define CG_ID_VIEW_DLGBAR 117
#define IDC_ADDCHANNEL 118
#define IDB_LIGHTBULB 121
#define CG_IDS_TIPOFTHEDAY 123
#define CG_IDS_TIPOFTHEDAYMENU 124
#define CG_IDS_DIDYOUKNOW 125
#define CG_IDS_FILE_ABSENT 126
#define CG_IDP_FILE_CORRUPT 127
#define IDR_MAINFRAME 128
#define IDR_AD 129
#define CG_IDS_TIPOFTHEDAYHELP 130
#define IDR_TABVIEW_MENU 131
#define IDI_ICON1 137
#define IDR_ChooseMode 138
#define IDB_BITMAP2 140
#define IDB_BITMAP4 143
#define IDB_BITMAP5 147
#define IDB_BITMAP3 148
#define IDR_HistoryData 151
#define IDD_DIALOG_IO 155
#define IDC_CURSOR1 158
#define CG_IDD_ADCHANNEL 160
#define IDD_DIALOG_DA 161
#define IDB_BITMAP6 163
#define IDB_BITMAP8 165
#define CG_IDD_DIALOG_Save 166
#define IDR_HisMouseR 168
#define IDB_BITMAP1 169
#define IDR_ICON 170
#define IDR_DIO 174
#define IDR_MENU1 176
#define IDR_ListCHParam 176
#define IDD_DIALOG_Calibration 178
#define IDC_BUTTON_Start 1004
#define IDC_EDIT_Frequence 1006
#define IDC_COMBO_Frequence 1006
#define IDC_COMBO_SampleLenth 1007
#define IDC_COMBO_Channel 1008
#define IDC_EDIT_UpperLimit 1009
#define IDC_EDIT_LowerLimit 1010
#define IDC_EDIT_BunchChannel 1011
#define IDC_CHECK_StopAndRun 1012
#define IDC_EDIT_TriggerVolt 1013
#define IDC_EDIT_OverRange 1014
#define IDC_EDIT_AnalyzeCount 1015
#define IDC_EDIT_OverRatio 1016
#define IDC_Combo_MoveVolt 1017
#define IDC_CHECK_StopFirstDigitalShow 1020
#define IDC_EDIT_ScreenVolume 1021
#define IDC_CHECK_Analyze 1023
#define IDC_STATIC_ShowXY 1024
#define IDC_EDIT_CountTime 1025
#define IDC_EDIT_Offset 1026
#define IDC_EDIT_Volt 1027
#define IDC_EDIT_PerTime 1028
#define IDC_PROGRESS 1030
#define IDC_EDIT_Cycle0 1037
#define IDC_STATIC_CardType 1048
#define IDC_SLIDER_Offset 1049
#define IDC_SLIDER_MN_Length 1050
#define IDC_BUTTON_Stop 1052
#define IDM_History_Stop 1055
#define IDM_History_Start 1056
#define IDM_History_Stop2 1057
#define IDC_Goto 1057
#define IDC_EDIT_FileLength 1059
#define IDC_COMBO_Rate 1062
#define IDC_EDIT_ScreenPos 1063
#define IDC_EDIT_PerChannel 1064
#define IDC_CHECK_DO8 1074
#define IDC_CHECK_DO9 1075
#define IDC_CHECK_DO10 1076
#define IDC_CHECK_DO11 1077
#define IDC_CHECK_DO13 1078
#define IDC_CHECK_DO12 1079
#define IDC_CHECK_DO14 1080
#define IDC_CHECK_DO15 1081
#define IDC_COMBO_TriggerSource 1083
#define IDC_COMBO_TriggerMode 1084
#define IDC_BUTTON_StartWriteDA0 1085
#define IDC_COMBO_TriggerType 1085
#define IDC_COMBO_TriggerChannel 1085
#define IDC_COMBO_TriggerMode2 1085
#define IDC_COMBO_SampleMode 1085
#define IDC_COMBO_CouplingType0 1086
#define IDC_BUTTON_StopWriteDA0 1087
#define IDC_COMBO_TriggerWhen 1087
#define IDC_COMBO_ChannelDataBit 1087
#define IDC_SPIN_Cycle0 1088
#define IDC_EDIT_Value0 1089
#define IDC_COMBO_TrigPercent 1089
#define IDC_CHECK_DI8 1090
#define IDC_SPIN_Value0 1090
#define IDC_COMBO_TrigEventCnt 1090
#define IDC_CHECK_DI9 1091
#define IDC_COMBO_TriggerWidth 1091
#define IDC_CHECK_DI10 1092
#define IDC_CHANNEL 1092
#define IDC_COMBO_ClockSource 1092
#define IDC_COMBO_ReferenceClock 1092
#define IDC_CHECK_DI11 1093
#define IDC_DELETECHANNEL 1093
#define IDC_COMBO_HighBitSet 1093
#define IDC_COMBO_SyncTrigSignal 1093
#define IDC_CHECK_DI12 1094
#define IDC_COMBO_HighBitSet_Set 1094
#define IDC_COMBO_ClkOutSel 1094
#define IDC_CHECK_DI13 1095
#define IDC_COMBO_TrigOutPolarity 1095
#define IDC_CHECK_DI14 1096
#define IDC_CHECK_Wave 1096
#define IDC_COMBO_ReferenceClock2 1096
#define IDC_COMBO_TimeBaseClock 1096
#define IDC_CHECK_DI15 1097
#define IDC_COMBO_OutTriggerDir 1100
#define IDC_COMBO_TriggerClass 1101
#define IDC_COMBO_OutTriggerDir2 1101
#define IDC_COMBO_PFISel 1101
#define IDC_COMBO_bAvailableTrig 1102
#define IDC_CHECK_CheckOverflow 1103
#define IDC_CHECK_0 1103
#define IDC_PICTURE 1108
#define IDC_FileName 1109
#define IDC_FileLenght 1110
#define IDC_DiskFree 1111
#define IDC_CHECK_1 1114
#define IDC_CHECK_2 1115
#define IDC_CHECK_3 1116
#define IDC_FILESINFO 1117
#define IDC_CHECK_ClockIn 1118
#define IDC_CHECK_ClockOut 1119
#define IDC_EDIT_MeasureFreq 1123
#define IDC_CHECK0 1124
#define IDC_CHECK_CH0 1124
#define IDC_CHECK1 1125
#define IDC_CHECK_bSetTrigLevel 1125
#define IDC_CHECK_bAvailableTrig 1125
#define IDC_CHECK_bSaveFile 1125
#define IDC_CHECK2 1126
#define IDC_CHECK_ClockOutput 1126
#define IDC_CHECK_Channel0 1126
#define IDC_CHECK_bMasterEn 1126
#define IDC_CHECK3 1127
#define IDC_CHECK_Channel1 1127
#define IDC_CHECK_TimerTrig 1127
#define IDC_CHECK_bClkOutEn 1128
#define IDC_COMBO_DisplayChannel 1129
#define IDC_CHECK_bMasterEn3 1129
#define IDC_CHECK_bTrigOutEn 1129
#define IDC_COMBO_DisplayLast 1130
#define IDC_CHECK_Auto 1136
#define IDC_SPIN_BufferID 1137
#define IDC_EDIT_BufferID 1138
#define IDC_STATIC_Offset 1140
#define IDC_STATIC_TimeOfDiv 1145
#define IDC_SCROLLBAR2 1149
#define IDC_STATIC8 1150
#define IDC_Combo_ScreenVolume 1151
#define IDC_SCROLLBAR1 1154
#define IDC_RADIO_PositionA 1155
#define IDC_RADIO_PositionB 1156
#define IDC_STATIC_PositionA 1157
#define IDC_STATIC_PositionB 1158
#define IDC_STATIC_Frequency 1159
#define IDC_STATIC_DistanceAB 1160
#define IDM_TileWave 1161
#define IDM_SuperPoseWave 1162
#define IDC_BUTTON_REFRUSH 1163
#define IDC_BUTTON_RefrushData 1163
#define IDC_COMBO_VoltRange0 1166
#define IDC_COMBO_VoltRange1 1167
#define IDC_COMBO_VoltRange2 1168
#define IDC_COMBO_VoltRange3 1169
#define IDC_EDIT_TrigLevelLsb 1170
#define IDC_EDIT_TrigLevelVolt 1170
#define IDC_EDIT_TrigLevelVolt2 1171
#define IDC_EDIT_TrigWindow 1171
#define IDC_EDIT_N_Length 1172
#define IDC_EDIT_M_Length 1173
#define IDC_STATIC_HighBitSet 1174
#define IDC_EDIT_SampleLenth 1174
#define IDC_EDIT_TrigWindow2 1175
#define IDC_EDIT_TrigOutWidth 1175
#define IDC_EDIT_FreqDivision 1176
#define IDC_EDIT_FreqDivision2 1177
#define IDC_EDIT_Frequency 1177
#define IDC_BUTTON1 1178
#define IDC_BUTTON_TrigWindowRead 1178
#define IDC_BUTTON_SoftTirg 1178
#define IDC_EDIT_TrigInterval 1179
#define IDC_EDIT_TrigWindowRead 1180
#define IDC_BUTTON_Calibration 1180
#define IDC_COMBO_Range0 1181
#define IDC_COMBO_Range1 1182
#define IDC_PROGRESS_Calibration 1182
#define IDC_COMBO_Range2 1183
#define IDC_STATIC_Calibration 1183
#define IDC_COMBO_Range3 1184
#define IDC_CHECK_CH1 1187
#define IDC_CHECK_CH2 1188
#define IDC_CHECK6 1189
#define IDC_CHECK_CH3 1189
#define IDC_EDIT_TrigCount 1190
#define IDC_COMBO_CouplingType1 1191
#define IDC_COMBO_CouplingType2 1192
#define IDC_COMBO_CouplingType3 1193
#define IDC_LIST_CHParam 1194
#define IDC_STATIC_PFI 1195
#define IDC_STATIC_FmwVersion 1196
#define IDC_STATIC_FmwVersion2 1197
#define IDC_STATIC_DriverVersion 1197
#define IDC_EDIT1 1197
#define IDC_EDIT_FilePath 1197
#define IDC_EDIT_PhysID 1336
#define IDC_EDIT_PID 1337
#define IDC_EDIT_SN 1338
#define IDC_EDIT_PassWord 1339
#define IDC_BUTTON_Set 1340
#define IDC_BUTTON_PositionA 1341
#define IDC_BUTTON_PositionB 1342
#define IDC_SCROLLBAR_ScreenCur 1343
#define IDM_CollectData 32772
#define ID_VIEW_FULLSCREEN 32772
#define ID_WINDOW_NEXT 32773
#define ID_WINDOW_PREVIOUS 32774
#define IDM_DigitalShow 32776
#define ID_WINDOW_SAVE_ALL 32776
#define IDM_GraphicShow 32777
#define ID_WINDOW_MANAGE 32777
#define IDM_DataFileNew 32781
#define IDM_ShowCfgAnalBar 32783
#define IDM_MoveVolt 32784
#define IDM_TenShow 32785
#define IDM_SixteenShow 32786
#define IDM_DigitalVoltShowMode 32787
#define IDM_ClearView 32791
#define IDM_History_Digit 32792
#define IDM_History_Wave 32793
#define IDM_DataSave 32794
#define IDM_ProcessHistoryData 32795
#define IDM_CloseFile 32796
#define IDM_Open_IO 32800
#define IDM_ListDevice 32802
#define IDM_ListDeviceDlg 32802
#define IDM_WriteDA 32804
#define IDM_StartDeviceAD 32805
#define IDM_StopDeviceAD 32806
#define IDM_Open_AD 32807
#define IDM_HistoryData 32808
#define IDM_Open_DA 32809
#define IDM_ShowStatusBar 32810
#define IDM_REFURBISH 32811
#define IDM_NOT_EMPTY_MODE 32811
#define IDM_MDigitalShow 32812
#define IDM_MGraphicShow 32813
#define IDM_MDataSave 32814
#define IDM_HALF_MODE 32815
#define IDM_INT_MODE 32816
#define IDM_Pro_Mode 32818
#define IDM_Dma_Mode 32819
#define IDM_StartDA 32820
#define IDM_Open_DIO 32821
#define ID_MENU_GetDevVersion 32823
#define IDM_ADCalibration 32824
#define IDM_SameParam 32825
#define ID_SHOWMOUSEVOLT 59142
#define IDS_ProccessHistoryData 61447
#define IDC_LISTEDIT 61448
#define IDS_NEW_FILE 61500
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 177
#define _APS_NEXT_COMMAND_VALUE 32826
#define _APS_NEXT_CONTROL_VALUE 1198
#define _APS_NEXT_SYMED_VALUE 131
#endif
#endif

View File

@ -0,0 +1,31 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<!-- Copyright (c) Microsoft Corporation -->
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"
manifestVersion="1.0"
>
<assemblyIdentity
name="Dcomcnfg"
processorArchitecture="X86"
type="win32"
version="1.0.0.0"
/>
<description>Small utility exe to make it easy to start "mmc.exe %windir%\system32\comexp.msc"</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<autoElevate>true</autoElevate>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

View File

@ -0,0 +1,28 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="highestAvailable"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

Some files were not shown because too many files have changed in this diff Show More