blob: 29894d3f232cb97429d9d923c828dcf251ce38d6 [file] [log] [blame]
/*
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* 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.
*/
#pragma once
#include "common.h"
#include "types.hpp"
#include <string>
/**
* @namespace mraa namespace
*/
namespace mraa
{
/**
* @file
* @brief API to common functions of MRAA
*
* This file defines the interface for libmraa common functions
*/
/**
* Initialise MRAA
*
* Detects running platform and attempts to use included pinmap, this is run on
* module/library init/load but is handy to rerun to check board initialised
* correctly. mraa::SUCCESS inidicates correct initialisation.
*
* @return Result of operation
*/
inline Result
init()
{
return (Result) mraa_init();
}
/**
* Get libmraa version.
*
* @return libmraa version (e.g. v0.4.0-20-gb408207)
*/
inline std::string
getVersion()
{
std::string ret = mraa_get_version();
return ret;
}
/**
* This function attempts to set the mraa process to a given priority and the
* scheduler to SCHED_RR. Highest * priority is typically 99 and minimum is 0.
* This function * will set to MAX if * priority is > MAX. Function will return
* -1 on failure.
*
* @param priority Value from typically 0 to 99
* @return The priority value set
*/
inline int
setPriority(const int priority)
{
return mraa_set_priority(priority);
}
/**
* Get platform type, board must be initialised.
*
* @return mraa::platform Platform type enum
*/
inline Platform
getPlatformType()
{
return (Platform) mraa_get_platform_type();
}
/**
* Print a textual representation of the mraa::Result
*
* @param Result the Result to print
*/
inline void
printError(Result result)
{
mraa_result_print((mraa_result_t) result);
}
/**
* Checks if a pin is able to use the passed in mode.
*
* @param pin Physical Pin to be checked.
* @param mode the mode to be tested.
* @return boolean if the mode is supported, 0=false.
*/
inline bool
pinModeTest(int pin, Pinmodes mode)
{
return (bool) mraa_pin_mode_test(pin, (mraa_pinmodes_t) mode);
}
/**
* Check the board's bit size when reading the value
*
* @return raw bits being read from kernel module. Zero if no ADC
*/
inline unsigned int
adcRawBits()
{
return mraa_adc_raw_bits();
}
/**
* Return value that the raw value should be shifted to. Zero if no ADC
*
* @return return actual bit size the adc value should be understood as.
*/
inline unsigned int
adcSupportedBits()
{
return mraa_adc_supported_bits();
}
/**
* Return Platform Name. Returns NULL if no platform inited.
*
* @return platform name
*/
inline std::string
getPlatformName()
{
std::string ret_val(mraa_get_platform_name());
return ret_val;
}
/**
* Return platform versioning info. Returns NULL if no info present.
*
* @param optional subplatform identifier
* @return platform versioning info
*/
inline std::string
getPlatformVersion(int platform_offset=MRAA_MAIN_PLATFORM_OFFSET)
{
std::string ret_val(mraa_get_platform_version(platform_offset));
return ret_val;
}
/**
* Return count of physical pins on the running platform
*
* @return uint of physical pins.
*/
inline unsigned int
getPinCount()
{
return mraa_get_pin_count();
}
/**
* Get platform usable I2C bus count, board must be initialised.
*
* @return number f usable I2C bus count on the current platform. Function will
* return -1 on failure
*/
inline int
getI2cBusCount()
{
return mraa_get_i2c_bus_count();
}
/**
* Get I2C adapter number in sysfs.
*
* @param i2c_bus the logical I2C bus number
* @return I2C adapter number in sysfs. Function will return -1 on failure
*/
inline int
getI2cBusId(int i2c_bus)
{
return mraa_get_i2c_bus_id(i2c_bus);
}
/**
* Get name of pin, board must be initialised.
*
* @param pin number
*
* @return char* of pin name
*/
inline std::string
getPinName(int pin)
{
std::string ret_val(mraa_get_pin_name(pin));
return ret_val;
}
/**
* Sets the log level to use from 0-7 where 7 is very verbose. These are the
* syslog log levels, see syslog(3) for more information on the levels.
*
* @param level
* @return Result of operation
*/
inline Result
setLogLevel(int level)
{
return (Result) mraa_set_log_level(level);
}
/**
* Detect presence of sub platform.
*
* @return bool true if sub platform is present and initialized, false otherwise
*/
inline bool
hasSubPlatform()
{
return static_cast<bool>(mraa_has_sub_platform());
}
/**
* Check if pin or bus id includes sub platform mask.
*
* @param int pin or bus number
*
* @return mraa_boolean_t 1 if pin or bus is for sub platform, 0 otherwise
*/
inline bool
isSubPlatformId(int pin_or_bus_id)
{
return static_cast<bool>(mraa_is_sub_platform_id(pin_or_bus_id));
}
/**
* Convert pin or bus index to corresponding sub platform id.
*
* @param int pin or bus index
*
* @return int sub platform pin or bus number
*/
inline int
getSubPlatformId(int pin_or_bus_index)
{
return mraa_get_sub_platform_id(pin_or_bus_index);
}
/**
* Convert pin or bus sub platform id to index.
*
* @param int sub platform pin or bus id
*
* @return int pin or bus index
*/
inline int
getSubPlatformIndex(int pin_or_bus_id)
{
return mraa_get_sub_platform_index(pin_or_bus_id);
}
/**
* Get default i2c bus, board must be initialised.
*
* @param optional subplatform identifier
* @return default i2c bus for paltform
*/
inline int
getDefaultI2cBus(int platform_offset=MRAA_MAIN_PLATFORM_OFFSET)
{
return mraa_get_default_i2c_bus(platform_offset);
}
/**
* Add mraa subplatform
*
* @param subplatformtype the type of subplatform to add
* (e.g. MRAA_GENERIC_FIRMATA)
* @param uart_dev subplatform device string (e.g. "/dev/ttyACM0")
* @return Result of operation
*/
inline Result
addSubplatform(Platform subplatformtype, std::string uart_dev)
{
return (Result) mraa_add_subplatform((mraa_platform_t) subplatformtype, uart_dev.c_str());
}
inline Result
removeSubplatform(Platform subplatformtype)
{
return (Result) mraa_remove_subplatform((mraa_platform_t) subplatformtype);
}
/**
* Create IO using a description in the format:
* [io]-[pin]
* [io]-[raw]-[pin]
* [io]-[raw]-[id]-[pin]
* [io]-[raw]-[path]
*
* @param IO description
*
* @return class T initialised using pointer to IO or NULL
*/
template <class T>
inline T*
initIo(std::string desc)
{
return new T(mraa_init_io(desc.c_str()));
}
}