There were api changes for iio kernel support on mraa which cascade to
UPM - setting the minimum version of mraa required.
Signed-off-by: Noel Eck <noel.eck@intel.com>
Moved src include AFTER setter for PYTHONBUILD_VERSION. In this way,
the src CMakeLists has a valid PYTHONBUILD_VERSION str.
Call find_package on PythonInterp prior to finding the libs (recommended).
Signed-off-by: Noel Eck <noel.eck@intel.com>
HD44780 fails to initialize unsuccessfully without the workaround.
Adding workaround based on HD77480 datasheet for initialization
and software reset.
Signed-off-by: Akira Tsukamoto <akira.tsukamoto@linaro.org>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This module implements support for the Honeywell TB7300 Communicating
Fan Coil Thermostat. It may also support the TB7200, though only the
TB7300 was available for development of this driver.
The TB7200 Series PI thermostats are designed for zoning applications,
and the TB7300 Series PI thermostats are designed for fan coil
control. Both Series are communicating thermostats with models
available in BACnet® MS/TP protocol and can be easily integrated into
a WEBs-AX building automation system based on the NiagaraAX® platform.
TB7200 and TB7300 Series thermostats are compatible with the Honeywell
Occupancy Sensor Cover. Thermostats equipped with an occupancy sensor
cover provide advanced active occupancy logic, which will
automatically switch occupancy levels from Occupied to Stand-By and
Unoccupied as required by local activity being present or not. This
advanced occupancy functionality provides advantageous energy savings
during occupied hours without sacrificing occupant comfort. All
thermostats can be ordered with or without a factory installed PIR
cover.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
This module implements support for the Amphenol Telaire Ventostat
T8100 Ventilation Controller with BACnet interface. It may also
support the T8200 and T8300 models, but they have not been tested.
The Telaire Ventostat T8100 reports Temperature, Humidity and CO2
concentrations. It supports an optional relay with a settable trigger
point. The unit this driver was tested under did not support the
optional relay. The temperature range supported is 0-50C, humidity is
0-100% non-condensing, and CO2 range is appoximately 0-2000 PPM for
the T8100. Other sensors in this family support wider ranges.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
This commit removes functionality that is now present in the
bacnetutil class. This simplifies the driver considerably. The
examples were modified to reflect the renaming of some utility
functions in bacnetutil.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
There is some functionality that will always be needed for BACnet
drivers. Here we create a new bacnetutil class, built as part of the
bacnetmstp library that can handle much of the data handling and setup
a BACnet driver will need.
The idea is that any BACnet functionality needed, that is not
device-specific, should be added to this class for all drivers to use.
The intent is that all BACnet drivers will inherit from this class.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
This reworks the data handling portion of bacnetmstp. Instead of just
handling a single data element returned from a device, we can handle
more, as in the case of BACnet arrays.
Added the ability to create BACnet enum data elements. This is needed
in order to set binary value objects.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
This module (bmx055) implements support for the following core Bosch
chipsets:
bma250e - accelerometer, 3 variants (chip id's 0x03, 0xf9, and 0xfa)
bmm150 - magnetometer
bmg160 - gyroscope
The other 3 devices are combinations of the above:
bmx055 - accel/gyro/mag
bmc160 - accel/mag
bmi055 - accel/gyro
...for 6 devices total.
For the combination devices, all of the sub-devices appear as
individual independent devices on the I2C/SPI bus.
The combination drivers provide basic configuration and data output.
For more detailed control as well as interrupt support, you should use
the core device drivers (accel/gyro/mag) directly.
These devices support both I2C and SPI communications. They must be
powered at 3.3vdc.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Switch the calls from pkg_search_module to pkg_check_modules
for ozw, bacnet, and modbus. Check prints out the version when
found.
Signed-off-by: Noel Eck <noel.eck@intel.com>
Merged conflict in grove.cxx GroveTemp::value where new
scale factor was added. Changed to apply scale factor
post error-check.
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
aio: mraa_aio_read (v1.0.0) can now return -1, treat that in sensors using it
Adds alot of exceptions if the aio read goes wrong
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
L3GD20 is tri-axis gyroscope from STMicroelectronics.
This sensor can measure angular velocity in degree per second.
The library provided is libupm-l3gd20.so.0.4.0.
The example provided is l3gd20-example where it will print x,y,z axis when
trigger buffer data is ready.
This sensor requires calibration to be done for 2 seconds. Please place the
sensor on level surface.
As the sensor data is noisy, we have implemented denoise algorithm within the
sensor library.
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
Code cleanup and proper close iio device in destructor.
KXCJK-1013 is tri-axis accelerometer from Kionix.
This sensor can measure acceleration in metre per second squared or in
G-forces.
The library provided is libupm-kxcjk1013.so.0.4.0.
The example provided is kxcjk1013-example where it will print x,y,z axis when
trigger buffer data is ready.
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
This driver implements support for the Bosch BNO055 Absolute
Orientation 9DOF Fusion Hub. It was implemented on the Adafruit
variant at https://www.adafruit.com/products/2472.
The BNO055 is a System in Package (SiP), integrating a triaxial 14-bit
accelerometer, a triaxial 16-bit gyroscope with a range of ±2000
degrees per second, a triaxial geomagnetic sensor and a 32-bit cortex
M0+ microcontroller running Bosch Sensortec sensor fusion software, in
a single package.
This sensor handles the hard problem of combining various sensor
information into a reliable measurement of sensor orientation (refered
to as 'sensor fusion'). The onboard MCU runs this software and can
provide fusion output in the form of Euler Angles, Quaternions, Linear
Acceleration, and Gravity Vectors in 3 axes.
The focus on this driver has been on supporting the fusion components.
Less support is available for use of this device as a generic
accelerometer, gyroscope and magnetometer, however enough
infrastructure is available to add any missing functionality.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
Previously in MRAA, the libmraa library was statically linked into the
libmraajava library. This was changed recently in MRAA, causing most
java examples to fail due to missing mraa symbols. This patch
specifically adds libmraa to the link in addition to libmraajava.
In addition, use *_LIBRARIES in the java specific swig_link_libraries
call rather than *_LDFLAGS.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
This library adds support for both the BMP280 and BME280 sesnors from
Bosch. The BME is virtually identical to the BMP280 aside from some
slight register changes and adding support for a humidity sensor.
The BMP280 is an absolute barometric pressure sensor especially
designed for mobile applications. The sensor module is housed in an
extremely compact 8-pin metal-lid LGA package with a footprint of only
2.0 × 2.5 mm2 and 0.95 mm package height. Its small dimensions and its
low power consumption of 2.7 μA @1Hz allow the implementation in
battery driven devices such as mobile phones, GPS modules or watches.
The BME280 is as combined digital humidity, pressure and temperature
sensor based on proven sensing principles. The sensor module is housed
in an extremely compact metal-lid LGA package with a footprint of only
2.5 × 2.5 mm2 with a height of 0.93 mm. Its small dimensions and its
low power consumption allow the implementation in battery driven
devices such as handsets, GPS modules or watches. The BME280 is
register and performance compatible to the Bosch Sensortec BMP280
digital pressure sensor
These drivers support both I2C and SPI operation.
When using SPI on an Edison with the arduino breakout board, you
must specify a CS of -1 to the constructor, and connect the chip's
CS pin to arduino pin 10.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
This driver, based on bosch code is being removed in favor of a new
driver to be added soon that is more fully functional and includes SPI
support.
The new driver will be included along with a BMP280 implementation in
a new bmp280 library.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
This commit removes the old bmp180 driver that was erroneously
re-added when the interface examples and headers were introduced.
It then switches the users of bmp180 to the existing bmpx8x driver,
which already supports the bmp180.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
Proper close iio device in destructor.
APDS-9930 is light and proximity sensor from Avago Technologies.
This sensor can measure ambient light in lux and proximity distance in 100mm.
The library provided is libupm-apds9930.so.0.4.0.
The example provided is apds9930-example where this app will print the value of
ambient light and proximity in every 1 second.
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
Code cleanup and proper close iio device in destructor.
KXCJK-1013 is tri-axis accelerometer from Kionix.
This sensor can measure acceleration in metre per second squared or in
G-forces.
The library provided is libupm-kxcjk1013.so.0.4.0.
The example provided is kxcjk1013-example where it will print x,y,z axis when
trigger buffer data is ready.
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
The env CC=clang builds were previously getting overridden for each build since
the language: cpp defaults gcc/g++ (travis-ci was not building UPM w/clang).
This commit explicitly adds the clang compiler to the build matrix.
* Specify gcc/clang in the compiler directive
* Add a node.js 0.10 entry
* Add a few debug messages
* General cleanup of .travis.yml
* Add the upm make install step for completeness
Signed-off-by: Noel Eck <noel.eck@intel.com>
This driver supports, and was tested with, a DS18B20 1-wire
Temperature Sensor using external power.
This device requires the use of a UART to provide access to a Dallas
1-wire bus, via a new facility supported by MRAA (once the relevant PR
is accepted), using the UartOW access class. It is important to
realize that the UART is only being used to access and control a
Dallas 1-wire compliant bus, it is not actually a UART device.
Multiple DS18B20 devices can be connected to this bus. This module
will identify all such devices connected, and allow you to access them
using an index starting at 0.
Parasitic power is not currently supported due to the very tight 10us
limit on switching a GPIO properly to supply power during certain
operations. For this reason, you should use external power for your
sensors.
Setting the alarm values (Tl, Th) is also not supported, since this is
only useful when doing a 1-wire device search looking for devices in
an alarm state, a capability not yet supported in MRAA. In reality,
this is trivial to handle yourself in your application.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
This adds initial support for the DS2413 Dual Channel Addressable
Switch. This is a Dallas Semiconductor 1-wire compliant device
providing access to 2 open-drain GPIOs.
https://learn.adafruit.com/adafruit-1-wire-gpio-breakout-ds2413/overview
This driver requires One-Wire over UART support in MRAA (PR #415)
which is not yet merged.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
To make room for UPM C and C++ sensor code to coexist, all UPM
C++ headers have been renamed from h -> hpp. This commit contains
updates to documentation, includes, cmake collateral, examples, and
swig interface files.
* Renamed all cxx/cpp header files which contain the string
'copyright intel' from .h -> .hpp (if not already hpp).
* Replaced all references to .h with .hpp in documentation,
source files, cmake collateral, example code, and swig interface
files.
* Replaced cmake variable module_h with module_hpp.
* Intentionally left upm.h since this file currently does not
contain code (documentation only).
Signed-off-by: Noel Eck <noel.eck@intel.com>
The boschdriver.h file contains tags which are picked up by
doxygen and cause incorrect results. For example, the
\mainpage and \license cause the Bosch header collateral to
be placed on the index.html page of the UPM docs.
Added an entry to EXCLUDE_PATTERNS which handles this.
Signed-off-by: Noel Eck <noel.eck@intel.com>
This UPM module captures a still frame from a Linux V4L device, such
as a USB webcam, and and then allows you to save it as a JPEG image
into a file.
The camera and driver in use must support streaming, mmap-able buffers
and must provide data in YUYV format. This should encompass most
video cameras out there. It has been tested with a few off the shelf
USB cameras without any problems.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This driver requires the UPM BACNETMSTP driver (PR #385) to be merged
first.
This module implements support for the Veris E50H2 and E50H5
BACnet Energy Meters.
From the datasheet: The E50H5 BACnet MS/TP DIN Rail Meter with
Data Logging combines exceptional performance and easy
installation to deliver a cost-effective solution for power
monitoring applications. Native serial communication via BACnet
MS/TP provides complete accessibility of all measurements to your
Building Automation System. The data logging capability protects
data in the event of a power failure. The E50H5 can be easily
installed on standard DIN rail, surface mounted or contained in
an optional NEMA 4 enclosure, as needed. The front-panel LCD
display makes device installation and setup easy and provides
local access to the full set of detailed measurements.
This module was developed using the upm::BACNETMSTP module, based
on libbacnet-stack 0.8.3. Both libbacnet 0.8.3 and the
upm::BACNETMSTP libraries must be present in order to build this
module. This driver was developed on the E50H5. The Trend Log
functionality is not currently supported.
The Binary Input Objects are also not supported as these are only
used for the Alarm bits which are already available from Analog
Input Object 52 as an alarm bitfield incorporating all of the
supported alarm indicators.
It was connected using an RS232->RS485 interface. You cannot use
the built in MCU TTL UART pins for accessing this device -- you
must use a full Serial RS232->RS485 or USB-RS485 interface
connected via USB.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This driver is implemented as a singleton due to it's reliance on the
bacnet-stack implementation. This implementation does not currently
support multiple BACnet networks at the same time, though in the
future it might, depending on the future of bacnet-stack development.
The version of bacnet-stack used in developing this driver was 0.8.3.
This driver is not intended to be used directly by end users, rather
it is intended for UPM drivers supporting specific BACnet devices,
such as the Veris E50H5 Energy Meter.
Unfortunately, this means that a process can only support a single
RS-485 BACnet network, though you can support multiple devices on that
network.
No examples are provided. Please look at the E50HX driver for an
example of how to use this class in a BACnet MS/TP device driver if
you want to write one.
When initialized, the bacnet-stack library will attach to your RS-485
based BACnet network, and start a Master Finite State Machine (FSM) in
a separate thread. This thread will handle the details of token
passing and locating other Masters in the network (Poll For Master).
This driver will appear as a BACnet Master device on the BACnet
network, which supports only the required Device Object and any
required services (readProp) and Device Object properties.
When initializing the driver, it is important to select a Device
Object Instance ID that is unique on your BACnet network. This is the
unique identifier that will be used to identify your Master to the
rest of the BACnet network.
In addition, it may take some time after initialization before you
will be able to communicate on the network, as the first thing that
has to happen is that all Masters on the network need to be identified
(handled by the Master FSM) and a token needs to be received before
your Master can begin transmitting (making requests). This may take a
couple of minutes on a large network.
You can speed this process up by specifying a maxMaster (to
initMaster()) that is smaller than the default (127) -- but only if
you are CERTAIN that there are no masters with a MAC address higher
than the value you choose. If you fail to follow this rule, you may
introduce hard to identify token passing problems on the network for
yourself and other BACnet Masters.
Currently, this driver only supports the readProperty and
writeProperty requests to other BACnet devices. In addition, array
property reading and writing is not currently supported.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Fixed a few small typos for handling node as well as a
small conditional for building PYTHON.
* Fixed some NODE_EXECUTABLE->NODEJS_EXECUTABLE instances
which must have been missed from a previous commit.
* Added a qualifier for python documentation so both
BUILDSWIGPYTHON AND BUILDSWIG must be set to add
dependencies for pydoc.
Signed-off-by: Noel Eck <noel.eck@intel.com>
Changed ${LIB_INSTALL_DIR} with lib, because the variable expands to
/usr/lib, making the install path /usr/usr/lib/node_modules, which
is incorrect. Now the install path is /usr/lib/node_modules.
Signed-off-by: Andrei Vasiliu <andrei.vasiliu@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Small change to get rid of a warning in newer cmake versions.
Versions of cmake (>= 3.0) throw a warning on the add_dependecy
method for non-existant dependencies (add_dependency call before
target_link_libraries call).
Removed the call to add_dependency since target_link_libraries should
provide the same functionality for ozw and modbus dependencies.
Signed-off-by: Noel Eck <noel.eck@intel.com>
This avoids using include files from a pre-existing UPM installation
as they can break the build if API changes are made.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Use the same methodology as in mraa, by default build for python2, if requested
use python3 for everything
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
Internal sensor onboard the Curie/Arduino101 can be accessed via Firmata using
this plugin. You will need mraa compiled with -DFIRMATA=ON for this to work and
be using Firmata with the CurieIMU firmata extension for ExtensibleFirmata
Signed-off-by: Ron Evans <ron@hybridgroup.com>
Signed-off-by: Justin Zemlyansky <jlstigman@live.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This patch checks for, and enables C++11 support for building UPM.
This should work for all cmake versions currently supported by UPM
(2.8.11+), and any compiler (clang/gcc) that was released in this
decade.
Support can be specifically disabled by passing '-DENABLECXX11=OFF' to
cmake, though modules requiring this support will not build.
C++11 support is enabled by default.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This module implements support for the Veris H8035 and H8036 Energy
Meters.
The H8036 is similar to the H8035, but provides much more data.
The Enercept H8035/H8036 is an innovative three-phase networked
(Modbus RTU) power transducer that combines electronics and high
accuracy industrial grade CTs in a single package. The need for
external electrical enclosures is eliminated, greatly reducing
installation time and cost. Color-coordination between voltage leads
and CTs makes phase matching easy. Additionally, these transducers
automatically detect and compensate for phase reversal, eliminating
the concern of CT load orientation. Up to 63 Transducers can be
daisy-chained on a single RS-485 network.
This module was developed using libmodbus 3.1.2, and the H8035. The
H8036 has not been tested. libmodbus 3.1.2 must be present for this
module to build.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
The Bosch BMI160 is a 3-axis Accelerometer and Gyroscope.
Additionally it supports an external Magnetometer, accessed through
the BMI160's register interface. This driver was developed with a
BMI160 "Shuttle" board, which included a BMM150 Magnetometer.
The device is driven by either 1.8v or 3.3vdc. This driver
incorporates the Bosch BMI160 driver code at
https://github.com/BoschSensortec/BMI160_driver .
While not all of the functionality of this device is supported
initially, the inclusion of the Bosch driver in the source code
makes it possible to support whatever features are required that
the driver bosch driver itself can support.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
The Veris TEX00 temperature sensor family is made up of a series of
RTD thermistors in wall mount packaging.
This driver was developed using the TED00, which utilizes a 10K Ohm
Type 2 thermistor. However, this driver can support the other 12
variants of the TE series as well by providing the correct sensor type
to the class constructor. These other sensor types have not been
tested. Only the TED00 hardware was tested with this driver.
This sensor must be connected as part of a voltage divider, with the
balancing resistor ideally matched to the sensor's 25C detection
range. For the TED00 (10kt2), a 10K Ohm (1% tolerance) resistor was
used in a circuit like the following:
GND o----|TED00(10k2)|----o----|balanceResistor(10K)|----o VCC (+5vdc)
|
|
|----o A0 (analog input to MCU)
A 3.3vdc voltage can be used as well if desired.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
The driver adds support for the Veris TEAMS Temperature Transmitter.
It provides it's output via a 4-20ma current loop. The supported
temperature range is 10C to 35C.
This sensor was developed with a Cooking Hacks (Libelium)
4-channel 4-20ma Arduino interface shield. For this interface,
the receiver resistance (rResistor) was specified as 165.0
ohms.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
The driver was developed using the Veris CWLSHTA CO2 Gas sensor. The
'T' variant supports a temperature sensor, and the 'H' variant
supports a humidity sensor.
All 3 signals are provided by the device as analog 0-5Vdc, 0-10Vdc, or
4-20ma loop current outputs. For devices supporting temperature, the
valid temperature range is 10C to 50C. The humidity ranges from 0% to
100% (non-condensing). The CO2 sensor ranges from 0 to 2000 ppm.
This driver was developed using the 5Vdc outputs and the 4-20ma
outputs. For voltage outputs, your MCU must be configured for 5V
operation. In addition, you must configure the sensor (via it's
configuration switches) to output 0-5VDC only. Using any other analog
reference voltage will require the appropriate external circuitry
(such as a voltage divider) in order to interface safely with your
MCU.
In addition, the sensor can be configured for 4-20ma usage, by
specifying the correct receiver resistance (in ohms) in the
constructor. This sensor was tested with a Cooking Hacks (Libelium)
4-channel 4-20ma Arduino interface shield. For this interface, the
receiver resistance was specified as 165.0 ohms.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
FindNode.cmake reports failure it cannot detect all required include files.
Module is now called with REQUIRED flag to prevent generation of makefiles
that will not build.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
An ADS1015 implementation existed in the inferface fork before the ADS1x15
moulde was added to upstream repo. This retrofits the IADC interface onto
an implementation derived from ads1x15
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This is required so that interface include files are taken from
local src folder before looking in /usr/include/upm where an older version
may exist.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
DS1808 is a general purpose potentiometer but this implementation
is limited to controlling brightness of custom LED lighting hardware.
Ideally there should be a DS1808 module used by a seperate
lighting module.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This driver has been rewritten to support some new functionality, be
more generic and fix up some old bugs. Multiple MY9221's can now be
chained together and are supported by the MY9221 base class.
In addition, the Grove LED Bar and Grove Circular LED drivers have
been incoporated into the my9221 library, using the new MY9221 class
as their base class. Examples have been fixed to work with the new
library, and renamed where needed.
The current grovecircularled driver has been removed as it is now a
part of the my9221 library.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
ISR support for Java bindings needs iio.c Runnable implementation in MRAA. Might be possible to leverage working implementation for GPIO.
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This driver provides support for the ILI9341 LCD driver via SPI (e.g.
Adafruit 2.8" TFT LCD).
It was implemented and tested on the Edison.
Signed-off-by: Shawn Hymel
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
The Grove RTC (DS1307) does not work on the Intel Edison Arduino
board but will work with the mini-breakout. Updated the list of
known limitations in docs. Updated the ADXL345 to show 16g, and
fixed one line which went over 80 chars.
Signed-off-by: Noel Eck <noel.eck@intel.com>
The driver implements support for the Omega RH-USB Humidity Probe with
Temperature sensor. It connects via an integrated USB cable, and
appears as a serial port.
It does not currently work with Edison (as of this date) due to
missing ftdi_sio and usbserial kernel support.
It was implemented and tested on the Galileo 2.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This module implements support for the Veris HWXPHTX Hardware Protocol
Humidity and Temperature Sensor family. It uses MODBUS over an RS485
interface.
This module was developed using libmodbus 3.1.2, and the Veris HWXPHTX.
This sensor supports humidity, and optionally, temperature, slider
switch, and override switch reporting. The HWXPHTX used to develop
this driver did not include the optional slider or override switches,
however support for them is provided.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This driver was developed using the Veris HD2NVSTA1 humidity
transmitter. The 'T' variant supports a temperature transmitter as
well. Both signals are provided by the device as analog 0-5Vdc or
0-10Vdc outputs.
The A1 variant supports a temperature range of -40C-50C, while the A2
variant supports a range of 0C-50C. Humidity ranges for all devices
in this device family range from 0% to 100% (non-condensing).
Temperature measurement can be disabled by passing -1 as the
temperature analog pin to the constructor.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This module implements support for the Comet System T3311 Temperature
and Humidity transmitter. It uses MODBUS over an RS232 serial port.
You must have libmodbus v3.1.2 (or greater) installed to compile and
use this driver.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Initial commit of ADS1x15 adc converter. Support for both ADS1015 12 bit
and ADS1115 16 bit adc.
--signoff
Signed-off-by: Marc Graham <marc@m2ag.net>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This is a USB device from Numato Labs that is accessed via a UART. It
provides 16 GPIO's, 7 of which can be configured as analog inputs.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Fun to work on, I have maybe 3 different implementations for this one now.
Submitted version uses GPIOs only, no more PWM thus enhancing compatibility.
Fast writes and busy-wait delays ensure accuracy to a few μs when generating
the step pulses.
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
If MODULE_LIST is set, cmake will only create examples that can be built
with avaialble modules. There has been significant change to cmake file.
Comments show you how to add new examples.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
The existing hardcoded logic enables i2c bypass mode for AK8975.
This can cause the accelerometer to disappear on I2C bus. We add
a new member as a switch that can be used to disable bypass.
Change-Id: I2c61f4910d46ffb5940bb3c14b58bc65984fd12e
Signed-off-by: Jianxun Zhang <jianxun.zhang@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This module was developed using the OpenZWave library (v1.3):
http://www.openzwave.com/
It was developed using a collection of devices (switches and a
multi-sensor) connected via an Aeon Z-Stick Gen5 USB dongle.
It can be used to query (and, where appropriate, set) Values on Nodes
connected to the ZWave network.
Checks are made in src/ozw/CMakeLists.txt to ensure that the
libopenzwave library is installed (via pkg-config). If not present,
then neither the module, nor the example will be built.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This will allow users to call ackEdgeDetected() on the object passed into the function pointer, instead of requiring them to have a global reference to the object.
Signed-off-by: JJ Robertson <jjrob13@gmail.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This driver was developed using an SX1276 based shield on the Galileo
G2. It requires 3.3v of operation. It does not work with Edison, due
to SPI issues.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Python and Java bindings will build with SWIG 2.x but Node requires at least SWIG 3.0.5. Subject to change when SWIG 3 becomes standard in all major distros.
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Add support for MCP9808 precision temp sensor. Implements all features
except for TCrit and TUpper and TLower locking. Functionality includes
alert, interrupt, resolution and hysteresis control.
Signed-off-by: Marc Graham <marc@m2ag.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Removed some unneeded calls in update function. Changed call in
micsv89.js sample file to use update instead of start.
Tested with UPM. 4.0. The micsv89 is sensitive to other devices pulling
the I2c bus up, so it is not likely to work on the Arduino breakout.
I2c 1 on mini breakout works fine.
—Signed-off-by Marc Graham <marc@m2ag.net>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
The driver implements support for the DFRobot pH sensors. It was
tested with both the standard and Pro versions, calibrated with
standard buffer solutions at pH 4.01 and pH 7.0.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This driver was developed based on the DFRobot Triple Axis
accelerometer BMA220 (Tiny):
http://www.dfrobot.com/index.php?route=product/product&product_id=1085
This device can only run at 3.3v DC. Do not connect to 5v.
Added a private function definition for the installISR function. Done because C++
wasn't able to find the function definition for the java bindings.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This driver was tested with the DFRobot URM37 Ultrasonic Ranger, V4.
Both UART and analog access modes are supported.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This is a basic serial module that allows access to various XBee
devices via a UART port. It was tested with the XBee S6B WiFi Module
and the XBee S1 802.14.4 module.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
The current grovemd driver supported 'mode2' stepping, where the
driver simply passed various stepper commands to the board for it to
carry out on it's own.
This doesn't work very well (or at all if you have old/buggy firmware)
so add a new 'mode1' stepper capability. This mode lets the driver
manually control the stepping operation without requiring special
firmware.
This is now the default and recommended mode to use for stepper motors
on this device. It is also more flexible in terms of the maximum
number of steps you can do (mode2 was limited to 254 steps max).
This was tested using a bipolar NEMA-17 stepper motor with an
external 12v power supply.
Note: 'Mode1' and 'Mode2' are the Seeed Studio terms for these different
stepping modes.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This isn't really a C++ library, though it is compiled as one. We
throw exceptions in the hal_init function on startup if there are
issues initializing SPI or the various GPIO's, but that's it.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
In addition, throw out_of_range() exceptions in
object/ambientTemperature() methods when they occur instead of just
returning 0, which is a valid temperature return value.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This is a rewrite of the existing SM130 driver which was incomplete
and non-functional.
It was implemented using a Sparkfun SM130 module:
https://www.sparkfun.com/products/10126
... using a Sparkfun RFID Evaluation Shield:
https://www.sparkfun.com/products/10406
It operates in UART mode only. A port to support I2C communications
(requires a encrypted firmware reflash from SonMicro) should be
fairly trivial, if you have one of those.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: sisinty sasmita patra <sisinty.s.patra@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This driver was implemented using a Grove IMU 9DOF V2.0 (mpu9250).
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: sisinty sasmita patra <sisinty.s.patra@intel.com>
Using an external code parsing library we discovered that there are
non-printable characters in some source files which break the parser.
This commit removes these characters and rewrites a type definition
which was also breaking the parser.
Signed-off-by: Mircea Bardac <mircea.bardac@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
When setting the On or Off times, the FullOn or FullOff control bits
would be improperly masked and therefore not preserved.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Sisinty Sasmita Patra<sisinty.s.patra@intel.com>
Eric Hubert reported a bug in that no matter what setting he used to
control the speed of a DC motor, it was always running at full speed.
There was a bug in the setMotorSpeed() method that did not clear the
'FullOn' bit in the register used for PWM, causing full power to be
applied all the time no matter the PWM duty cycle setting.
This patch corrects that issue.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
signed-off-by: Sisinty Sasmita Patra<sisinty.s.patra@intel.com>
We add a new src/upm_exception.i interface file for SWIG to catch
common exceptions and propagate them through SWIG.
src/upm.i is modified to include this interface file, so all UPM
drivers have it.
In theory, this should be language agnostic - if the target language
supports exceptions, then it should just work.
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
2015-08-13 14:52:01 -07:00
1591 changed files with 117320 additions and 5251 deletions
# Turn off JAVA SWIG for clang++, use 4.8 for all g++ builds
- if [ "$CC" == "gcc" ]; then export BUILDJAVA=ON; export CC=gcc-4.8; export CXX=g++-4.8; else export BUILDJAVA=OFF; fi
- if [ "${NODE012}" ]; then nvm install 0.12; fi
- if [ "${NODE4}" ]; then nvm install 4.1; fi
- if [ "${NODE5}" ]; then nvm install 5; fi
# Handle 0.10 NODE_ROOT_DIR differently than other versions
- if [ -z ${NODE010} ]; then export NODE_ROOT_DIR="/home/travis/.nvm/versions/node/`nvm version`"; else export NODE_ROOT_DIR=/home/travis/.nvm/v0.10.36; fi
* [Recommendations for the native API](#recommendations-for-the-native-api)
* [Pointers](#pointers)
* [Throwing Exceptions in Java](#throwing-exceptions-in-java)
* [Caveats & Challenges](#caveats--challenges)
* [Wrapping C arrays with Java arrays](#wrapping-c-arrays-with-java-arrays)
* [Wrapping unbound C arrays with Java arrays if array is output](#wrapping-unbound-c-arrays-with-java-arrays-if-array-is-output)
* [Wrapping unbound C arrays with Java arrays if array is input](#wrapping-unbound-c-arrays-with-java-arrays-if-array-is-input)
* [Implementing callbacks in Java](#implementing-callbacks-in-java)
##Overview
The "Creating Java Bindings Guide" serves as a basic tutorial for using the SWIG software development tool to create 'glue code' required for Java to call into C/C++ code. It contains: guides for dealing with type conversions, exception handling, callbacks; recommendations on how to write/modify the native API to avoid issues on the Java side, and also workarounds for those issues that can't be avoided.
This guide was created with the [upm](https://github.com/intel-iot-devkit/upm/) and [mraa](https://github.com/intel-iot-devkit/mraa) libraries in mind, and uses examples taken from these sources, but its usage can be extended to any project of creating Java bindings for C/C++ libraries.
##Tools of trade
[SWIG General Documentation](http://www.swig.org/Doc3.0/SWIGDocumentation.html)
As much as possible, avoid passing values/returning values through pointers given as as arguments to methods. As the Java language does not have pointers, SWIG provides a [workaround](http://www.swig.org/Doc3.0/Java.html#Java_tips_techniques) in the typemaps.i library.
####Alternatives:
1. Functions that read data from a driver, return it through a pointer given as argument, and return a bool value, should be __replaced by__ functions that return the value directly and throw a std::runtime_error if a read error occurs. E.g.:
```c++
/*
* Function reads from sensor, places read value in variable bar and
* returns true if succesful. Function returns false if read failed.
*/
bool func(int *bar);
```
__Replaced by:__
```c++
/*
* Function reads from sensor and returns read value.
* Or throws std::runtime_error if a read error occurs
*/
int func();
```
2. Functions that return multiple values through pointers, that make sense to be grouped together into an array<sup>1</sup> (e.g. speed values, acceleration values), should be __replaced by__ functions that return a pointer to an array in which the elements are the returned values. Afterwards, [wrap the C array with a Java array](#wrapping-unbound-c-arrays-with-java-arrays-if-array-is-output). E.g.:
```c++
/*
* Function returns the acceleration on the three
* axis in the given variables.
*/
void getAccel(int *accelX, int *accelY, int *accelZ);
```
__Replaced by:__
```c++
/*
* Function returns the acceleration on the three
* axis as elements of a 3-element array.
*/
int *getAccel();
```
3. Functions that return N values through pointers, that do not make sense to grouped together (e.g. a general purpose function that returns both the light intensity and air pollution), should be __replaced by__ N functions (one for each value) that read only one specific value. E.g.:
```c++
/*
* Function returns the light intensity and air pollution
*/
void getData(int *light, int *air);
```
__Replaced by:__
```c++
int getLight();
int getAir();
```
4. Functions that return N values through pointers; values that do not make sense to be grouped together, but are time dependent, and make sense to be read at the same time. For example, a sensor that reads air humidity and temperature. A user may want to know the temperature value _temp_ read at the exact moment the humidity value _humid_ was read. These should be __replaced by__ N+1 functions: a _getData()_ function that reads all values at the same time and stores them in global variables; and N getter functions, one for each value. E.g.
```c++
/*
* Function returns the light intensity and air pollution
*/
void getData(int *temp, int *humid);
```
__Replaced by:__
```c++
void getData();
int getTemp();
int getHumid();
```
<sup>1</sup>this depends on the interpretation of the returned data. For example, arguments that return the temperature and light intensity, don't make sense to be grouped into an array of size 2. But acceleration on the three axis can be grouped together in an array of size 3. where accelX is accel[0], accelY is accel[1], accelZ is accel[2].
__Notice:__
Sometimes, you may be required to write JNI code. Be aware of the difference between the C JNI calling syntax and the C++ JNI calling syntax.The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the [Typemaps for both C and C++ compilation](http://www.swig.org/Doc3.0/Java.html#Java_typemaps_for_c_and_cpp) section of the SWIG Documentation.
###Throwing Exceptions in Java
####Language independent:
The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:
```c++
%exception [method_name] {
try {
$action
}
catch (std::invalid_argument& e) {
... handle error ...
}
}
```
If [method_name] is not specified then the directive is applied to all methods in its scope.
The usual thing you'd want to do is catch the C++ exception and throw an equivalent exception in your language.
The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common language exceptions in a portable manner. For example :
```c++
// Language independent exception handler
%include exception.i
%exception {
try {
$action
} catch(OutOfMemory) {
SWIG_exception(SWIG_MemoryError, "Out of memory");
In the upm library, the upm_exception.i interface file provides the functionality to catch common exceptions and propagate them through SWIG. It uses the exception.i library file and is language independent.
The upm_exception.i interface file is included in the upm.i file, therefor SWIG wraps all generated methods' body in a try-catch statement for the following exceptions:
Where FindClass and ThrowNew are [JNI functions](http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html).
Java defines two tipes of exceptions: checked exception and unchecked exceptions (errors and runtime exceptions). Checked exceptions are subject to the [Catch or Specify Requirement](https://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html).
The C++ compiler does not force the code to catch any exception.
The %exception directive does not specify if a method throws a checked exception (does not add classes to the throws clause). For this, the %javaexception(classes) directive is used; where classes is a string containing one or more comma separated Java classes.
In the upm library, the java_exceptions.i library file provides the functionality to catch exceptions and propagate them through SWIG as Java checked exceptions. The file provides SWIG wrappers, in the form of macros, that can be applied to methods.E.g. use the __READDATA_EXCEPTION(function)__ macro for functions that read data from a sensor and throw a std::runtime_error in case of a read failure. This will result in:
```java
void function throws IOException ();
```
##Caveats & Challenges
###Wrapping C arrays with Java arrays
SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Just include this file into your SWIG interface file.
###Wrapping unbound C arrays with Java arrays if array is output
Functions that return arrays, return a pointer to that array. E.g.:
```c++
/*
* Function returns the acceleration on the three
* axis as elements of a 3-element array.
*/
int *getAccel();
```
__SWIG:__
```c++
%typemap(jni) int* "jintArray"
%typemap(jstype) int* "int[]"
%typemap(jtype) int* "int[]"
%typemap(javaout) int* {
return $jnicall;
}
%typemap(out) int *getAccel {
$result = JCALL1(NewIntArray, jenv, 3);
JCALL4(SetIntArrayRegion, jenv, $result, 0, 3, (const signed int*)$1);
}
```
###Wrapping unbound C arrays with Java arrays if array is input
In C, arrays are tipically passed as pointers, with an integer value representig the length of the array. In Java, the length of an array is always known, so the length argument is redundant. This example shows how to wrap the C array and also get rid the length argument. E.g.:
```c++
void func(uint8_t *buffer, int length);
```
__SWIG:__
```c++
%typemap(jtype) (uint8_t *buffer, int length) "byte[]"
%typemap(jstype) (uint8_t *buffer, int length) "byte[]"
%typemap(jni) (uint8_t *buffer, int length) "jbyteArray"
%typemap(javain) (uint8_t *buffer, int length) "$javainput"
%typemap(in,numinputs=1) (uint8_t *buffer, int length) {
!!!! There is a difference between TYPE *name and TYPE * name in typemaps!!!!!
###Implementing callbacks in Java
Callbacks in the UPM Java library (as well as the MRAA Java library) make use of the _void mraa\_java\_isr\_callback(void\* data\)_ method from MRAA.
__Callbacks in the UPM Java library are implemented as follows (we use the a110x Hall Effect sensors as example):__
We extend the sensor class with another method, _installISR\(jobject runnable\)_, which is a wrapper over the original _installISR\(void \(\*isr\)\(void \*\), void \*arg\)_ method. This will install the _mraa\_java\_isr\_callback\(\)_ method as the interrupt service routine \(ISR\) to be called, with _jobject runnable_ as argument.
SWIGJAVA is a symbol that is always defined by SWIG when using Java. We enclose the _installISR\(jobject runnable\)_ method in a _\#if defined(SWIGJAVA)_ check, to ensure the code only exists when creating a wrapper for Java.
```c++
#if defined(SWIGJAVA)
void A110X::installISR(jobject runnable)
{
installISR(mraa_java_isr_callback, runnable);
}
#endif
```
We hide the underlying method, _installISR\(void \(\*isr\)\(void \*\), void \*arg\)_ , and expose only the _installISR\(jobject runnable\)_ to SWIG, through the use of the SWIGJAVA symbol. When SWIGJAVA is defined, we change the access modifier of the underlying method to private.
```c++
public:
#if defined(SWIGJAVA)
void installISR(jobject runnable);
#else
void installISR(void (*isr)(void *), void *arg);
#endif
private:
#if defined(SWIGJAVA)
void installISR(void (*isr)(void *), void *arg);
#endif
```
To use callback in java, we create a ISR class, which implements the Java Runnable interface, and we override the _run\(\)_ method with the code to be executed when the interrupt is received. An example for the a110x Hall sensor that increments a counter each time an interrupt is received:
```java
public class A110X_intrSample {
public static int counter=0;
public static void main(String[] args) throws InterruptedException {
upm_a110x.A110X hall = new upm_a110x.A110X(2);
A110XISR callback = new A110XISR();
hall.installISR(callback);
while(true){
System.out.println("Counter: " + counter);
Thread.sleep(1000);
}
}
}
class A110XISR implements Runnable {
public A110XISR(){
super();
}
public void run(){
A110X_intrSample.counter++;
}
}
```
####Issues with java callbacks and workarounds
__SWIGJAVA not defined at compile time__
Consider the following files:
* example.h - Header file for our source file
* example.cxx - Source file containing the class Example, for which we build java bindings
* example.i - The SWIG interface, that includes the example.h header file
The build process of a java module using SWIG is split into two steps:
1. Generating the intermediate files, from the SWIG interface file. This will produce the java class file (Example.java), the JNI file (exampleJNI.java) and wrapper file (example_wrap.cxx). The source file (example.cxx) is not needed in the first step.
```
swig -c++ -java example.i
```
2. Generating the shared library from the C++ sources and wrapper file
SWIGJAVA is always defined when SWIG parses the interface file, meaning it will be defined when it parses the header file (example.h) that is included in the interface file (example.i).
SWIG also adds the "#define SWIGJAVA" directive in the wrapper file (example_wrap.cxx).
However, in generating the shared library the SWIGJAVA symbol is only defined in the example_wrap.cxx file, because of the added "#define SWIGJAVA" directive. But we have also used the "#if defined(SWIGJAVA)" check in the source file (example.cxx), and thus need to define SWIGJAVA for it too. If we define the SWIGJAVA symbol as a compile flag, when compiling the source code to object code, the SWIGJAVA compile flag and #define SWIGJAVA" directive will clash and give a double definition warning (only a warning).
In this example it is simple to compile the two source codes separately, one with the compile flag, the other without, and then create the shared library (libexample.so).
But in a big automatic build like the java upm libraries, this may prove too hard or too complicated to do. A workaround to this would be to define a custom symbol (e.q. JAVACALLBACK in the upm library) and also test for it. In short, replace:
@ -21,7 +21,16 @@ For building UPM, please follow this `link <https://github.com/intel-iot-devkit/
Multi-sensor samples for the starter and specialized kits can be found in the `iot-devkit-samples <https://github.com/intel-iot-devkit/iot-devkit-samples>`_
repository.
Individual sensor usage examples for python are available `here <https://github.com/intel-iot-devkit/upm/tree/master/examples/python>`_.
Individual sensor usage examples for Python are available `here <https://github.com/intel-iot-devkit/upm/tree/master/examples/python>`_.
``IDE Compatibility``
################
While there is no official IDE provided with our Python libraries, we do recommend the web-based IDE Wyliodrin. It can be used with multiple programming
languages, including Python. More information can be found on the Intel Developer Zone IDE page.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.