Guest User

Untitled

a guest
Jul 31st, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1. package org.eclipse.leshan.client.demo;
  2.  
  3. import java.math.BigDecimal;
  4. import java.math.RoundingMode;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.ScheduledExecutorService;
  7. import java.util.concurrent.TimeUnit;
  8.  
  9.  
  10. import org.eclipse.leshan.client.resource.BaseInstanceEnabler;
  11. import org.eclipse.leshan.core.response.ExecuteResponse;
  12. import org.eclipse.leshan.core.response.ReadResponse;
  13. import org.eclipse.leshan.util.NamedThreadFactory;
  14.  
  15. import com.pi4j.io.gpio.GpioController;
  16. import com.pi4j.io.gpio.GpioFactory;
  17. import com.pi4j.io.gpio.GpioPinDigitalInput;
  18. import com.pi4j.io.gpio.GpioPinDigitalOutput;
  19. import com.pi4j.io.gpio.PinPullResistance;
  20. import com.pi4j.io.gpio.RaspiPin;
  21.  
  22.  
  23. public class DistanceSensor extends BaseInstanceEnabler {
  24.  
  25. private static GpioPinDigitalOutput sensorTriggerPin ;
  26. private static GpioPinDigitalInput sensorEchoPin ;
  27.  
  28. final static GpioController gpio = GpioFactory.getInstance();
  29.  
  30.  
  31. private static final String UNIT_CENTIMETER = "cm";
  32. private static final int SENSOR_VALUE = 5700;
  33. private static final int UNITS = 5701;
  34. private static final int MAX_MEASURED_VALUE = 5602;
  35. private static final int MIN_MEASURED_VALUE = 5601;
  36. private static final int RESET_MIN_MAX_MEASURED_VALUES = 5605;
  37. private final ScheduledExecutorService scheduler;
  38.  
  39. private double currentDistance = 0d;
  40. private double minMeasuredValue = currentDistance;
  41. private double maxMeasuredValue = currentDistance;
  42.  
  43.  
  44. public DistanceSensor( ) {
  45.  
  46. this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Temperature Sensor"));
  47. scheduler.scheduleAtFixedRate(new Runnable() {
  48.  
  49. @Override
  50. public void run() {
  51. adjustDistance();
  52. }
  53.  
  54.  
  55. }, 2, 5, TimeUnit.SECONDS);
  56.  
  57.  
  58.  
  59.  
  60. }
  61.  
  62. public synchronized ReadResponse read(int resourceId) {
  63. switch (resourceId) {
  64. case MIN_MEASURED_VALUE:
  65. return ReadResponse.success(resourceId, getTwoDigitValue(minMeasuredValue));
  66. case MAX_MEASURED_VALUE:
  67. return ReadResponse.success(resourceId, getTwoDigitValue(maxMeasuredValue));
  68. case SENSOR_VALUE:
  69. return ReadResponse.success(resourceId, getTwoDigitValue(currentDistance));
  70. case UNITS:
  71. return ReadResponse.success(resourceId, UNIT_CENTIMETER);
  72. default:
  73. return super.read(resourceId);
  74. }
  75. }
  76.  
  77. @Override
  78. public synchronized ExecuteResponse execute(int resourceId, String params) {
  79. switch (resourceId) {
  80. case RESET_MIN_MAX_MEASURED_VALUES:
  81. resetMinMaxMeasuredValues();
  82. return ExecuteResponse.success();
  83. default:
  84. return super.execute(resourceId, params);
  85. }
  86. }
  87.  
  88. private double getTwoDigitValue(double value) {
  89. BigDecimal toBeTruncated = BigDecimal.valueOf(value);
  90. return toBeTruncated.setScale(2, RoundingMode.HALF_UP).doubleValue();
  91. }
  92.  
  93.  
  94. private synchronized void adjustDistance() {
  95.  
  96. sensorTriggerPin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04);
  97. sensorEchoPin = gpio.provisionDigitalInputPin(RaspiPin.GPIO_05,PinPullResistance.PULL_DOWN);
  98.  
  99. sensorTriggerPin.low();
  100. try {
  101. Thread.sleep(2000);
  102. sensorTriggerPin.high();
  103. Thread.sleep((long) 0.00001);
  104. sensorTriggerPin.low();
  105.  
  106. while(sensorEchoPin.isLow()){
  107. }
  108. long startTime= System.nanoTime();
  109.  
  110. while(sensorEchoPin.isHigh()){
  111. }
  112. long endTime= System.nanoTime();
  113.  
  114. currentDistance = ((((endTime - startTime)/1e3)/2) / 29.1);
  115.  
  116. Integer changedResource = adjustMinMaxMeasuredValue(currentDistance);
  117. if (changedResource != null) {
  118. fireResourcesChange(SENSOR_VALUE, changedResource);
  119. } else {
  120. fireResourcesChange(SENSOR_VALUE);
  121. }
  122. Thread.sleep(1000);
  123.  
  124. }
  125. catch (InterruptedException e) {
  126. e.printStackTrace();
  127. }
  128.  
  129.  
  130. }
  131.  
  132. private Integer adjustMinMaxMeasuredValue(double newDistance) {
  133.  
  134. if (newDistance > maxMeasuredValue) {
  135. maxMeasuredValue = newDistance;
  136. return MAX_MEASURED_VALUE;
  137. } else if (newDistance < minMeasuredValue) {
  138. minMeasuredValue = newDistance;
  139. return MIN_MEASURED_VALUE;
  140. } else {
  141. return null;
  142. }
  143. }
  144.  
  145. private void resetMinMaxMeasuredValues() {
  146. minMeasuredValue = currentDistance;
  147. maxMeasuredValue = currentDistance;
  148. }
  149.  
  150.  
  151. }
Advertisement
Add Comment
Please, Sign In to add comment