From 63b244cfc356c60fe56ebf40d60c710defcdf5f0 Mon Sep 17 00:00:00 2001 From: Alex Tereschenko Date: Sun, 10 Jul 2016 17:40:11 +0200 Subject: [PATCH] mock: added AIO pin and logic Signed-off-by: Alex Tereschenko Signed-off-by: Brendan Le Foll --- docs/mock.md | 12 ++++---- include/mock/mock_board.h | 2 +- src/mock/mock_board.c | 33 ++++++++++++++++++++ tests/mock/CMakeLists.txt | 3 ++ tests/mock/aio_checks.py | 58 +++++++++++++++++++++++++++++++++++ tests/mock/platform_checks.py | 2 +- 6 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 tests/mock/aio_checks.py diff --git a/docs/mock.md b/docs/mock.md index f9d146e..cda46e0 100644 --- a/docs/mock.md +++ b/docs/mock.md @@ -12,17 +12,17 @@ Board configuration ------------------- This feature is yet in the experimental mode and not all functionality is available. -Right now we simulate a single generic board with only GPIO (without ISR) working. -It also reports having an ADC with 10 (std)/12 (max) bit resolution, but the ADC -functionality itself is not yet implemented. +Right now we simulate a single generic board with GPIO (without ISR) and +an ADC with 10 (std)/12 (max) bit resolution, which returns random values on read. We plan to develop it further and all [contributions](../CONTRIBUTING.md) are more than welcome. See the table below for pin layout and features -| MRAA Number | Pin Name | Notes | -|-------------|----------|-----------------------------| -| 0 | GPIO0 | GPIO pin, no muxing, no ISR | +| MRAA Number | Pin Name | Notes | +|-------------|----------|---------------------------------------| +| 0 | GPIO0 | GPIO pin, no muxing, no ISR | +| 1 | ADC0 | AIO pin, returns random value on read | Building -------- diff --git a/include/mock/mock_board.h b/include/mock/mock_board.h index 922dbf9..3a770c8 100644 --- a/include/mock/mock_board.h +++ b/include/mock/mock_board.h @@ -30,7 +30,7 @@ extern "C" { #include "mraa_internal.h" -#define MRAA_MOCK_PINCOUNT 1 +#define MRAA_MOCK_PINCOUNT 2 mraa_board_t* mraa_mock_board(); diff --git a/src/mock/mock_board.c b/src/mock/mock_board.c index 9fccf42..f27aaf0 100644 --- a/src/mock/mock_board.c +++ b/src/mock/mock_board.c @@ -131,6 +131,29 @@ mraa_mock_gpio_mode_replace(mraa_gpio_context dev, mraa_gpio_mode_t mode) return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED; } +mraa_result_t +mraa_mock_aio_init_internal_replace(mraa_aio_context dev, int pin) +{ + dev->channel = pin; + return MRAA_SUCCESS; +} + +mraa_result_t +mraa_mock_aio_close_replace(mraa_aio_context dev) +{ + free(dev); + return MRAA_SUCCESS; +} + +int +mraa_mock_aio_read_replace(mraa_aio_context dev) +{ + // return some random number between 0 and max value, based on the resolution + int max_value = (1 << dev->value_bit) - 1; + srand(time(NULL)); + return rand() % max_value; +} + mraa_board_t* mraa_mock_board() { @@ -142,6 +165,7 @@ mraa_mock_board() // General board definitions b->platform_name = PLATFORM_NAME; b->phy_pin_count = MRAA_MOCK_PINCOUNT; + b->gpio_count = 1; b->aio_count = 1; b->adc_raw = 12; b->adc_supported = 10; @@ -174,6 +198,9 @@ mraa_mock_board() b->adv_func->gpio_isr_replace = &mraa_mock_gpio_isr_replace; b->adv_func->gpio_isr_exit_replace = &mraa_mock_gpio_isr_exit_replace; b->adv_func->gpio_mode_replace = &mraa_mock_gpio_mode_replace; + b->adv_func->aio_init_internal_replace = &mraa_mock_aio_init_internal_replace; + b->adv_func->aio_close_replace = &mraa_mock_aio_close_replace; + b->adv_func->aio_read_replace = &mraa_mock_aio_read_replace; // Pin definitions int pos = 0; @@ -184,6 +211,12 @@ mraa_mock_board() b->pins[pos].gpio.mux_total = 0; pos++; + strncpy(b->pins[pos].name, "ADC0", 8); + b->pins[pos].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 }; + b->pins[pos].aio.pinmap = 0; + b->pins[pos].aio.mux_total = 0; + pos++; + return b; error: diff --git a/tests/mock/CMakeLists.txt b/tests/mock/CMakeLists.txt index be2cef5..b072021 100644 --- a/tests/mock/CMakeLists.txt +++ b/tests/mock/CMakeLists.txt @@ -8,6 +8,8 @@ add_test (NAME py_gpio_edge COMMAND ${PYTHON_DEFAULT_EXECUTABLE} ${CMAKE_CURRENT add_test (NAME py_gpio_isr COMMAND ${PYTHON_DEFAULT_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gpio_checks_isr.py) add_test (NAME py_gpio_mode COMMAND ${PYTHON_DEFAULT_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gpio_checks_mode.py) +add_test (NAME py_aio COMMAND ${PYTHON_DEFAULT_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/aio_checks.py) + set_tests_properties(py_general py_platform py_gpio_basic @@ -16,4 +18,5 @@ set_tests_properties(py_general py_gpio_edge py_gpio_isr py_gpio_mode + py_aio PROPERTIES ENVIRONMENT "PYTHONPATH=${PYTHON_DEFAULT_PYTHONPATH}") diff --git a/tests/mock/aio_checks.py b/tests/mock/aio_checks.py new file mode 100644 index 0000000..3cc7b45 --- /dev/null +++ b/tests/mock/aio_checks.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Author: Alex Tereschenko +# Copyright (c) 2016 Alex Tereschenko. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import mraa as m +import unittest as u + +MRAA_AIO_TEST_PIN = 0 +PLATFORM_STD_ADC_RES_BITS = 10 +PLATFORM_MAX_ADC_RES_BITS = 12 + +class AioChecks(u.TestCase): + def setUp(self): + self.pin = m.Aio(MRAA_AIO_TEST_PIN) + + def tearDown(self): + del self.pin + + def test_aio_get_bit(self): + self.assertEqual(self.pin.getBit(), PLATFORM_STD_ADC_RES_BITS, "Wrong ADC resolution reported") + + def test_aio_set_bit(self): + self.pin.setBit(PLATFORM_MAX_ADC_RES_BITS) + self.assertEqual(self.pin.getBit(), PLATFORM_MAX_ADC_RES_BITS, "Wrong ADC resolution reported after setBit()") + + def test_aio_read(self): + self.assertNotEqual(self.pin.read(), -1, "Error returned when reading ADC value") + + def test_aio_read_float_std_res(self): + self.pin.setBit(PLATFORM_STD_ADC_RES_BITS) + self.assertNotEqual(self.pin.readFloat(), -1, "Error returned when reading float ADC value at standard resolution") + + def test_aio_read_float_max_res(self): + self.pin.setBit(PLATFORM_MAX_ADC_RES_BITS) + self.assertNotEqual(self.pin.readFloat(), -1, "Error returned when reading float ADC value at maximum resolution") + +if __name__ == "__main__": + u.main() diff --git a/tests/mock/platform_checks.py b/tests/mock/platform_checks.py index b37be26..699ad1f 100755 --- a/tests/mock/platform_checks.py +++ b/tests/mock/platform_checks.py @@ -27,7 +27,7 @@ import mraa as m import unittest as u -PLATFORM_PINCOUNT = 1 +PLATFORM_PINCOUNT = 2 PLATFORM_STD_ADC_RES_BITS = 10 PLATFORM_MAX_ADC_RES_BITS = 12