123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- using ShakerManger.ViewModel;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ShakerManger.Susi4
- {
- internal class DevPinInfo
- {
- public UInt32 ID;
- private string _Name = "";
- public string Name
- {
- get { return _Name; }
- }
- override public string ToString()
- {
- return String.Format("{0} ({1})", ID, Name);
- }
- public DevPinInfo(UInt32 DeviceID)
- {
- ID = DeviceID;
- UInt32 Length = 32;
- StringBuilder sb = new StringBuilder((int)Length);
- if (SusiLib.SusiBoardGetStringA(SusiLib.SUSI_ID_MAPPING_GET_NAME_GPIO(ID), sb, ref Length) == SusiLib.SusiStatus.SUCCESS)
- {
- _Name = sb.ToString();
- }
- }
- }
- internal class DeviceInfo
- {
- public UInt32 Index { get; }
- public UInt32 ID { get; }
- public UInt32 SupportInput { get; }
- public UInt32 SupportOutput { get;}
- public DeviceInfo(UInt32 index, UInt32 deviceID, UInt32 input, UInt32 output)
- {
- Index = index;
- ID = deviceID;
- SupportInput = input;
- SupportOutput = output;
- UInt32 mask = 1;
- List<DevPinInfo> pin = new List<DevPinInfo>();
- for (int i = 0; i < 32; i++)
- {
- if((SupportInput &mask)>0 || (SupportOutput & mask)>0 )
- {
- pin.Add(new DevPinInfo((UInt32)((Index << 5) + i)));
- }
- mask <<= 1;
- }
- DevPinInfos = pin.AsReadOnly();
- }
- public IReadOnlyList<DevPinInfo> DevPinInfos { get; }
- }
-
- internal class SusiGPIOControl
- {
- public int PinIndex { get; set; } = 0;
- [AllowNull]
- public IReadOnlyList<DeviceInfo> DeviceInfos { get; private set; }
- private bool isinited = false;
- public void Init()
- {
- if (isinited) return;
- IsSupport = false;
- try
- {
- var status = Susi4.SusiLib.SusiLibInitialize();
- if(status != SusiLib.SusiStatus.SUCCESS && status!= SusiLib.SusiStatus.INITIALIZED)
- {
- MainWindowViewModel.Default.LogManger.AddLog("GPIO初始化错误!", Shaker.Model.LogType.Error);
- return;
- }
- isinited = true;
- }
- catch
- {
- }
- InitializeGPIO();
- if(DeviceInfos.Count > 0)
- {
- var status = SusiLib.SusiGPIOSetDirection(DeviceInfos[0].DevPinInfos[PinIndex].ID, 1, SusiLib.GPIODirection.INPUT);
- if (status != SusiLib.SusiStatus.SUCCESS)
- {
- MainWindowViewModel.Default.LogManger.AddLog($"GPIO设置错误!");
- }
- else
- {
- IsSupport = true;
- }
- }
- }
- private SusiLib.GPIOLevel level = SusiLib.GPIOLevel.LOW;
- public bool GetLevel()
- {
- if (!IsSupport) return false;
- try
- {
- var status = SusiLib.SusiGPIOGetLevel(DeviceInfos[0].DevPinInfos[PinIndex].ID, 1, ref level);
- if (status != SusiLib.SusiStatus.SUCCESS) return false;
- }
- catch
- {
- return false;
- }
- return level == SusiLib.GPIOLevel.HIGH;
- }
- private void InitializeGPIO()
- {
- List<DeviceInfo> infos = new List<DeviceInfo>();
- try
- {
- for (uint i = 0; i < Susi4.SusiLib.MAX_BANK_NUM; i++)
- {
- SusiLib.SusiStatus status = SusiLib.SusiStatus.ERROR;
- SusiLib.SusiStatus status1 = SusiLib.SusiStatus.ERROR;
- uint id = Susi4.SusiLib.SUSI_ID_GPIO_BANK(i);
- uint value1 = 0, value = 0;
- status = SusiLib.SusiGPIOGetCaps(id, SusiLib.GPIOCapabilitiesID.INPUT_SUPPORT, ref value);
- status1 = SusiLib.SusiGPIOGetCaps(id, SusiLib.GPIOCapabilitiesID.OUTPUT_SUPPORT, ref value1);
- if (status == SusiLib.SusiStatus.SUCCESS || status1 == SusiLib.SusiStatus.SUCCESS)
- {
- DeviceInfo info = new DeviceInfo(i, id, status == SusiLib.SusiStatus.SUCCESS ? value : 0, status1 == SusiLib.SusiStatus.SUCCESS ? value : 0);
- infos.Add(info);
- }
- }
- }
- catch
- {
- }
- DeviceInfos = infos.AsReadOnly();
- }
- public bool IsSupport { get; private set; } = false;
- private SusiGPIOControl()
- {
- }
- static SusiGPIOControl()
- {
- }
- public void Close()
- {
- if (!isinited) return;
- try
- {
- SusiLib.SusiLibUninitialize();
- }
- catch
- {
- }
- isinited = false;
- }
- public static SusiGPIOControl Default { get; } = new SusiGPIOControl();
- }
- }
|