Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Тормоза при чтении с BlueTooth датчика


Автор: oxygenh 5.12.2014, 16:45
Привет всем.
Нашел на гитхабе набросок мидлета для работы с bluetooth датчиком пульса. Сделал изменения в части протокола взаимодействия. Запустилось и работает, но почему то медленно. Поясню: в документашке производителя датчика описан протокол и сказано, что датчик посылает информационную посылку раз в секунду. В информационной посылке есть текущий пульс, а также количество ударов насчитанных датчиком с момента его включения (от 0 до 255 и потом снова). Код, отвечающий за прослушку и обработку посылки с датчика вот такой: 

Код

public class HRM implements Runnable {

    private final int STATE_INITIAL=1;
    private final int STATE_DLC=2;

    private final int STATE_FIRMWARE_ID1=3;
    private final int STATE_FIRMWARE_ID2=4;
    private final int STATE_FIRMWARE_VER1=5;
    private final int STATE_FIRMWARE_VER2=6;
    private final int STATE_HARDWARE_ID1=7;
    private final int STATE_HARDWARE_ID2=8;
    private final int STATE_HARDWARE_VER1=9;
    private final int STATE_HARDWARE_VER2=10;

    private final int STATE_BATTERY=11;
    private final int STATE_HRM=12;
    private final int STATE_HRBN=13;

    private boolean connected=false;
    private boolean isActive=false;

    private int state=STATE_INITIAL;
    private int mark1=0;
    private int mark2=0;
    private int u1=0;
    private int u2=0;
    private int battery=0;
    private int hr=0;
    private int hb=0;

    private String bt;

    private StreamConnection c;
    private DataInputStream data;

    private HRMListener lh;

    public HRM(HRMListener lh) {
        this.lh=lh;
    }

    public void setHRMBtAddress(String bt) {
        this.bt=bt;
    }

    /*
    */
    private boolean readHRMData() {
        int i=-1;

        try {
            i=data.read();
        } catch (IOException e) {
            Log.loge("IOe", e);
            return false;
        }

        if (i==-1)
            return false;
        if (i==0)
            return true;

        switch (state) {
            // Looking for start MSG ID byte 0x26
            case STATE_INITIAL:
                if (i==0x26) {
                    // We got start marker, go to next state
                    state=STATE_DLC;
                } else {
                    return true;
                }
                break;

            case STATE_DLC:
                //mark1=i;
                if (i==0x37) {
                    // We got start marker, go to next state
                    state=STATE_FIRMWARE_ID1;
                } else {
                    return true;
                }

            case STATE_FIRMWARE_ID1:
                state = STATE_FIRMWARE_ID2;
                break;

            case STATE_FIRMWARE_ID2:
                state=STATE_FIRMWARE_VER1;
                break;

            case STATE_FIRMWARE_VER1:
                state=STATE_FIRMWARE_VER2;
                break;

            case STATE_FIRMWARE_VER2:
                state=STATE_HARDWARE_ID1;
                break;

            case STATE_HARDWARE_ID1:
                state=STATE_HARDWARE_ID2;
                break;

            case STATE_HARDWARE_ID2:
                state=STATE_HARDWARE_VER1;
                break;

            case STATE_HARDWARE_VER1:
                state=STATE_HARDWARE_VER2;
                break;

            case STATE_HARDWARE_VER2:
                // 0x81 ?
                u1=i;
                state=STATE_BATTERY;
                break;

            case STATE_BATTERY:
                // Battery level ?

                battery=i;
                lh.heartRateBattery(battery);

                state=STATE_HRM;
                break;

            case STATE_HRM:
                hr=i;
                lh.heartRate(hr);
                // Ok, we got what we need, wait for initial marker. We ignore anything else for now
                state=STATE_HRBN;
                break;

            case STATE_HRBN:
                hb=i;
                lh.heartRateBeatNumber(hb);
                // Ok, we got what we need, wait for initial marker. We ignore anything else for now
                state=STATE_INITIAL;
                break;
        }

        return true;
    }

    public int getHR() {
        return hr;
    }

    private boolean connect() {
        try {
            c = (StreamConnection) Connector.open(bt, Connector.READ_WRITE, true);
            data = new DataInputStream(c.openInputStream());
            connected = true;
            lh.heartRate(0);
            lh.heartRateConnected();
            return true;
        } catch (ConnectionNotFoundException e) {
            lh.heartRateError("CNFE"+e.getMessage());
        } catch (IOException e) {
            disconnect();
            lh.heartRateError("IOe"+e.getMessage());
        } catch (IllegalArgumentException e) {
            lh.heartRateError("IAE"+e.getMessage());
        } catch (SecurityException e) {
            lh.heartRateError("SE"+e.getMessage());
        }
        return false;
    }

    private void disconnect() {
        try {
            if (data!=null)
                data.close();
            if (c!=null)
                c.close();
        } catch (IOException e) {

        }
        data=null;
        c=null;
        connected = false;
        lh.heartRateDisconnected();
    }

    public void stop() {
        isActive=false;
    }

    public void run() {
        if (connect()==false) {
            lh.heartRateError("ConFail");
            lh.heartRateDisconnected();
            return;
        } else {
            lh.heartRateConnected();
        }
        isActive=true;
        
        while (isActive) {
        
            boolean r=readHRMData();
            if (r==false) {
                lh.heartRateError("RF");
                // return;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                //
            }
        }
        disconnect();
    }
}



Как видно нить читает данные из потока, обрабатывает их и засыпает на 0.1 секунду.  А на деле получается такое ощущение, что каждую посылку отправленную с датчика он обрабатывает 6 секунд. Из за чего могут быть тормоза? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)