Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Java JNI обертка

Вы не вошли.

 Поиск | Регистрация | Вход 

СергейT
13.05.2016 16:24:50
#1

Гость

Java JNI обертка

Добрый день,

есть ли JNI обертка для библиотек к модулю E-502-P-EU-D ?

https://ru.wikipedia.org/wiki/Java_Native_Interface

13.05.2016 17:05:42
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Java JNI обертка

Здравствуйте.
Штатно у нас нет такой обертки, хотя создание ее должно быть вполне возможным. Подобных запросов до этого не было от клиентов. Можете написать в поддержку (support@lcard.ru) с указанием, какая у Вас потребность в данных модулях (сколько планируете использовать сейчас/в будущем), чтобы можно было рассмотреть возможность создания подобной обертки.

23.05.2016 12:34:23
#3

Участник
Здесь с 13.05.2016
Сообщений: 5

Re: Java JNI обертка

Нашел самый простой способ использования библиотек из Java. Было бы очень неплохо получить поддержку интерфейса E502Api от производителя (по сути это только сопровождение одного интерфейса с описанием методов и константы).

Пример Java кода приведен ниже.

1. в ОС должна быть установлена библиотека e502api для вот этой строки         E502Api e502 = (E502Api) Native.loadLibrary("e502api", E502Api.class);

2. Maven  deps
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>4.2.0</version>
</dependency>

3. Java
package com.i4biz.experiments.e502;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.PointerType;

/**
* http://github.com/java-native-access/jn … master/www
*/
public class LibC {
    public enum t_x502_streams {
        X502_STREAM_ADC(0x01),
        X502_STREAM_DIN(0x02),
        X502_STREAM_DAC1(0x10),
        X502_STREAM_DAC2(0x20),
        X502_STREAM_DOUT(0x40),
        X502_STREAM_ALL_IN((X502_STREAM_ADC.value | X502_STREAM_DIN.value)),
        X502_STREAM_ALL_OUT((X502_STREAM_DAC1.value | X502_STREAM_DAC2.value | X502_STREAM_DOUT.value));

        public int value;

        t_x502_streams(int value) {
            this.value = value;
        }
    }

    public enum t_x502_mode {
        X502_MODE_FPGA(0),
        X502_MODE_DSP(1),
        X502_MODE_DEBUG(2);

        public int value;

        t_x502_mode(int value) {
            this.value = value;
        }
    }

    public enum t_x502_lch_mode {
        X502_LCH_MODE_COMM(0),
        X502_LCH_MODE_DIFF(1),
        X502_LCH_MODE_ZERO(2);

        public int value;

        t_x502_lch_mode(int value) {
            this.value = value;
        }
    }
    public enum t_x502_adc_range {
        X502_ADC_RANGE_10(0),
        X502_ADC_RANGE_5(1),
        X502_ADC_RANGE_2(2),
        X502_ADC_RANGE_1(3),
        X502_ADC_RANGE_05(4),
        X502_ADC_RANGE_02(5);

        public int value;

        t_x502_adc_range(int value) {
            this.value = value;
        }
    }

    public enum t_x502_ref_freq {
        X502_REF_FREQ_2000KHZ(2000000), X502_REF_FREQ_1500KHZ(1500000);

        public int value;

        t_x502_ref_freq(int value) {
            this.value = value;
        }
    }

    public enum t_x502_proc_flags {
        X502_PROC_FLAGS_VOLT(0x00000001),
        X502_PROC_FLAGS_DONT_CHECK_CH(0x00010000);

        public int value;

        t_x502_proc_flags(int value) {
            this.value = value;
        }
    }

    public interface E502Api extends Library {


        int E502_UsbGetSerialList(long[] serials, int size, int flags, PointerType devcnt);

        long X502_Create();

        int E502_OpenUsb(long handle, String serial);

        int X502_SetMode(long handle, int mode);

        int X502_Close(long handle);
        int X502_Free(long handle);

        //        ==============================
        int X502_Configure(long hnd, int flags);

        int X502_SetLChannelCount(long hnd, int lch_cnt);

        int X502_SetLChannel(long hnd, int lch, int phy_ch, int mode, int range, int avg);

        int X502_SetRefFreq(long hnd, int freq);

        int X502_SetAdcFreq(long hnd, double[] f_acq, double[] f_frame);

//        ==============================


