当前位置: 首页 > news >正文

GPIO Service

SetOutput
private void SetOutput(string alias, bool state){if (string.IsNullOrEmpty(alias)){_logger.LogError("No alias for SetGPIO, unable to continue");return;}var clientGPIORequest = new TestInterfaceGPIOService.TestInterfaceGPIOServiceClient(Channel);uint dutPosition = 1;const string failedMessage = "Failed to set GPIO";var ioRequest = new IORequest(){Session = _sessionId,DutPosition = dutPosition,Alias = alias,State = state};var textBox = GetControl<TextBox>("GPIOResultTextBox");if (textBox == null){_logger.LogError("Failed to find control with matching name GPIOResultTextBox");return;}try{_logger.LogInformation("GPIO request: {ioRequest}", ioRequest);var response = clientGPIORequest.SetOutput(ioRequest);if (response.Code != (int)StatusCode.OK){_logger.LogError(failedMessage + ", {status}", response);textBox.Text = failedMessage;textBox.BackColor = Color.Red;return;}textBox.ResetBackColor();textBox.Text = $"{alias} set to: {(state ? 1 : 0)}";}catch (Exception exception){_logger.LogError(exception, failedMessage);textBox.Text = failedMessage;textBox.BackColor = Color.Red;}}

这个SetOutput函数是一个用于设置GPIO输出状态的C#方法。让我详细解释它的功能和工作流程:

函数功能概述

这是一个GPIO控制函数,通过gRPC服务调用设置指定GPIO引脚的电平状态(高/低电平)。

详细功能解析

1. 参数说明

private void SetOutput(string alias, bool state)
  • alias: GPIO引脚的别名标识符(如"GPIO1"、"LED1"等)
  • state: 要设置的状态(true=高电平/1,false=低电平/0)

2. 参数验证

if (string.IsNullOrEmpty(alias))
{_logger.LogError("No alias for SetGPIO, unable to continue");return;
}
  • 检查别名是否为空,防止无效调用

3. gRPC客户端初始化

var clientGPIORequest = new TestInterfaceGPIOService.TestInterfaceGPIOServiceClient(Channel);
uint dutPosition = 1;
const string failedMessage = "Failed to set GPIO";
  • 创建GPIO服务的gRPC客户端
  • 设置设备位置(DUT position = 1)
  • 定义错误消息常量

4. 构建请求对象

var ioRequest = new IORequest()
{Session = _sessionId,      // 会话IDDutPosition = dutPosition, // 设备位置Alias = alias,            // GPIO别名State = state             // 目标状态
};

5. UI控件获取

var textBox = GetControl<TextBox>("GPIOResultTextBox");
if (textBox == null)
{_logger.LogError("Failed to find control with matching name GPIOResultTextBox");return;
}
  • 获取用于显示结果的文本框控件
  • 如果控件不存在则记录错误并返回

6. gRPC调用执行

_logger.LogInformation("GPIO request: {ioRequest}", ioRequest);
var response = clientGPIORequest.SetOutput(ioRequest);
  • 记录请求信息(用于调试)
  • 执行gRPC调用设置GPIO输出

7. 响应处理

if (response.Code != (int)StatusCode.OK)
{_logger.LogError(failedMessage + ", {status}", response);textBox.Text = failedMessage;textBox.BackColor = Color.Red;return;
}
  • 检查服务器返回的状态码
  • 如果失败:记录错误、显示红色错误消息

8. 成功处理

textBox.ResetBackColor();
textBox.Text = $"{alias} set to: {(state ? 1 : 0)}";
  • 重置文本框背景色
  • 显示成功消息(如:"GPIO1 set to: 1")

9. 异常处理

catch (Exception exception)
{_logger.LogError(exception, failedMessage);textBox.Text = failedMessage;textBox.BackColor = Color.Red;
}
  • 捕获所有异常
  • 记录异常详情
  • 显示红色错误消息

工作流程

  1. 验证输入 → 检查别名有效性
  2. 准备请求 → 构建gRPC请求对象
  3. 获取UI控件 → 准备结果显示
  4. 执行调用 → 发送gRPC请求到服务器
  5. 处理响应 → 检查操作是否成功
  6. 更新UI → 显示结果状态

技术特点

错误处理机制

  • 参数验证:防止空别名
  • 控件检查:确保UI控件存在
  • 状态码检查:验证服务器响应
  • 异常捕获:处理网络和系统错误

用户反馈

  • 颜色编码:红色表示错误,默认色表示成功
  • 详细消息:显示具体的GPIO状态信息
  • 日志记录:便于调试和故障排查

常量使用

