Привет всем. Нашел на гитхабе набросок мидлета для работы с 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 секунд. Из за чего могут быть тормоза? Это сообщение отредактировал(а) oxygenh - 5.12.2014, 16:48
|