1 /* 2 * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha (at) intel.com> 3 * Author: Rafael Neri <rafael.neri (at) gmail.com> 4 * Copyright (c) 2014-2015 Intel Corporation. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sublicense, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be 15 * included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 #include <iostream> 27 #include <string> 28 #include <stdexcept> 29 #include <unistd.h> 30 #include <stdlib.h> 31 #include <functional> 32 33 #include "hcsr04.h" 34 35 using namespace upm; 36 37 #ifdef JAVACALLBACK 38 HCSR04::HCSR04 (uint8_t triggerPin, uint8_t echoPin, IsrCallback *cb) 39 { 40 HCSR04 (triggerPin, echoPin, generic_callback_isr); 41 } 42 #endif 43 44 HCSR04::HCSR04 (uint8_t triggerPin, uint8_t echoPin, void (*fptr)(void *)) { 45 mraa_result_t error = MRAA_SUCCESS; 46 m_name = "HCSR04"; 47 48 m_triggerPinCtx = mraa_gpio_init (triggerPin); 49 if (m_triggerPinCtx == NULL) { 50 throw std::invalid_argument(std::string(__FUNCTION__) + 51 ": mraa_pwm_init() failed, invalid pin?"); 52 return; 53 } 54 55 mraa_gpio_dir(m_triggerPinCtx, MRAA_GPIO_OUT); 56 mraa_gpio_write (m_triggerPinCtx, 0); 57 58 m_echoPinCtx = mraa_gpio_init(echoPin); 59 if (m_echoPinCtx == NULL) { 60 throw std::invalid_argument(std::string(__FUNCTION__) + 61 ": mraa_gpio_init() failed, invalid pin?"); 62 return; 63 } 64 65 mraa_gpio_dir(m_echoPinCtx, MRAA_GPIO_IN); 66 mraa_gpio_isr(m_echoPinCtx, MRAA_GPIO_EDGE_BOTH, fptr, NULL); 67 } 68 69 HCSR04::~HCSR04 () { 70 mraa_result_t error = MRAA_SUCCESS; 71 72 error = mraa_gpio_close (m_triggerPinCtx); 73 if (error != MRAA_SUCCESS) { 74 mraa_result_print (error); 75 } 76 77 error = mraa_gpio_close (m_echoPinCtx); 78 if (error != MRAA_SUCCESS) { 79 mraa_result_print (error); 80 } 81 } 82 83 double 84 HCSR04::timing() { 85 mraa_gpio_write (m_triggerPinCtx, 1); 86 usleep(10); 87 mraa_gpio_write (m_triggerPinCtx, 0); 88 89 m_doWork = 0; 90 m_InterruptCounter = 0; 91 while (!m_doWork) { 92 usleep (5); 93 } 94 95 return m_FallingTimeStamp - m_RisingTimeStamp; 96 } 97 98 void 99 HCSR04::ackEdgeDetected () { 100 struct timeval timer; 101 gettimeofday(&timer, NULL); 102 103 ++m_InterruptCounter; 104 if (!(m_InterruptCounter % 2)) { 105 m_FallingTimeStamp = 1000000 * timer.tv_sec + timer.tv_usec; 106 m_doWork = 1; 107 } else { 108 m_RisingTimeStamp = 1000000 * timer.tv_sec + timer.tv_usec; 109 } 110 } 111 112 double 113 HCSR04::getDistance(int sys) 114 { 115 double _timing = timing(); 116 if (sys) 117 { 118 return (_timing/2) / 29.1; 119 } else { 120 return (_timing/2) / 74.1; 121 } 122 } 123