G-CAMS-DATU/applications/IO/inout.c
2024-07-12 16:22:49 +08:00

402 lines
9.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-05-06 lijian the first version
*/
#include <inout.h>
IO_t IO;
//输入端口列表
rt_base_t input_pins[] = { GET_PIN(C, 2),
GET_PIN(C, 3),
GET_PIN(A, 5),
GET_PIN(A, 6),
GET_PIN(A, 7),
GET_PIN(C, 4),
GET_PIN(A, 8),
GET_PIN(C, 9),
};
//输出端口列表
rt_base_t output_pins[] = {
// GET_PIN(B, 12), //4
// GET_PIN(B, 13), //5
// GET_PIN(B, 14), //6
// GET_PIN(B, 15), //7
// GET_PIN(C, 6), //8
// GET_PIN(C, 7), //3
// GET_PIN(C, 8), //2
// GET_PIN(A, 11), //1
GET_PIN(A, 11), //1
GET_PIN(C, 8), //2
GET_PIN(C, 7), //3
GET_PIN(B, 12), //4
GET_PIN(B, 13), //5
GET_PIN(B, 14), //6
GET_PIN(B, 15), //7
GET_PIN(C, 6), //8
};
/**
* 端口中断回调函数
* @param args
*/
void gpio_irq_callback(void *args)
{
rt_base_t pin = (rt_base_t) (uintptr_t) args; // 获取触发中断的引脚号
// rt_kprintf("pin: %#x", pin , IO.IO_Data[0].Temp_Count);
switch (pin)
{
case IN0:
IO.IO_Data[0].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin0:%d\n", IO.IO_Data[0].Temp_Count);
}
break;
case IN1:
IO.IO_Data[1].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin1:%d\n", IO.IO_Data[1].Temp_Count);
}
break;
case IN2:
IO.IO_Data[2].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin2:%d\n", IO.IO_Data[2].Temp_Count);
}
break;
case IN3:
IO.IO_Data[3].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin3:%d\n", IO.IO_Data[3].Temp_Count);
}
break;
case IN4:
IO.IO_Data[4].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin4:%d\n", IO.IO_Data[4].Temp_Count);
}
break;
case IN5:
IO.IO_Data[5].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin5:%d\n", IO.IO_Data[5].Temp_Count);
}
break;
case IN6:
IO.IO_Data[6].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin6:%d\n", IO.IO_Data[6].Temp_Count);
}
break;
case IN7:
IO.IO_Data[7].Temp_Count++;
if (IO.IO_Flag.log) {
rt_kprintf("Pin7:%d\n", IO.IO_Data[7].Temp_Count);
}
break;
default:
break;
}
}
//配置输入引脚
void configure_inpin(rt_base_t pin)
{
// 设置引脚模式为上拉输入
rt_pin_mode(pin, PIN_MODE_INPUT_PULLUP);
rt_kprintf(" pin: %d %#x\r\n", pin, pin);
/* 绑定中断,下降沿模式,回调函数名为 */
rt_pin_attach_irq(pin, PIN_IRQ_MODE_FALLING, gpio_irq_callback, (void *) (uintptr_t) pin);
/* 使能中断 */
rt_pin_irq_enable(pin, PIN_IRQ_ENABLE);
}
/**
* 输入引脚初始化
*/
void gpio_input_init(void)
{
rt_kprintf(" IN pin list:\r\n");
for (rt_uint8_t var = 0; var < INPUT_NUM; var++)
{
configure_inpin(input_pins[var]);
}
}
/**
* 输出引脚默认为高电平
* @param pin
*/
void configure_outpin(rt_base_t pin)
{
// 设置引脚模式为输出模式
rt_pin_mode(pin, PIN_MODE_OUTPUT);
// 默认为高电平
rt_pin_write(pin, PIN_HIGH);
}
//输出引脚初始化
void gpio_output_init(void)
{
for (rt_uint8_t var = 0; var < OUTPUT_NUM; var++)
{
configure_outpin(output_pins[var]);
}
}
//获取端口电平触发次数
rt_uint32_t get_IO_count(rt_uint8_t io)
{
return IO.IO_Data[io].Temp_Count;
}
//获取端口电平值
rt_uint8_t get_IO_Value()
{
return IO.IO_Flag.Value;
}
rt_uint8_t get_IO_NeedleCountUpdateFlag()
{
return IO.IO_Flag.NeedleCountUpdateFlag;
// return IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count;
}
void set_IO_NeedleCountUpdateFlag(rt_uint8_t flag)
{
IO.IO_Flag.NeedleCountUpdateFlag = flag;
}
void set_IO_Needle_io(rt_uint8_t io)
{
IO.IO_Flag.Needle_io = io;
}
rt_uint32_t get_IO_NeedleCount_sum()
{
return IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count;
// return IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_Sum;
}
void set_IO_NeedleCount_sum(rt_uint8_t count)
{
IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_Sum = count;
}
/**
* @brief 确认端口电平.当端口从高电平变为低电平代表次数+1
* @param none
* @return: None
*/
void updateKeyValue(void)
{
//#define IN0 0x22 //1
//#define IN1 0x23 //2 锁1状态
//#define IN2 0x5 //3 锁2状态
//#define IN3 0x6 //4 锁3状态
//#define IN4 0x7 //5 右盖板检测
//#define IN5 0x24 //6 左盖板检测
//#define IN6 0x8 //7 启停
//#define IN7 0x29 //8 主轴
IO.IO_Flag.Value |= rt_pin_read(IN0) << 0;
IO.IO_Flag.Value |= rt_pin_read(IN1) << 1;
IO.IO_Flag.Value |= rt_pin_read(IN2) << 2;
IO.IO_Flag.Value |= rt_pin_read(IN3) << 3;
IO.IO_Flag.Value |= rt_pin_read(IN4) << 4;
IO.IO_Flag.Value |= rt_pin_read(IN5) << 5;
IO.IO_Flag.Value |= rt_pin_read(IN6) << 6;
IO.IO_Flag.Value |= rt_pin_read(IN7) << 7;
IO.IO_Flag.Value = ~IO.IO_Flag.Value;
// rt_uint8_t i = 0;
//
// for (i = 0; i < INPUT_NUM; i++)
// {
// //跳过转速和针数口
// if (i == IO.IO_Flag.Speed_io || i==IO.IO_Flag.Needle_io)
// {
// continue;
// }
//
//
// if (rt_pin_read(input_pins[i]) == 0)
// {
// rt_thread_mdelay(10);
// if (rt_pin_read(input_pins[i]) == 0)
// {
// IO.IO_Data[i].Key = 1;
// IO.IO_Data[i].Key_Flag = 1;
// }
// }
// else
// {
// //rt_kprintf("\n");
// // rt_kprintf("key 0 \n");
// IO.IO_Data[i].Key = 0;
// }
// }
//
//
// for (i = 0; i < INPUT_NUM; i++)
// {
// if (IO.IO_Data[i].Key_Flag == 1)
// {
// if (IO.IO_Data[i].Key == 0)
// {
// IO.IO_Data[i].Count += 1;
// IO.IO_Data[i].Key_Flag = 0;
//
// rt_kprintf("\n", IO.IO_Data[i].Count);
// if (IO.IO_Flag.log) {
// rt_kprintf("Count: %d , temp count %d\n", IO.IO_Data[i].Count, IO.IO_Data[i].Temp_Count);
// }
// }
// }
// }
}
/**
* @brief 计算转速500毫秒的中断次数乘2为1秒次数1秒次数乘60为rpm单位转速
* @param none
* @return: None
*/
void updateSpeed(void)
{
rt_uint16_t tmp_start = 0;
rt_uint16_t tmp_end = 0;
//rt_tick_t tick_start = 0;
//rt_tick_t tick_end = 0;
rt_uint16_t temp = 0;
temp = IO.IO_Data[IO.IO_Flag.Speed_io].Speed;
tmp_start = IO.IO_Data[IO.IO_Flag.Speed_io].Temp_Count;
//tick_start = rt_tick_get_millisecond();
rt_thread_mdelay(500);
//tick_end = rt_tick_get_millisecond();
tmp_end = IO.IO_Data[IO.IO_Flag.Speed_io].Temp_Count;
if (tmp_end < tmp_start)
{
IO.IO_Data[IO.IO_Flag.Speed_io].Speed = (tmp_end + 65535 - tmp_start) * 120;
}
else
{
IO.IO_Data[IO.IO_Flag.Speed_io].Speed = (tmp_end - tmp_start) * 120;
}
if (IO.IO_Flag.log)
{
rt_kprintf("Speed: %d %d\n", IO.IO_Flag.Speed_io + 1, IO.IO_Data[IO.IO_Flag.Speed_io].Speed);
}
// if(tmp_end < tmp_start){
// IO.IO_Data[i].Temp_Speed = (tmp_end + 65535 - tmp_start) / ((tick_end - tick_start) / 1000);
// }
// else {
// IO.IO_Data[i].Temp_Speed = (tmp_end - tmp_start) / ((tick_end - tick_start) / 1000);
// }
if (temp != IO.IO_Data[IO.IO_Flag.Speed_io].Speed)
{
IO.IO_Flag.SpeedUpdateFlag = 1;
}
else
{
IO.IO_Flag.SpeedUpdateFlag = 0;
}
}
/**
* @brief 计算针数500毫秒的中断次数NeedleCount为临时针数会清零NeedleCount_Sum为针数总和
* @param none
* @return: None
*/
void updateNeedleCount(void)
{
//
if (IO.IO_Data[IO.IO_Flag.Needle_io].Count!=IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count) {
IO.IO_Data[IO.IO_Flag.Needle_io].Count = IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count;
IO.IO_Flag.NeedleCountUpdateFlag = 1;
}
return;
//DATU需求
// rt_thread_mdelay(500);
// rt_uint32_t tempCount = 0;
// if ((IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count - tempCount))
// {
// IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount = IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count - IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_last;
// IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_Sum += IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount;
// IO.IO_Flag.NeedleCountUpdateFlag = 1;
// //微工厂需求针数要没有变化清零下列注释NeedleCount_Sum+=变为=
// IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount = 0;
// IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_last = IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count;
// if (IO.IO_Flag.log) {
// rt_kprintf("NeedleCount: %d %d\n", IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_Sum, IO.IO_Flag.Needle_io);
// }
// }
// else
// {
// IO.IO_Flag.NeedleCountUpdateFlag = 0;
// IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount = 0;
// IO.IO_Data[IO.IO_Flag.Needle_io].NeedleCount_last = IO.IO_Data[IO.IO_Flag.Needle_io].Temp_Count;
//
// }
}
//控制台更改电平
void IO_key(int argc, char**argv)
{
rt_uint8_t var = atoi(argv[1]);
rt_uint8_t var2 = atoi(argv[2]);
if (var2)
{
rt_pin_write(output_pins[var], PIN_HIGH);
}
else
{
rt_pin_write(output_pins[var], PIN_LOW);
}
}
MSH_CMD_EXPORT(IO_key, <0-7> <0-1>);
void set_IO_log(rt_uint8_t log){
IO.IO_Flag.log = log;
}