1 /* 2 * Author: Brendan Le Foll <brendan.le.foll (at) intel.com> 3 * Contributions: Mihai Tudor Panu <mihai.tudor.panu (at) intel.com> 4 * Contributions: Sarah Knepper <sarah.knepper (at) intel.com> 5 * Copyright (c) 2014 Intel Corporation. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining 8 * a copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sublicense, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be 16 * included in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 #include <iostream> 28 #include <string> 29 #include <stdexcept> 30 31 #include "grove.h" 32 #include "math.h" 33 34 using namespace upm; 35 36 //// GroveLed //// 37 38 GroveLed::GroveLed(int pin) 39 { 40 if ( !(m_gpio = mraa_gpio_init(pin)) ) { 41 throw std::invalid_argument(std::string(__FUNCTION__) + 42 ": mraa_gpio_init() failed, invalid pin?"); 43 return; 44 } 45 mraa_gpio_dir(m_gpio, MRAA_GPIO_OUT); 46 m_name = "LED Socket"; 47 } 48 49 GroveLed::~GroveLed() 50 { 51 mraa_gpio_close(m_gpio); 52 } 53 54 mraa_result_t GroveLed::write(int value) 55 { 56 if (value >= 1) { 57 return mraa_gpio_write(m_gpio, 1); 58 } 59 return mraa_gpio_write(m_gpio, 0); 60 } 61 62 mraa_result_t GroveLed::on() 63 { 64 return write(1); 65 } 66 67 mraa_result_t GroveLed::off() 68 { 69 return write(0); 70 } 71 72 //// GroveRelay //// 73 74 GroveRelay::GroveRelay(unsigned int pin) 75 { 76 if ( !(m_gpio = mraa_gpio_init(pin)) ) { 77 throw std::invalid_argument(std::string(__FUNCTION__) + 78 ": mraa_gpio_init() failed, invalid pin?"); 79 return; 80 } 81 mraa_gpio_dir(m_gpio, MRAA_GPIO_OUT); 82 m_name = "Relay Switch"; 83 } 84 85 GroveRelay::~GroveRelay() 86 { 87 mraa_gpio_close(m_gpio); 88 } 89 90 mraa_result_t GroveRelay::on() 91 { 92 return mraa_gpio_write(m_gpio, 1); 93 } 94 95 mraa_result_t GroveRelay::off() 96 { 97 return mraa_gpio_write(m_gpio, 0); 98 } 99 100 bool GroveRelay::isOn() 101 { 102 return mraa_gpio_read(m_gpio) == 1; 103 } 104 105 bool GroveRelay::isOff() 106 { 107 return mraa_gpio_read(m_gpio) == 0; 108 } 109 110 //// GroveTemp //// 111 112 GroveTemp::GroveTemp(unsigned int pin) 113 { 114 if ( !(m_aio = mraa_aio_init(pin)) ) { 115 throw std::invalid_argument(std::string(__FUNCTION__) + 116 ": mraa_aio_init() failed, invalid pin?"); 117 return; 118 } 119 m_name = "Temperature Sensor"; 120 } 121 122 GroveTemp::~GroveTemp() 123 { 124 mraa_aio_close(m_aio); 125 } 126 127 int GroveTemp::value () 128 { 129 int a = mraa_aio_read(m_aio); 130 float r = (float)(1023.0-a)*10000.0/a; 131 float t = 1.0/(log(r/10000.0)/3975.0 + 1.0/298.15)-273.15; 132 return (int) round(t); 133 } 134 135 float GroveTemp::raw_value() 136 { 137 return (float) mraa_aio_read(m_aio); 138 } 139 140 //// GroveLight //// 141 142 GroveLight::GroveLight(unsigned int pin) 143 { 144 if ( !(m_aio = mraa_aio_init(pin)) ) { 145 throw std::invalid_argument(std::string(__FUNCTION__) + 146 ": mraa_aio_init() failed, invalid pin?"); 147 return; 148 } 149 m_name = "Light Sensor"; 150 } 151 152 GroveLight::~GroveLight() 153 { 154 mraa_aio_close(m_aio); 155 } 156 157 int GroveLight::value() 158 { 159 // rough conversion to lux, using formula from Grove Starter Kit booklet 160 float a = (float) mraa_aio_read(m_aio); 161 a = 10000.0/pow(((1023.0-a)*10.0/a)*15.0,4.0/3.0); 162 return (int) round(a); 163 } 164 165 float GroveLight::raw_value() 166 { 167 return (float) mraa_aio_read(m_aio); 168 } 169 170 //// GroveRotary //// 171 172 GroveRotary::GroveRotary(unsigned int pin) 173 { 174 if ( !(m_aio = mraa_aio_init(pin)) ) { 175 throw std::invalid_argument(std::string(__FUNCTION__) + 176 ": mraa_aio_init() failed, invalid pin?"); 177 return; 178 } 179 m_name = "Rotary Angle Sensor"; 180 } 181 182 GroveRotary::~GroveRotary() 183 { 184 mraa_aio_close(m_aio); 185 } 186 187 float GroveRotary::abs_value() 188 { 189 return (float) mraa_aio_read(m_aio); 190 } 191 192 float GroveRotary::abs_deg() 193 { 194 return GroveRotary::abs_value() * (float) m_max_angle / 1023.0; 195 } 196 197 float GroveRotary::abs_rad() 198 { 199 return GroveRotary::abs_deg() * M_PI / 180.0; 200 } 201 202 float GroveRotary::rel_value() 203 { 204 return GroveRotary::abs_value() - 512.0; 205 } 206 207 float GroveRotary::rel_deg() 208 { 209 return GroveRotary::rel_value() * (float) m_max_angle / 1023.0; 210 } 211 212 float GroveRotary::rel_rad() 213 { 214 return GroveRotary::rel_deg() * M_PI / 180.0; 215 } 216 217 //// GroveSlide //// 218 219 GroveSlide::GroveSlide(unsigned int pin, float ref_voltage) 220 { 221 if ( !(m_aio = mraa_aio_init(pin)) ) { 222 throw std::invalid_argument(std::string(__FUNCTION__) + 223 ": mraa_aio_init() failed, invalid pin?"); 224 return; 225 } 226 m_ref_voltage = ref_voltage; 227 m_name = "Slide Potentiometer"; 228 } 229 230 GroveSlide::~GroveSlide() 231 { 232 mraa_aio_close(m_aio); 233 } 234 235 float GroveSlide::raw_value() 236 { 237 return (float) mraa_aio_read(m_aio); 238 } 239 240 float GroveSlide::voltage_value() 241 { 242 // conversion to Volts 243 float a = GroveSlide::raw_value(); 244 a = m_ref_voltage * a / 1023.0 ; 245 return a; 246 } 247 248 float GroveSlide::ref_voltage() 249 { 250 return m_ref_voltage; 251 } 252 253 //// GroveButton //// 254 255 GroveButton::GroveButton(unsigned int pin) 256 { 257 if ( !(m_gpio = mraa_gpio_init(pin)) ) { 258 throw std::invalid_argument(std::string(__FUNCTION__) + 259 ": mraa_gpio_init() failed, invalid pin?"); 260 return; 261 } 262 mraa_gpio_dir(m_gpio, MRAA_GPIO_IN); 263 m_name = "Button Sensor"; 264 } 265 266 GroveButton::~GroveButton() 267 { 268 mraa_gpio_close(m_gpio); 269 } 270 271 std::string GroveButton::name() 272 { 273 return m_name; 274 } 275 276 int GroveButton::value() 277 { 278 return mraa_gpio_read(m_gpio); 279 } 280 281 #ifdef JAVACALLBACK 282 void GroveButton::installISR(mraa::Edge level, IsrCallback *cb) 283 { 284 installISR(level, generic_callback_isr, cb); 285 } 286 #endif 287 288 void GroveButton::installISR(mraa::Edge level, void (*isr)(void *), void *arg) 289 { 290 if (m_isrInstalled) 291 uninstallISR(); 292 293 // install our interrupt handler 294 mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) level, isr, arg); 295 m_isrInstalled = true; 296 } 297 298 void GroveButton::uninstallISR() 299 { 300 mraa_gpio_isr_exit(m_gpio); 301 m_isrInstalled = false; 302 } 303