const string failedMessage = "Failed to set GPIO";
  • 使用常量避免硬编码字符串
  • 便于维护和国际化

使用示例

// 设置GPIO1为高电平
SetOutput("GPIO1", true);// 设置LED1为低电平  
SetOutput("LED1", false);

应用场景

这个函数通常用于:

  • 硬件测试:控制测试设备上的GPIO引脚
  • LED控制:控制指示灯状态
  • 继电器控制:开关外部设备
  • 信号生成:产生特定的数字信号

这个函数实现了完整的GPIO控制流程,包括错误处理、用户反馈和日志记录,是硬件控制应用的典型实现。

GetInput
private void GetInput(string alias){if (string.IsNullOrEmpty(alias)){_logger.LogError("No alias for GetInput, unable to continue");return;}var clientGPIORequest = new TestInterfaceGPIOService.TestInterfaceGPIOServiceClient(Channel);uint dutPosition = 1;const string failedMessage = "Failed to get GPIO";var ioRequest = new IORequest(){Session = _sessionId,DutPosition = dutPosition,Alias = alias};var textBox = GetControl<TextBox>("GPIOResultTextBox");if (textBox == null){_logger.LogError("Failed to find control with matching name GPIOResultTextBox");return;}try{_logger.LogInformation("GPIO request: {ioRequest}", ioRequest);var response = clientGPIORequest.GetInput(ioRequest);if (response.Status.Code != (int)StatusCode.OK){_logger.LogError(failedMessage + ", {status}", response);textBox.Text = failedMessage;textBox.BackColor = Color.Red;return;}textBox.ResetBackColor();textBox.Text = $"{alias}: {(response.State ? 1 : 0)}";}catch (Exception exception){_logger.LogError(exception, failedMessage);textBox.Text = failedMessage;textBox.BackColor = Color.Red;}}}
}

这个GetInput函数是一个用于读取GPIO输入状态的C#方法。让我详细解释它的功能和工作流程:

函数功能概述

这是一个GPIO状态读取函数,通过gRPC服务调用获取指定GPIO引脚的当前电平状态(高/低电平)。

详细功能解析

1. 参数说明

private void GetInput(string alias)
  • alias: GPIO引脚的别名标识符(如"GPIO1"、"BUTTON1"等)

2. 参数验证

if (string.IsNullOrEmpty(alias))
{_logger.LogError("No alias for GetInput, unable to continue");return;
}
  • 检查别名是否为空,防止无效调用
  • 记录错误日志并提前返回

3. gRPC客户端初始化

var clientGPIORequest = new TestInterfaceGPIOService.TestInterfaceGPIOServiceClient(Channel);
uint dutPosition = 1;
const string failedMessage = "Failed to get GPIO";
  • 创建GPIO服务的gRPC客户端
  • 设置设备位置(DUT position = 1)
  • 定义错误消息常量

4. 构建请求对象

var ioRequest = new IORequest()
{Session = _sessionId,      // 会话IDDutPosition = dutPosition, // 设备位置Alias = alias             // GPIO别名
};
  • 注意:与SetOutput不同,这里不需要设置State字段,因为是读取操作

5. UI控件获取

var textBox = GetControl<TextBox>("GPIOResultTextBox");
if (textBox == null)
{_logger.LogError("Failed to find control with matching name GPIOResultTextBox");return;
}
  • 获取用于显示结果的文本框控件
  • 如果控件不存在则记录错误并返回

6. gRPC调用执行

_logger.LogInformation("GPIO request: {ioRequest}", ioRequest);
var response = clientGPIORequest.GetInput(ioRequest);
  • 记录请求信息(用于调试)
  • 执行gRPC调用获取GPIO输入状态

7. 响应处理

if (response.Status.Code != (int)StatusCode.OK)
{_logger.LogError(failedMessage + ", {status}", response);textBox.Text = failedMessage;textBox.BackColor = Color.Red;return;
}
  • 检查服务器返回的状态码
  • 如果失败:记录错误、显示红色错误消息

8. 成功处理

textBox.ResetBackColor();
textBox.Text = $"{alias}: {(response.State ? 1 : 0)}";
  • 重置文本框背景色
  • 显示GPIO状态(如:"GPIO1: 1" 或 "BUTTON1: 0")

9. 异常处理

catch (Exception exception)
{_logger.LogError(exception, failedMessage);textBox.Text = failedMessage;textBox.BackColor = Color.Red;
}
  • 捕获所有异常
  • 记录异常详情
  • 显示红色错误消息

与SetOutput函数的对比

