123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.Threading;
- namespace Tps_LQ_Transmitter.com
- {
- /// <summary>
- /// 计算机后面板GPIO的控制类,用于控制八路一分二射频开关,该开关主要作用是切换衰减器与陷波器,ON为陷波器接通,OFF为衰减器接通。
- /// 启用端口2,4,6,8,10,12,14,16八个端口,其他未使用。
- /// </summary>
- public class PcGpio
- {
- [DllImport("inpout32.dll", CallingConvention = CallingConvention.Winapi)]
- public extern static void Out32(ushort add, ushort dat);
- [DllImport("inpout32.dll", CallingConvention = CallingConvention.Winapi)]
- public extern static ushort Inp32(ushort add);
- /// <summary>
- /// 初始化PC机后方所有的端口设置为输出端口
- /// </summary>
- public void InitSetOut()
- {
- ushort dwPortVal;
- Out32(0xF040, (0xFF));
- Out32((0xF043), (0x06)); //GPIO1 ~GPIO8
- Out32((0xF044), (0x40)); //address
- Out32((0xF045), (0x00)); // 0 = Output
- Out32((0xF042), (0x48));
- for (int i = 0; i < 100; i++)
- {
- dwPortVal = Inp32(0xF040);
- if (dwPortVal == 0x42){break;} else{Thread.Sleep(1);}
- }
- Out32(0xF040, (0xFF));
- Out32((0xF043), (0x07)); //GPIO9 ~GPIO16
- Out32((0xF044), (0x40)); //address
- Out32((0xF045), (0x00)); // 0 = Output
- Out32((0xF042), (0x48));
- for (int i = 0; i < 100; i++)
- {
- dwPortVal = Inp32(0xF040);
- if (dwPortVal == 0x42) { break; } else { Thread.Sleep(1); }
- }
- }
- /// <summary>
- /// 向端口写入高低电平信号
- /// </summary>
- /// <param name="dat">dat[0]为GPIO1-8,dat[1]为GPIO9-16</param>
- public void WriteOut(ushort[] dat)
- {
- ushort dwPortVal;
- Out32(0xF040, (0xFF));
- Out32((0xF043), (0x02)); //GPIO1 ~GPIO8
- Out32((0xF044), (0x40)); //address
- Out32((0xF045), (dat[0])); // 0 = Output
- Out32((0xF042), (0x48));
- for (int i = 0; i < 100; i++)
- {
- dwPortVal = Inp32(0xF040);
- if (dwPortVal == 0x42) { break; } else { Thread.Sleep(1); }
- }
- Out32(0xF040, (0xFF));
- Out32((0xF043), (0x03)); //GPIO9 ~GPIO16
- Out32((0xF044), (0x40)); //address
- Out32((0xF045), (dat[1])); // 0 = Output
- Out32((0xF042), (0x48));
- for (int i = 0; i < 100; i++)
- {
- dwPortVal = Inp32(0xF040);
- if (dwPortVal == 0x42) { break; } else { Thread.Sleep(1); }
- }
- }
- /// <summary>
- /// 开关控制,通道号为0则开关全部端口,1-8则为有效闭合其中一个“一分二”开关
- /// </summary>
- /// <param name="ch">通道号</param>
- public void SwitchControl(int ch)
- {
- ushort[] dat = new ushort[2];
- int chPlay = ch;
- switch (ch)
- {
- case 1:
- chPlay = 7;
- break;
- case 2:
- chPlay = 5;
- break;
- case 3:
- chPlay = 3;
- break;
- case 4:
- chPlay = 1;
- break;
- case 5:
- chPlay = 8;
- break;
- case 6:
- chPlay = 6;
- break;
- case 7:
- chPlay = 4;
- break;
- case 8:
- chPlay = 2;
- break;
- default:
- chPlay = ch;
- break;
- }
- switch (chPlay)
- {
- case 1:
- dat[0] = 0x02;
- dat[1] = 0x00;
- break;
- case 2:
- dat[0] = 0x08;
- dat[1] = 0x00;
- break;
- case 3:
- dat[0] = 0x20;
- dat[1] = 0x00;
- break;
- case 4:
- dat[0] = 0x80;
- dat[1] = 0x00;
- break;
- case 5:
- dat[0] = 0x00;
- dat[1] = 0x02;
- break;
- case 6:
- dat[0] = 0x00;
- dat[1] = 0x08;
- break;
- case 7:
- dat[0] = 0x00;
- dat[1] = 0x20;
- break;
- case 8:
- dat[0] = 0x00;
- dat[1] = 0x80;
- break;
- default:
- dat[0] = 0x00;
- dat[1] = 0x00;
- break;
- }
- WriteOut(dat);
- }
- /// <summary>
- /// 8路全切换至衰减器通道(一分二射频开关全OFF)
- /// </summary>
- public void AllSwitchAttenuator()
- {
- ushort[] dat = { 0x00,0x00 };
- WriteOut(dat);
- }
- /// <summary>
- /// 8路全切换至陷波器通道(一分二射频开关全ON)
- /// </summary>
- public void AllSwitchBandstopft()
- {
- ushort[] dat = { 0xFF, 0xFF };
- WriteOut(dat);
- }
- }
- }
|