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);
}
}
}