特性 GetInput (读取) SetOutput (设置)
操作类型 读取状态 设置状态
请求参数 不需要State字段 需要State字段
响应处理 检查response.Status.Code 检查response.Code
结果显示 显示读取的状态值 显示设置的状态值
gRPC方法 GetInput() SetOutput()

工作流程

  1. 验证输入 → 检查别名有效性
  2. 准备请求 → 构建gRPC请求对象(不含State)
  3. 获取UI控件 → 准备结果显示
  4. 执行调用 → 发送gRPC请求到服务器
  5. 处理响应 → 检查操作是否成功
  6. 显示状态 → 显示GPIO的当前电平状态
  7. 更新UI → 显示结果状态

技术特点

错误处理机制

  • 参数验证:防止空别名
  • 控件检查:确保UI控件存在
  • 状态码检查:验证服务器响应
  • 异常捕获:处理网络和系统错误

用户反馈

  • 颜色编码:红色表示错误,默认色表示成功
  • 状态显示:显示具体的GPIO状态(1/0)
  • 日志记录:便于调试和故障排查

使用示例

// 读取GPIO1的输入状态
GetInput("GPIO1");// 读取按钮状态
GetInput("BUTTON1");

应用场景

这个函数通常用于:

  • 按钮检测:读取按钮是否被按下
  • 传感器状态:读取传感器输出信号
  • 开关检测:检测开关位置状态
  • 信号监控:监控外部设备的状态
  • 硬件测试:验证GPIO输入功能

响应数据结构

从服务器返回的响应包含:

  • Status.Code: 操作状态码
  • State: GPIO的实际电平状态(true/false)

这个函数实现了完整的GPIO状态读取流程,是硬件状态监控应用的典型实现。

http://www.jsqmd.com/news/471928/

相关文章:

  • 2026年不锈钢电磁加热器/电磁预热机/电磁采暖炉厂家推荐:工业电磁加热节能解决方案专业供应商 - 品牌推荐官
  • 如何实现32k上下文?Qwen2.5-0.5B长文本处理教程
  • GPT-OSS与企业微信集成:内部助手部署实战
  • 十五冶 × 易知微:打造“数字矿山分身”,实景孪生实现全域智控
  • Spark 集群搭建
  • Linux——TCP通信
  • ccmusic-database行业应用:广播电台节目自动分段并标记背景音乐流派
  • 2026年集装袋知名厂家排名公布,来样定制吨包集装袋靠谱吗 - 工业品网
  • VScode完整的跨平台适配方案
  • docker快速部署kafka
  • 2026年安徽马鞍山小程序制作靠谱的公司推荐 - 工业设备
  • JavaScript-原型链结构图
  • 盘点2026年兰州热门装修公司,楚邦装饰客户评价好不好,价格贵吗? - mypinpai
  • Fish Speech 1.5开源模型价值解析:免费替代ElevenLabs/Polly方案
  • mPLUG-Owl3-2B与Yi-VL对比:轻量级中文多模态模型在图文检索任务中的表现
  • 2026-03-13 npm install -g yarn后不管怎么配置都无法查看yarn版本,即便配置了环境变量==》使用corepack重新安装yarn
  • 总结潜水搅拌机专业服务厂家选购要点,南京维克环保靠谱吗? - 工业品牌热点
  • 2026年贵州手表回收哪家靠谱 优质厂家详解 兼顾专业与便捷适配个人企业 - 深度智识库
  • 云容笔谈效果展示:1024×1024艺术边框装裱人像——东方红颜超清细节实拍级呈现
  • AIGlasses_for_navigation基础教程:盲道分割模型yolo-seg.pt加载与推理优化
  • 服务不错的商铺装修企业怎么收费,哪家比较好? - 工业推荐榜
  • coze-loop快速上手:粘贴即优化,5分钟掌握AI重构与思路解释
  • 避坑指南|西安酒店装修厂家排名,告别报价混乱、保修无保障 - 朴素的承诺
  • Z-Image-Turbo孙珍妮LoRA模型实战:从CSDN文档到真实图片生成的端到端复现
  • 千层架制造厂哪家售后好,如何挑选到满意的? - myqiye
  • AIGlasses_for_navigation惊艳效果:盲道像素级分割+中心线拟合动态轨迹生成
  • LiuJuan20260223Zimage多平台部署:Docker/Kubernetes环境下Xinference集群化实践
  • Nanbeige4.1-3B Chainlit高级功能:多会话标签管理+跨对话上下文引用
  • 解锁数据库极速引擎:索引底层机制、聚簇与非聚簇之争及性能避坑指南
  • translategemma-27b-it环境部署:无需conda/pip,Ollama镜像开箱即用