SWIG_JAVA: C++ Interfaces to Java interfaces, Modified one Java Example

This commit translates C++ interfaces to Java interfaces, previously C++ Interfaces implemented java classes.

    * Added java swig interface files for all C++ interfaces to simplify swig
    javaupm_iADC.i
    javaupm_iCO2Sensor.i
    javaupm_iHumiditySensor.i
    javaupm_iLightController.i
    javaupm_iLightSensor.i
    javaupm_iModuleStatus.i
    javaupm_interfaces.i
    javaupm_iPressureSensor.i
    javaupm_iTemperatureSensor.i

    <example Usage>
        %include"../interfaces/javaupm_iADC.i"

    * Modified swig interface files for few sensors that implements interfaces
    ads1x15
    bmp280
    bmpx8x
    ds1808lc
    hlg150h
    lp8860
    max44009
    ms5611
    si1132
    si7005
    t6713

    * Removed few methods that were mentioned Protected and made them public, so that menthods can be overridden

    * Made IModuleStatus virtual to avoid ambiguity in multiple inheritance
    For example
    class A {};
    class B : public A {};
    class C : public A {};
    class D : public B, public C {};

    This can be solved as
    class A {};
    class B : virtual public A {};
    class C : virtual public A {};
    class D : public B, public C {};

    * Modified java interface files to support multiple swig versions

    * Modified javaupm interface file to support standard auto load library code

    * Fixed autoloadlibrary tests for interfaces

    * Created one interface example separately <BME280_InterfaceExample.java>,
    <example Usage>
        BME280_InterfaceExample.java
    since we cann't define swig versions inside java example file.
    So, instaed added swig versions in Cmake.
    <example Usage>
         if (SWIG_VERSION VERSION_GREATER 3.0.8)
           add_example_with_path(BME280_InterfaceExample bmp280 bmp280)
         endif()

Signed-off-by: sisinty sasmita patra <sisinty.s.patra@intel.com>
This commit is contained in:
sisinty sasmita patra 2017-02-06 14:59:00 -08:00 committed by Sasmita Patra
parent f8663c90f3
commit 1f18369fbe
43 changed files with 215 additions and 82 deletions

View File

@ -0,0 +1,70 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Author: Sisinty Sasmita Patra <sisinty.s.patra@intel.com>
* Copyright (c) 2016 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.
*/
import upm_bmp280.*;
public class BME280_InterfaceExample
{
public static void main(String[] args) throws InterruptedException
{
// ! [Interesting]
// Instantiate a BME280 instance using default i2c bus and address
BME280 sensor = new BME280();
ITemperatureSensor t_sensor = sensor;
IHumiditySensor h_sensor = sensor;
IPressureSensor p_sensor = sensor;
// For SPI, bus 0, you would pass -1 as the address, and a
// valid pin for CS:
// BME280(0, -1, 10);
while (true)
{
// update our values from the sensor
sensor.update();
System.out.println("Calling Interface Functions: ");
System.out.println("Compensation Temperature: "
+ t_sensor.getTemperatureCelsius()
+ " C / ");
System.out.println("Pressure: "
+ p_sensor.getPressurePa()
+ " Pa");
System.out.println("Humidity: "
+ h_sensor.getHumidityRelative()
+ " %RH");
System.out.println();
Thread.sleep(1000);
}
// ! [Interesting]
}
}

View File

@ -172,6 +172,11 @@ add_example_with_path(Lcm1602_parallelSample lcd i2clcd)
add_example_with_path(SSD1308_oledSample lcd i2clcd)
add_example_with_path(SSD1327_oledSample lcd i2clcd)
add_example_with_path(BME280_Example bmp280 bmp280)
if(SWIG_VERSION VERSION_GREATER 3.0.8)
add_example_with_path(BME280_InterfaceExample bmp280 bmp280)
endif()
add_example_with_path(BMA250E_Example bmx055 bmx055)
add_example_with_path(BMG160_Example bmx055 bmx055)
add_example_with_path(BMM150_Example bmx055 bmx055)

View File

@ -1,5 +1,10 @@
%module javaupm_ads1x15
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include"../interfaces/javaupm_iADC.i"
#endif
%include "typemaps.i"
%{
@ -8,14 +13,11 @@
#include "ads1115.hpp"
%}
%include "iModuleStatus.hpp"
%include "iADC.hpp"
%include "ads1x15.hpp"
%include "ads1015.hpp"
%include "ads1115.hpp"
%pragma(java) jniclasscode=%{
static {
try {

View File

@ -1,14 +1,22 @@
%module javaupm_bmp280
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iTemperatureSensor.i"
%include "../interfaces/javaupm_iHumiditySensor.i"
%include "../interfaces/javaupm_iPressureSensor.i"
#else
%include "iModuleStatus.hpp"
%include "iTemperatureSensor.hpp"
%include "iPressureSensor.hpp"
%include "iHumiditySensor.hpp"
#endif
%include "cpointer.i"
%include "typemaps.i"
%include "arrays_java.i";
%include "../java_buffer.i"
%include "iModuleStatus.hpp"
%include "iHumiditySensor.hpp"
%include "iPressureSensor.hpp"
%include "iTemperatureSensor.hpp"
%include "bmp280.hpp"
%{
#include "bmp280.hpp"

View File

@ -1,6 +1,11 @@
%module javaupm_bmpx8x
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iTemperatureSensor.i"
%include "../interfaces/javaupm_iPressureSensor.i"
#endif
%{
#include "bmpx8x.hpp"
%}
@ -16,4 +21,4 @@
System.exit(1);
}
}
%}
%}

View File

@ -26,7 +26,6 @@ DS1808LC::~DS1808LC()
{
}
bool DS1808LC::isPowered()
{
return static_cast<bool>(MraaUtils::getGpio(pinPower));

View File

@ -56,7 +56,6 @@ public:
DS1808LC(int gpioPower, int i2cBus);
~DS1808LC();
protected:
const char* getModuleName() { return "ds1808lc"; }
bool isPowered();
void setPowerOn();

View File

@ -1,5 +1,10 @@
%module javaupm_ds1808lc
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iLightController.i"
#endif
%include "arrays_java.i";
%include "../java_buffer.i"
%include "cpointer.i"
@ -9,8 +14,6 @@
#include "ds1808lc.hpp"
%}
%include "iModuleStatus.hpp"
%include "iLightController.hpp"
%include "ds1808lc.hpp"
%pragma(java) jniclasscode=%{

View File

@ -58,13 +58,12 @@ public:
HLG150H(int pinRelay, int pinPWM);
~HLG150H();
protected:
virtual int getBrightness();
const char* getModuleName() { return "hlg150h"; }
void setPowerOn();
void setPowerOff();
bool isPowered();
void setBrightness(int dutyPercent);
int getBrightness();
private:
mraa::Result status;

View File

@ -1,5 +1,10 @@
%module javaupm_hlg150h
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iLightController.i"
#endif
%include "arrays_java.i";
%include "../java_buffer.i"
%include "cpointer.i"

View File

@ -35,7 +35,7 @@ namespace upm
* @brief Interface for ADC Sensors
*/
class IADC : public IModuleStatus
class IADC : virtual public IModuleStatus
{
public:
virtual unsigned int getResolutionInBits() = 0;

View File

@ -26,14 +26,13 @@
#pragma once
#include "iModuleStatus.hpp"
namespace upm
{
/**
* @brief Interface for CO Sensor
*/
class ICO2Sensor : public IModuleStatus
class ICO2Sensor : virtual public IModuleStatus
{
public:
virtual uint16_t getPpm() = 0;

View File

@ -31,7 +31,7 @@ namespace upm
* @brief Interface for Humidity Sensors
*/
class IHumiditySensor : public IModuleStatus
class IHumiditySensor : virtual public IModuleStatus
{
public:
virtual int getHumidityRelative () = 0;

View File

@ -41,7 +41,7 @@ namespace upm
* @snippet light-controllers.cxx Interesting
*/
class ILightController : public IModuleStatus
class ILightController : virtual public IModuleStatus
{
public:
/**

View File

@ -43,7 +43,7 @@ namespace upm
* @snippet light-sensor.cxx Interesting
*/
class ILightSensor : public IModuleStatus
class ILightSensor : virtual public IModuleStatus
{
public:

View File

@ -31,11 +31,11 @@
namespace upm
{
/**
/*
* @brief Interface for Pressue Sensors
*/
class IPressureSensor : public IModuleStatus
class IPressureSensor : virtual public IModuleStatus
{
public:
virtual int getPressurePa() = 0;

View File

@ -31,7 +31,7 @@ namespace upm
* @brief Interface for Temperature Sensors
*/
class ITemperatureSensor : public IModuleStatus
class ITemperatureSensor : virtual public IModuleStatus
{
public:
virtual int getTemperatureCelsius () = 0;

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::IADC);
%include "iADC.hpp"

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::ICO2Sensor);
%include "iCO2Sensor.hpp"

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::IHumiditySensor);
%include "iHumiditySensor.hpp"

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::ILightController);
%include "iLightController.hpp"

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::ILightSensor);
%include "iLightSensor.hpp"

View File

@ -0,0 +1,5 @@
%include <swiginterface.i>
%interface_impl(upm::IModuleStatus);
%include "iModuleStatus.hpp"

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::IPressureSensor);
%include "iPressureSensor.hpp"

View File

@ -0,0 +1,6 @@
%include <swiginterface.i>
%include "javaupm_interfaces.i"
%include "javaupm_iModuleStatus.i"
%interface_impl(upm::ITemperatureSensor);
%include "iTemperatureSensor.hpp"

View File

@ -1,19 +1,4 @@
%module(directors="1") javaupm_interfaces
%feature("director") IModuleStatus;
%feature("director") ILightSensor;
%feature("director") ILightController;
%{
#include "iModuleStatus.hpp"
#include "iLightSensor.hpp"
#include "iLightController.hpp"
%}
%include "iModuleStatus.hpp"
%include "iLightSensor.hpp"
%include "iLightController.hpp"
%module javaupm_interfaces
%pragma(java) jniclasscode=%{
static {

View File

@ -1,26 +0,0 @@
%module(directors="1") javaupm_light_sensor
%{
#include "iLightSensor.hpp"
%}
/*
%include "../iModuleStatus.hpp"
*/
%include "iLightSensor.hpp"
%feature("director") IModuleStatus;
%feature("director") ILightSensor;
%include "iLightSensor.hpp"
%pragma(java) jniclasscode=%{
static {
try {
System.loadLibrary("javaupm_light_sensor");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. \n" + e);
System.exit(1);
}
}
%}

View File

@ -1,4 +1,5 @@
%module jsupm_interfaces
/*
%include "../upm.i"
%{
@ -9,3 +10,4 @@
%include "iModuleStatus.hpp"
%include "iLightSensor.hpp"
%include "iLightController.hpp"
*/

View File

@ -1,4 +1,5 @@
%module pyupm_interfaces
/*
%include "../upm.i"
// Include doxygen-generated documentation
%include "pyupm_doxy2swig.i"
@ -13,3 +14,4 @@
%include "iModuleStatus.hpp"
%include "iLightSensor.hpp"
%include "iLightController.hpp"
*/

View File

@ -1,4 +1,9 @@
%module javaupm_lp8860
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iLightController.i"
#endif
%include "../upm.i"
%{

View File

@ -56,7 +56,7 @@ class LP8860 : public upm::ILightController
public:
LP8860(int gpioPower, int i2cBus);
~LP8860();
const char* getModuleName() { return "lp8860"; }
virtual const char* getModuleName() { return "lp8860"; }
bool isPowered();
void setPowerOn();
void setPowerOff();

View File

@ -1,5 +1,10 @@
%module javaupm_max44009
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iLightSensor.i"
#endif
%include "arrays_java.i";
%include "../java_buffer.i"
%include "cpointer.i"

View File

@ -131,7 +131,7 @@ class MAX44009 : public ILightSensor {
*/
double getVisibleLux();
const char* getModuleName() { return "max44009"; }
virtual const char* getModuleName() { return "max44009"; }
private:
mraa::Result reset();

View File

@ -1,6 +1,11 @@
%module javaupm_ms5611
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iTemperatureSensor.i"
%include "../interfaces/javaupm_iPressureSensor.i"
#endif
%{
#include "ms5611.hpp"
%}

View File

@ -68,7 +68,7 @@ public:
MS5611(int i2cBus = 0, int address = MS5611_ADDRESS);
~MS5611();
const char* getModuleName() { return "ms5611"; }
virtual const char* getModuleName() { return "ms5611"; }
void setOverSampling(OsrMode osrMode);
int getTemperatureCelsius();
int getPressurePa();

View File

@ -1,6 +1,9 @@
%module(directors="1") javaupm_si1132
%include "../upm.i"
%include "../interfaces/javaupm_interfaces.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iLightSensor.i"
#endif
%pragma(java) jniclasscode=%{
static {

View File

@ -80,7 +80,7 @@ class SI1132 : public ILightSensor {
*/
double getVisibleLux();
const char* getModuleName() { return "si1132"; }
virtual const char* getModuleName() { return "si1132"; }
private:
mraa::Result reset();

View File

@ -1,5 +1,11 @@
%module javaupm_si7005
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iTemperatureSensor.i"
%include "../interfaces/javaupm_iHumiditySensor.i"
#endif
%include "arrays_java.i";
%include "../java_buffer.i"
%include "cpointer.i"

View File

@ -32,7 +32,6 @@
#define SI7005_ADDRESS ( 0x40 )
#define SI7005_NOT_FOUND ( 0x00 )
namespace upm {
/**
@ -99,7 +98,7 @@ class SI7005 : public ITemperatureSensor, public IHumiditySensor {
/**
* Returns sensor module name
*/
const char* getModuleName() { return "si7005"; }
virtual const char* getModuleName() { return "si7005"; }
/**
* Detects the sensor to ensure it is connected as required.

View File

@ -1,5 +1,10 @@
%module javaupm_t6713
%include "../upm.i"
#if SWIG_VERSION >= 0x030009
%include "../interfaces/javaupm_iCO2Sensor.i"
#endif
%include "arrays_java.i";
%include "../java_buffer.i"
%include "cpointer.i"

View File

@ -65,11 +65,6 @@ T6713::~T6713()
delete i2c;
}
const char* T6713::getModuleName()
{
return "t6713";
}
uint16_t T6713::getFirmwareRevision()
{
return(getSensorData(T6713_COMMAND_GET_FIRMWARE_REVISION));

View File

@ -125,7 +125,7 @@ class T6713 : public ICO2Sensor {
/**
* Returns sensor module name
*/
const char* getModuleName();
virtual const char* getModuleName() { return "t6713"; }
/**
* Get relative humidity measurement.

View File

@ -10,7 +10,7 @@ prefix = """
try {
System.loadLibrary(\""""
sufix = """\");
suffix = """\");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. \\n" + e);
System.exit(1);
@ -27,10 +27,16 @@ class AutoLoadLibrary(u.TestCase):
for fileName in files:
if fnmatch.fnmatch(fileName, 'javaupm_*.i'):
moduleName = fileName[:-2]
snippet = prefix + moduleName + sufix
snippet = prefix + moduleName + suffix
with open(os.path.join(subdir, fileName), "r") as f:
if not snippet in f.read():
#read in entire file
data = f.read()
#Make sure it is module
if not '%module' in data:
print "%%module not found in %s, skipping" % fileName
continue
if not snippet in data:
broken_modules.append('%s: %s' % \
(moduleName, os.path.join(subdir, fileName)))
@ -38,7 +44,7 @@ class AutoLoadLibrary(u.TestCase):
"\nThe following modules do not contain the standard auto load library code:\n" + \
"\n".join(broken_modules) + \
"\nConsider adding the following snippet to the SWIG interface file:\n" + \
prefix + "<module_name>" + sufix)
prefix + "<module_name>" + suffix)
if __name__ == '__main__':