        int X502_StreamsEnable(long handle, int streams);

        int X502_StreamsDisable(long hnd, int streams);

        int X502_StreamsStart(long handle);

        int X502_StreamsStop(long hnd);
        int X502_Recv(long handle, int[] buffer, int size, int tout);

        int X502_ProcessData(long hnd,
                             int[] src, int size, int flags,
                             double[] adc_data, int[] adc_data_size,
                             int[] din_data, int[] din_data_size);
    }

    public static void main(String[] args) throws Exception {
        E502Api e502 = (E502Api) Native.loadLibrary("e502api", E502Api.class);
//        long[] serials = new long[10];
//        int res = e502.E502_UsbGetSerialList(serials, serials.length, 1, null);
//        if (res == 0) {
//            throw new Exception("No devices found.");
//        }

//        long serial = serials[0];
//        System.out.println("Serial: " + serial);


        long handle = e502.X502_Create();
        System.out.println("Handle: " + handle);
        try {
            e502.E502_OpenUsb(handle, null);

            e502.X502_SetMode(handle, t_x502_mode.X502_MODE_FPGA.value);

            {//configure channels
                e502.X502_SetLChannelCount(handle, 1);

                //первый логический канал соответствует измерению 1 канала относительно общей земли
                e502.X502_SetLChannel(handle, 0, 0, t_x502_lch_mode.X502_LCH_MODE_COMM.value, t_x502_adc_range.X502_ADC_RANGE_10.value, 0);

                //второй логический канал соответствует измерению 16 канала
//                e502.X502_SetLChannel(handle, 1, 15, t_x502_lch_mode.X502_LCH_MODE_COMM.value, t_x502_adc_range.X502_ADC_RANGE_10.value, $

                //третий логический канал - измерение 17-го канала
//                e502.X502_SetLChannel(handle, 2, 16, t_x502_lch_mode.X502_LCH_MODE_COMM.value, t_x502_adc_range.X502_ADC_RANGE_10.value, $

                e502.X502_SetRefFreq(handle, t_x502_ref_freq.X502_REF_FREQ_2000KHZ.value);

                double[] facq = new double[]{20000};
                double[] fframe = new double[]{20000};
                e502.X502_SetAdcFreq(handle, facq, fframe);

                e502.X502_Configure(handle, 0);
            }
            e502.X502_StreamsEnable(handle, t_x502_streams.X502_STREAM_ADC.value);
            e502.X502_StreamsStart(handle);

            boolean a = true;

            while (a) {
                int[] buffer = new int[1000];
                int readWordsAmount = e502.X502_Recv(handle, buffer, buffer.length, 0);

                double[] adc_data = new double[1000];
                int[] adc_data_size = new int[]{adc_data.length};
                e502.X502_ProcessData(
                        handle, buffer, readWordsAmount,
                        t_x502_proc_flags.X502_PROC_FLAGS_VOLT.value,
                        adc_data, adc_data_size,
                        null, null
                );

                System.out.println(System.currentTimeMillis() + " : " + readWordsAmount + " : " + adc_data_size[0]);
                for (int i = 0; i < adc_data_size[0]; i++) {
                    System.out.println(adc_data[ i ]);
                }
                Thread.sleep(1000);
            }

            e502.X502_StreamsStop(handle);
            e502.X502_StreamsDisable(handle, t_x502_streams.X502_STREAM_ADC.value);

            e502.X502_Close(handle);
        } finally {
            e502.X502_Free(handle);
        }
    }
}

23.05.2016 15:04:32
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Java JNI обертка

Спасибо за пример!

Мы можем включить на его основе поддержку E502/L502 в Java, но для этого нужно сперва самим посмотреть код, проверить сборку, включить все недостающие функции как L502, так и E502, чтобы дальше его можно было сопровождать. Я посмотрю код, только детально смогу это сделать где-то через неделю или две, тогда постараюсь включить поддержку в штатный наш SDK.

23.05.2016 21:21:21
#5

Участник
Здесь с 13.05.2016
Сообщений: 5

Re: Java JNI обертка

Алексей L Card пишет:

Спасибо за пример!

Мы можем включить на его основе поддержку E502/L502 в Java, но для этого нужно сперва самим посмотреть код, проверить сборку, включить все недостающие функции как L502, так и E502, чтобы дальше его можно было сопровождать. Я посмотрю код, только детально смогу это сделать где-то через неделю или две, тогда постараюсь включить поддержку в штатный наш SDK.

