Страница 1 из 1

Как правильно составить цикл с разной паузой для команды ?

Добавлено: 29 авг 2015, 20:10
Chvalov
Мне нужно при нажатии кнопки, допустим button1 и button2 выполнять следующее:
При нажатии на button1
Отправлять следующие команды:
[syntax=java]addCRC(new byte[]{1, 0x5, 11, 5 ,0, 0}); //10 сек
addCRC(new byte[]{1, 0x5, 11, 1 ,0, 0}); //0 сек
addCRC(new byte[]{1, 0x5, 0, 5 ,0, 0}); //30 сек
addCRC(new byte[]{1, 0x5, 1, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 2, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 3, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 4, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 5, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 6, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 7, 5 ,0, 0}); //5 сек
addCRC(new byte[]{1, 0x5, 8, 5 ,0, 0}); //5 сек[/syntax]
А при нажатии на кнопку button2 должны отправятся вот эти команды только в обратном порядке

[syntax=java]addCRC(new byte[]{1, 0x5, 0, 1 ,0, 0});
addCRC(new byte[]{1, 0x5, 1, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 2, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 3, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 4, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 5, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 6, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 7, 1 ,0, 0}); //5сек
addCRC(new byte[]{1, 0x5, 8, 1 ,0, 0}); //5сек[/syntax]
С 9 по 1 с задержками

Вот рабочий пример при нажатии на кнопку который отправляет одну команду:
[syntax=java]bytesToSend = addCRC(new byte[]{0x1, 0x3, 0x0, 0x0 ,0x0, 0x0});
mPhysicaloid.write(bytesToSend, bytesToSend.length);[/syntax]
Как мне через [syntax=java]mPhysicaloid.write[/syntax] отправлять команды с задержкой после каждой команды (Время задержки указаны в комментариях) ?

И как можно это все красиво переделать чтобы не получался такой громоздкий и тупой код ?

Я думаю что это должно быть как то так:
[syntax=java]public byte[] MyListComands = new byte[11];

public void onClickWrite(View v) {
new Thread() {
@Override
public void run() {
int TimeOut = 0;
try {
for (int i = 0; i <= 11; i++, Thread.sleep(TimeOut)) {
MyListComands = addCRC(new byte[]{1, 0x5, 1, 5 ,0, 0});
// Тут как я догоняю должно быть то - что в зависимости от значение "i"
// будет присваивать новое значение таймеру TimeOut
mPhysicaloid.write(MyListComands, MyListComands.length);
}
} catch (InterruptedException ex) {
// тут хз что ;(
}
}

}.start();
}[/syntax]
Но эта работать не будет, а как сделать правильно и чтобы работало я так и не догнал :( ?

Хотя есть чувство что должно быть так: [syntax=java]public byte[][] MyListComands = new byte[11][8];[/syntax], а не так как сейчас

Re: Как правильно составить цикл с разной паузой для команды

Добавлено: 29 авг 2015, 22:51
doter.ua
Ты же в джаве епта, создай свой класс с полями: команда и время. За одно и метод сенд() пропиши для отправки "себя". Лучше юзай handler.postDelayed вместо слип.
Еще можно абстрактную ID следующего запроса в класс добавить, чтобы вызывать его после себя.
первыйЗапрос.сенд()
в нем будет постДилейд для отправки следующего. Ту айдишку можно условно связать с массивом запросов. массив.get(ИД).сенд()
а он уже вызовет следующего. у последнего ид = -1 чтобы завершить, если такая встретится. Ну ты понял. Все мелочи прояснятся во время написания.

Re: Как правильно составить цикл с разной паузой для команды

Добавлено: 29 авг 2015, 23:31
Chvalov
Тогда сразу вопрос, если у меня в коде уже используется один handler, можно ли использовать еще один ?

Re: Как правильно составить цикл с разной паузой для команды

Добавлено: 29 авг 2015, 23:32
doter.ua
Chvalov писал(а):
doter.ua писал(а):
Тогда сразу вопрос, если у меня в коде уже используется один handler, можно ли использовать еще один ?
если используешь sendMessage то нужно отличать их. А вообще в пост дилейд кладется нью раннабл().

http://stackoverflow.com/a/1921759

Re: Как правильно составить цикл с разной паузой для команды

Добавлено: 29 авг 2015, 23:43
Chvalov
Мой Handler[syntax=java] Handler mHandler = new Handler();
private void tvAppend(TextView tv, CharSequence text) {
final TextView ftv = tv;
final CharSequence ftext = text;
mHandler.post(new Runnable() {
@Override
public void run() {
ftv.append(ftext);
}
});
}[/syntax]

Все ответы от него я получаю вод так:
[syntax=java] mPhysicaloid.addReadListener(new ReadLisener() {
String readStr;

// callback when reading one or more size buffer
@Override
public void onRead(int size) {
byte[] buf = new byte[size];

mPhysicaloid.read(buf, size);
try {
readStr = new String(buf, "UTF-8");
} catch (UnsupportedEncodingException e) {
return;
}
// UI thread
tvAppend(tvRead, Arrays.toString(buf) + "\n");
}
});[/syntax]