SusiGPIOControl.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using ShakerManger.ViewModel;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.CodeAnalysis;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace ShakerManger.Susi4
  9. {
  10. internal class DevPinInfo
  11. {
  12. public UInt32 ID;
  13. private string _Name = "";
  14. public string Name
  15. {
  16. get { return _Name; }
  17. }
  18. override public string ToString()
  19. {
  20. return String.Format("{0} ({1})", ID, Name);
  21. }
  22. public DevPinInfo(UInt32 DeviceID)
  23. {
  24. ID = DeviceID;
  25. UInt32 Length = 32;
  26. StringBuilder sb = new StringBuilder((int)Length);
  27. if (SusiLib.SusiBoardGetStringA(SusiLib.SUSI_ID_MAPPING_GET_NAME_GPIO(ID), sb, ref Length) == SusiLib.SusiStatus.SUCCESS)
  28. {
  29. _Name = sb.ToString();
  30. }
  31. }
  32. }
  33. internal class DeviceInfo
  34. {
  35. public UInt32 Index { get; }
  36. public UInt32 ID { get; }
  37. public UInt32 SupportInput { get; }
  38. public UInt32 SupportOutput { get;}
  39. public DeviceInfo(UInt32 index, UInt32 deviceID, UInt32 input, UInt32 output)
  40. {
  41. Index = index;
  42. ID = deviceID;
  43. SupportInput = input;
  44. SupportOutput = output;
  45. UInt32 mask = 1;
  46. List<DevPinInfo> pin = new List<DevPinInfo>();
  47. for (int i = 0; i < 32; i++)
  48. {
  49. if((SupportInput &mask)>0 || (SupportOutput & mask)>0 )
  50. {
  51. pin.Add(new DevPinInfo((UInt32)((Index << 5) + i)));
  52. }
  53. mask <<= 1;
  54. }
  55. DevPinInfos = pin.AsReadOnly();
  56. }
  57. public IReadOnlyList<DevPinInfo> DevPinInfos { get; }
  58. }
  59. internal class SusiGPIOControl
  60. {
  61. public int PinIndex { get; set; } = 0;
  62. [AllowNull]
  63. public IReadOnlyList<DeviceInfo> DeviceInfos { get; private set; }
  64. private bool isinited = false;
  65. public void Init()
  66. {
  67. if (isinited) return;
  68. IsSupport = false;
  69. try
  70. {
  71. var status = Susi4.SusiLib.SusiLibInitialize();
  72. if(status != SusiLib.SusiStatus.SUCCESS && status!= SusiLib.SusiStatus.INITIALIZED)
  73. {
  74. MainWindowViewModel.Default.LogManger.AddLog("GPIO初始化错误!", Shaker.Model.LogType.Error);
  75. return;
  76. }
  77. isinited = true;
  78. }
  79. catch
  80. {
  81. }
  82. InitializeGPIO();
  83. if(DeviceInfos.Count > 0)
  84. {
  85. var status = SusiLib.SusiGPIOSetDirection(DeviceInfos[0].DevPinInfos[PinIndex].ID, 1, SusiLib.GPIODirection.INPUT);
  86. if (status != SusiLib.SusiStatus.SUCCESS)
  87. {
  88. MainWindowViewModel.Default.LogManger.AddLog($"GPIO设置错误!");
  89. }
  90. else
  91. {
  92. IsSupport = true;
  93. }
  94. }
  95. }
  96. private SusiLib.GPIOLevel level = SusiLib.GPIOLevel.LOW;
  97. public bool GetLevel()
  98. {
  99. if (!IsSupport) return false;
  100. try
  101. {
  102. var status = SusiLib.SusiGPIOGetLevel(DeviceInfos[0].DevPinInfos[PinIndex].ID, 1, ref level);
  103. if (status != SusiLib.SusiStatus.SUCCESS) return false;
  104. }
  105. catch
  106. {
  107. return false;
  108. }
  109. return level == SusiLib.GPIOLevel.HIGH;
  110. }
  111. private void InitializeGPIO()
  112. {
  113. List<DeviceInfo> infos = new List<DeviceInfo>();
  114. try
  115. {
  116. for (uint i = 0; i < Susi4.SusiLib.MAX_BANK_NUM; i++)
  117. {
  118. SusiLib.SusiStatus status = SusiLib.SusiStatus.ERROR;
  119. SusiLib.SusiStatus status1 = SusiLib.SusiStatus.ERROR;
  120. uint id = Susi4.SusiLib.SUSI_ID_GPIO_BANK(i);
  121. uint value1 = 0, value = 0;
  122. status = SusiLib.SusiGPIOGetCaps(id, SusiLib.GPIOCapabilitiesID.INPUT_SUPPORT, ref value);
  123. status1 = SusiLib.SusiGPIOGetCaps(id, SusiLib.GPIOCapabilitiesID.OUTPUT_SUPPORT, ref value1);
  124. if (status == SusiLib.SusiStatus.SUCCESS || status1 == SusiLib.SusiStatus.SUCCESS)
  125. {
  126. DeviceInfo info = new DeviceInfo(i, id, status == SusiLib.SusiStatus.SUCCESS ? value : 0, status1 == SusiLib.SusiStatus.SUCCESS ? value : 0);
  127. infos.Add(info);
  128. }
  129. }
  130. }
  131. catch
  132. {
  133. }
  134. DeviceInfos = infos.AsReadOnly();
  135. }
  136. public bool IsSupport { get; private set; } = false;
  137. private SusiGPIOControl()
  138. {
  139. }
  140. static SusiGPIOControl()
  141. {
  142. }
  143. public void Close()
  144. {
  145. if (!isinited) return;
  146. try
  147. {
  148. SusiLib.SusiLibUninitialize();
  149. }
  150. catch
  151. {
  152. }
  153. isinited = false;
  154. }
  155. public static SusiGPIOControl Default { get; } = new SusiGPIOControl();
  156. }
  157. }