Отлично, Спасибо.

01.10.2017 00:43:41
#6

Участник
Здесь с 13.05.2016
Сообщений: 5

Re: Java JNI обертка

Добрый день,

Параметры среды:
1. ubuntu 14.04.5 (libe502api.so.1.1.9)
2. прошивка e502-m4.bin
3. L-Card Measurement Studio 1.2.2 работает нормально как по сети, так и через USB
4. JNA (проверял на 4.2.0 и 4.5.0)

После обновления прошивки, на приведенном выше примере, а именно в месте

double[] facq = new double[]{20000};
double[] fframe = new double[]{20000};
int res = e502.X502_SetAdcFreq(handle, facq, fframe);

получаю код "-7"


В т.ч. при попытке установить соединение через IP (E502 напрямую соединен кабелем с компьютером, пинг проходит, файрвола нет)
          int res = e502.E502_OpenByIpAddr(
                    handle,
                    0xC0A80032,// 192.168.0.50,
                    0,
                    1000
            );
возвращает код "-155"

В чем может быть проблема ?

03.10.2017 11:20:34
#7

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Java JNI обертка

Здравствуйте.

Честно говоря не до конца понятно как описанное может быть связано именно с обновлением прошивки. Возможно были какие-то еще изменения в системе? работало до этого у Вас на той же машине?
Функция X502_SetAdcFreq библиотеки возвращает -7 только если передать нулевой указатель в качестве facq (кстати не до конца понятно зачем массив на 20000 точек).
Код -155 соответствует ошибке открытия TCP-соединения.
Больше похоже, что проблема в не совсем правильной передаче параметров. Например смущает, что тот же handle у Вас идет как long, хотя в библиотеке это указатель и их размеры одинаковы только на 32-битной системе, а в 64-битной будет разный.

03.10.2017 12:21:42
#8

Участник
Здесь с 13.05.2016
Сообщений: 5

Re: Java JNI обертка

Добрый день,

ответы по тексту:

Алексей: Честно говоря не до конца понятно как описанное может быть связано именно с обновлением прошивки. Возможно были какие-то еще изменения в системе?
Сергей: обновлял операционку с Ubuntu 12.04 до Ubuntu 14.04 и обновлял прошивку

Алексей: работало до этого у Вас на той же машине?
Сергей: да на этой же.


Алексей:  Функция X502_SetAdcFreq библиотеки возвращает -7 только если передать нулевой указатель в качестве facq (кстати не до конца понятно зачем массив на 20000 точек).

Сергей: double[] facq = new double[]{20000};  - это массив из одного элемента со значением 20000 (мануалка по мэппингу типов JNA (JAVA <-> C ) https://github.com/java-native-access/j … appings.md )


Алексей:  Код -155 соответствует ошибке открытия TCP-соединения.
Больше похоже, что проблема в не совсем правильной передаче параметров. Например смущает, что тот же handle у Вас идет как long, хотя в библиотеке это указатель и их размеры одинаковы только на 32-битной системе, а в 64-битной будет разный.

Сергей: перепроверю соответствия типов, может быть тут лоханулся.

Уточните правильно ли я понял информацию про t_x502_hnd:
1. Для OS 64 бита длинна указателя будет 8 байт - тип long
2. Для OS 32 бита длинна указателя будет 4 байта - тип int

?

Спасибо.

03.10.2017 12:56:01
#9

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Java JNI обертка

Да, насчет размеров 8 и 4 - так. Думаю лучше всего использовать тип Pointer вместо t_x502_hnd

03.10.2017 13:10:31
#10

Участник
Здесь с 13.05.2016
Сообщений: 5

Re: Java JNI обертка

Алексей L Card пишет:

Да, насчет размеров 8 и 4 - так. Думаю лучше всего использовать тип Pointer вместо t_x502_hnd

Понял, если бы была С тут бы вопрос скорее всего не возник.

В случае с JNA (Java) скорее всего придется два интерфейса поддерживать для 32 бит и 64 бит.

Спасибо за детали.

03.10.2017 18:33:17
#11

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Java JNI обертка

Ну в Java вроде тоже есть Pointer (в вашей таблице - последняя строка)

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск