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 { /// /// 计算机后面板GPIO的控制类,用于控制八路一分二射频开关,该开关主要作用是切换衰减器与陷波器,ON为陷波器接通,OFF为衰减器接通。 /// 启用端口2,4,6,8,10,12,14,16八个端口,其他未使用。 /// 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); /// /// 初始化PC机后方所有的端口设置为输出端口 /// 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); } } } /// /// 向端口写入高低电平信号 /// /// dat[0]为GPIO1-8,dat[1]为GPIO9-16 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); } } } /// /// 开关控制,通道号为0则开关全部端口,1-8则为有效闭合其中一个“一分二”开关 /// /// 通道号 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); } /// /// 8路全切换至衰减器通道(一分二射频开关全OFF) /// public void AllSwitchAttenuator() { ushort[] dat = { 0x00,0x00 }; WriteOut(dat); } /// /// 8路全切换至陷波器通道(一分二射频开关全ON) /// public void AllSwitchBandstopft() { ushort[] dat = { 0xFF, 0xFF }; WriteOut(dat); } } }