streamer_halstreamer
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: streamer_halstreamer
сейчас попробую...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: streamer_halstreamer
маг ??Алексс писал(а):Все как-бы должно работать, но нужно убрать обнуление tt, иначе в streamer сбивается синхронизация
и тип tt заменить на unsigned.
четыре раза перезалил очередь - работает как надо!
надеюсь и 444 раза будет так же))
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: streamer_halstreamer
пока дух ритчи тут витает:
а можно ли размерность массива задать "снаружи" - пином??
вот как бы с наскоку не дает...
а можно ли размерность массива задать "снаружи" - пином??
вот как бы с наскоку не дает...
- Алексс
- Почётный участник

- Сообщения: 2210
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 266
- Заслуга: IQ32
- Настоящее имя: Алексей
- Откуда: Прага
- Контактная информация:
Re: streamer_halstreamer
перепиши код на с (примеры в hal/components) и можно крутить вертеть как хочешь.
хотя вот примерный сценарий для попробовать:
нетестировано 
хотя вот примерный сценарий для попробовать:
Код: Выделить всё
/* sudo halcompile --install kl.comp */
component kl;
pin out s32 inspection0;
pin out s32 inspection1;
pin out s32 inspection2;
pin out s32 inspection3;
pin in s32 insreamer ; //streamer.0.pin.0
pin in u32 arr_len;
pin in bit empty ; //streamer.0.empty
pin out bit clock ; //streamer.0.clock
pin in s32 pin_len ; // arr len
variable int i = 0;
variable int tt = 0;
int *arr_line = 0;
unsigned arr_len_old = 0;
// статик не нужно юзать - в случае двух и более компонентов будет засада
function _;
license "GPL";
;;
FUNCTION(_) {
if(!arr_line) {
arr_line = (int *)hal_malloc(arr_len * sizeof(streamer_t));
}
if (empty == 0) { //streamer.0.empty
if (tt % 2 != 0) {
clock = 0; //streamer.0.clock (streamer.0.clock-mode 2)
arr_line[i] = insreamer; //streamer.0.pin.0
i++;
} else {
clock = 1;
}
tt++;
} else {
i=0;
if(arr_line != arr_line_old) {
// realloc
// todo release pointer
arr_line = (int *)hal_malloc(arr_len * sizeof(streamer_t));
all_line_old = arr_line;
}
}
inspection0 = arr_line[0];
inspection1 = arr_line[1];
inspection2 = arr_line[2];
inspection3 = arr_line[3];
}
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: streamer_halstreamer
это не "расширение" размера массива при каждой (новой) надобности?
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: streamer_halstreamer
синхронизацию надо вообще делать независимую от сервоцикла, а то могут возникать "чудеса на ровном месте", например в зависимости от порядка addf.Алексс писал(а):иначе в streamer сбивается синхронизация
Т.е. "щелкать" clock'ом надо тогда, когда готов получить очередную порцию данных.
Например при передаче надо сначала выставить на выход данные и только потом взвести clock. Перед сменой данных надо сначала "опустить" clock...
При приёме надо сначала дождаться взведеня clock и только потом читать данные.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: streamer_halstreamer
в данном случае - работает стандартный компонент емс...UAVpilot писал(а):синхронизацию надо вообще делать независимую от сервоцикла, а то могут возникать "чудеса на ровном месте", например в зависимости от порядка addf.
он по любому "привязан к сервоциклу,ибо его все переменные(пины) не могут обновиться вне сервоцикла...
------
а синхронизация...
так она тут условная - получаем новую порцию по срабатыванию пина(пин clock)
опять же - этот пин обновляется только в сервоцикле...
- Алексс
- Почётный участник

- Сообщения: 2210
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 266
- Заслуга: IQ32
- Настоящее имя: Алексей
- Откуда: Прага
- Контактная информация:
Re: streamer_halstreamer
По сути да. Если это не нужно, то необходимо обрабатывать входящие параметры в компоненте.nkp писал(а):это не "расширение" размера массива при каждой (новой) надобности?
К стати, после компиляции компоненты в упрощенном стиле (comp) можно найти нормальный сишный исходник. Я както это делал, но не помню если halcomp это позволяет прямо или пришлось пошарить в tmp директориях.
Может быть полезно.
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
- Алексс
- Почётный участник

- Сообщения: 2210
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 266
- Заслуга: IQ32
- Настоящее имя: Алексей
- Откуда: Прага
- Контактная информация:
Re: streamer_halstreamer
Вполне возможно что так оно и есть.UAVpilot писал(а):Алексс писал(а):в зависимости от порядка addf.
Думаю идеально бы было иметь общий сигнал когда передатчик выставляет его в 1 - есть данные а приемник сбрасывает в 0 - прочитано.
Тогда бы не было зависимости на порядке вызова компонент. Но это только в случае 1-1.
Имхо
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: streamer_halstreamer
Я про твой код: у тебя clock меняется с 0 на 1 в каждом чётном сервоцикле, и с 1 на 0 в каждом нечётном - зависимости от готовности данных никакой.nkp писал(а):в данном случае - работает стандартный компонент емс...
Например когда сигналы передаются в обе стороны, clock от А к В, а данные от В к А (addf в алфавитном порядке), то изменения clock дойдут от А к В в пределах одного и того-же сервоцикла, а вот данные от В А увидит только в следующем... В твоём случае А уже изменит состояние clock на противоположное.nkp писал(а):а синхронизация...
так она тут условная - получаем новую порцию по срабатыванию пина(пин clock)
опять же - этот пин обновляется только в сервоцикле...
Или делать в компоненте две функции read и write, read помещать в начало сервоцикла, а write в конец. Для примера см. hostmot2.Алексс писал(а):Думаю идеально бы было иметь общий сигнал когда передатчик выставляет его в 1 - есть данные а приемник сбрасывает в 0 - прочитано.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: streamer_halstreamer
да ,если поменять очередность вызова функций,то работа хромает:
"пропускает" первую итерацию,потом "догоняет"...
--------
но это не исключительный случай в емс,
где функции требуется располагать в определенном порядке...
"пропускает" первую итерацию,потом "догоняет"...
--------
но это не исключительный случай в емс,
где функции требуется располагать в определенном порядке...