No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Driver.cs 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Device.Gpio;
  4. using System.Net;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace Iot.Device.Pigpio
  8. {
  9. /// <summary>
  10. ///
  11. /// </summary>
  12. public class Driver : GpioDriver
  13. {
  14. private readonly IPEndPoint _endpoint;
  15. private readonly PigpiodIf _proxy;
  16. private readonly List<int> _openPins;
  17. /// <summary>
  18. ///
  19. /// </summary>
  20. /// <param name="endpoint"></param>
  21. public Driver(IPEndPoint endpoint)
  22. {
  23. _endpoint = endpoint;
  24. _proxy = new PigpiodIf();
  25. _openPins = new List<int>();
  26. }
  27. /// <summary>
  28. ///
  29. /// </summary>
  30. /// <returns></returns>
  31. public Task ConnectAsync()
  32. {
  33. _proxy.pigpio_start(_endpoint.Address.ToString(), _endpoint.Port.ToString());
  34. return Task.CompletedTask;
  35. }
  36. /// <inheritdoc/>
  37. protected override int PinCount => PigpiodIf.PI_MAX_USER_GPIO;
  38. /// <summary>
  39. ///
  40. /// </summary>
  41. /// <param name="pinNumber"></param>
  42. /// <param name="eventTypes"></param>
  43. /// <param name="callback"></param>
  44. protected override void AddCallbackForPinValueChangedEvent(int pinNumber, PinEventTypes eventTypes, PinChangeEventHandler callback)
  45. {
  46. throw new NotImplementedException();
  47. }
  48. /// <inheritdoc/>
  49. protected override void ClosePin(int pinNumber)
  50. {
  51. if (_openPins.Contains(pinNumber))
  52. {
  53. _openPins.Remove(pinNumber);
  54. }
  55. else
  56. {
  57. throw new InvalidOperationException($"Pin '{pinNumber}' hasn't been opened");
  58. }
  59. }
  60. /// <inheritdoc/>
  61. protected override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber)
  62. {
  63. throw new NotImplementedException();
  64. }
  65. /// <inheritdoc/>
  66. protected override PinMode GetPinMode(int pinNumber)
  67. {
  68. var mode = _proxy.get_mode((uint)pinNumber);
  69. switch (mode)
  70. {
  71. case PigpiodIf.PI_INPUT: return PinMode.Input;
  72. case PigpiodIf.PI_OUTPUT: return PinMode.Output;
  73. default: throw new ArgumentException($"Unknown PinMode value '{mode}'");
  74. }
  75. }
  76. /// <inheritdoc/>
  77. protected override bool IsPinModeSupported(int pinNumber, PinMode mode)
  78. {
  79. switch (mode)
  80. {
  81. case PinMode.Input: return true;
  82. case PinMode.InputPullUp: return true;
  83. case PinMode.InputPullDown: return true;
  84. case PinMode.Output: return true;
  85. default: return false; // Only input & output supported ATM. Should be increased to support input-pullup/pulldown
  86. }
  87. }
  88. /// <inheritdoc/>
  89. protected override void OpenPin(int pinNumber)
  90. {
  91. if (!_openPins.Contains(pinNumber))
  92. {
  93. _openPins.Add(pinNumber);
  94. }
  95. else
  96. {
  97. throw new InvalidOperationException($"Pin '{pinNumber}' is already been open");
  98. }
  99. }
  100. /// <inheritdoc/>
  101. protected override PinValue Read(int pinNumber)
  102. {
  103. return _proxy.gpio_read((uint)pinNumber);
  104. }
  105. /// <inheritdoc/>
  106. protected override void RemoveCallbackForPinValueChangedEvent(int pinNumber, PinChangeEventHandler callback)
  107. {
  108. throw new NotImplementedException();
  109. }
  110. /// <inheritdoc/>
  111. protected override void SetPinMode(int pinNumber, PinMode pinMode)
  112. {
  113. var mode = pinMode.AsMode();
  114. var pud = pinMode.AsPullUpDown();
  115. _proxy.set_mode((uint)pinNumber, mode);
  116. _proxy.set_pull_up_down((uint)pinNumber, pud);
  117. }
  118. /// <inheritdoc/>
  119. protected override WaitForEventResult WaitForEvent(int pinNumber, PinEventTypes eventTypes, CancellationToken cancellationToken)
  120. {
  121. bool eventDetected = false;
  122. int oldValue = _proxy.gpio_read((uint)pinNumber);
  123. int newValue;
  124. while (!eventDetected)
  125. {
  126. newValue = _proxy.gpio_read ((uint)pinNumber);
  127. //Console.WriteLine(newValue);
  128. if ((eventTypes == PinEventTypes.Rising && newValue == 1 && oldValue == 0)
  129. || (eventTypes == PinEventTypes.Falling && newValue == 0 && oldValue == 1))
  130. eventDetected = true;
  131. oldValue = newValue;
  132. //System.Threading.Thread.Sleep(500);
  133. }
  134. WaitForEventResult result;
  135. result.EventTypes = eventTypes;
  136. result.TimedOut = false;
  137. return result;
  138. }
  139. /// <inheritdoc/>
  140. protected override void Write(int pinNumber, PinValue pinValue)
  141. {
  142. var value = pinValue.AsValue();
  143. _proxy.gpio_write((uint)pinNumber, value);
  144. }
  145. }
  146. }