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

Ответить
Chvalov
Сообщения: 24
Зарегистрирован: 28 мар 2014, 16:57

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

Сообщение Chvalov » 29 авг 2015, 20:10

Мне нужно при нажатии кнопки, допустим 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], а не так как сейчас

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 29 авг 2015, 22:51

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

Chvalov
Сообщения: 24
Зарегистрирован: 28 мар 2014, 16:57

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

Сообщение Chvalov » 29 авг 2015, 23:31

Тогда сразу вопрос, если у меня в коде уже используется один handler, можно ли использовать еще один ?
Последний раз редактировалось Chvalov 29 авг 2015, 23:34, всего редактировалось 1 раз.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 29 авг 2015, 23:32

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

http://stackoverflow.com/a/1921759
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Chvalov
Сообщения: 24
Зарегистрирован: 28 мар 2014, 16:57

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

Сообщение Chvalov » 29 авг 2015, 23:43

Мой 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]

Ответить