CAN + Animation + Android 2.3.7

Ответить
jablon
Сообщения: 3
Зарегистрирован: 26 авг 2013, 14:10

CAN + Animation + Android 2.3.7

Сообщение jablon » 28 авг 2013, 10:21

Здравствуйте, уважаемые форумчане!

Задача:
Получать много сообщений по CAN или ADC (АЦП) и в зависимости от данных двигать стрелки "одновременно".

Проблема:
Listener CAN получает сообщение и вызывает Handler обновления анимации
Handler в CAN сообщении ищет ID, и в зависимости от ID формирует данные и задает угол вращения
if (ID == 0) funcAnimation(0, curAngle, endAngle);
if (ID == 1) funcAnimation(1, curAngle, endAngle); и тд.
funcAnimation(x) - вращает стрелку (x) на заданный угол (endAngle), от текущего ее положения (curAngle)

а) Когда по CAN приходит 1 сообщение (причем любое сообщение) все работает как надо - стрелка двигается, останавливается и продолжает двигаться в другое место, когда приходит другое сообщение.

б) Когда приходит 1, а потом 2 сообщение и так далее в таком порядке, то все работает почти как надо - 1 стрелка едет туда куда ее послали не прерываясь на новое сообщение, а 2 - одновременно может двигаться также быстро как и приходят новые сообщения, то есть 1 стрелка пока не отработает полученное сообщение не остановится, а 2 стрелка будет реагировать на все получаемые сообщения.

в) Когда приходит 2, а потом 1 сообщение - то все работает не так как надо - то есть сначала двигается стрелка 2, а когда закончит двигается стрелка 1.
:?: Вот я не могу этого понять - почему так? (думаю что Handler CAN не успевает все сообщения перехватывать или не организовал очередь CAN сообщений)

Вопрос:
Как поворачивать много ImageView (в моем случае) одновременно и в зависимости от получаемых данных, получаемых от куда угодно, например, от CAN или ADC или UART?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: CAN + Animation + Android 2.3.7

Сообщение KamiSempai » 28 авг 2013, 10:56

Несколько раз перечитал, но так и не понял принципы работы.
Но возможно проблема из аза того, что Handler обрабатывает сообщения в том порядке в котором они поступили. И делает он это по очереди, пока первое сообщение не обработается ко второму не приступит.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

jablon
Сообщения: 3
Зарегистрирован: 26 авг 2013, 14:10

Re: CAN + Animation + Android 2.3.7

Сообщение jablon » 29 авг 2013, 07:01

А как сделать чтобы все сообщения обрабатывались и одновременно?

Просто я плохо умею объяснять ( может код поможет разобраться )
// Я хочу понять как сделать так, чтобы стрелки двигались одновременно, в зависимости от получаемых данных.

Это Listener CAN, который сохраняет в глобальной переменной полученный кадр и вызывает Handler
@Override
public void frameReceived(CANFrame frame)
{
canObj1Msg = frame;
h2.post(workFrame);
}

Это Handler обновления полученного CAN сообщения
private Handler h2 = new Handler();

Это его Runnable
private Runnable workFrame = new Runnable()
{
@Override
public void run()
{
int id = canObj1Msg.id; // идентификатор сообщения
final byte[] data = canObj1Msg.data; // байты данных

if (id == 0)
{
int tmp0 = (data[7] & 0x00ff)<< 8; // маскирование байта до целого,
tmp0 |= (data[6] & 0x00ff); // чтобы убрать FF из старшей части переменной
curValue0 = tmp1/256.;
if (curValue0 != oldValue0)
{
final float desAngleOfValue0 = (float)(330+(1.84*curValue0));
funcAnimation(0, curDegree[0], desAngleOfValue0, 5992);
oldValue0 = curValue0;
}
}

if (id == 1)
{
int tmp1 = (data[4] & 0x00ff)<< 8; // маскирование байта до целового,
tmp1 |= (data[3] & 0x00ff); // чтобы убрать FF из старшей части переменной
curValue1 = tmp2/8.;
if (curValue1 != oldValue1)
{
final float desAngleOfValue1 = (float)(330+(1.84*curValue1)/25);
funcAnimation(1, curDegree[1], desAngleOfValue1, 3864);
oldValue1 = curValue1;
}
}
}
};

Это функция вращения картинки
public void funcAnimation(int aNum, float from, float to, long fullDuration)
{
final int _aNum = aNum;
final float _from = from, _to = to;
Animation anim = arrow[aNum].getAnimation();
if (anim!=null) anim.cancel();
rotate[aNum] = new RotateAnimation(
from, to,
Animation.RELATIVE_TO_SELF, 0.9f,
Animation.RELATIVE_TO_SELF, 0.5f)
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t)
{
float lastDegree = _from+(_to-_from)*interpolatedTime;
super.applyTransformation(interpolatedTime, t);
curDegree[_aNum] = lastDegree;
}
};
float koefDuration = Math.abs(to-from)/257.6f;
long animDuration = (long)(fullDuration*koefDuration);
rotate[aNum].setInterpolator(new DecelerateInterpolator());
rotate[aNum].setFillAfter(true);
rotate[aNum].setDuration(animDuration);
arrow[aNum].startAnimation(rotate[aNum]);
arrow[aNum].refreshDrawableState();
}

jablon
Сообщения: 3
Зарегистрирован: 26 авг 2013, 14:10

Re: CAN + Animation + Android 2.3.7

Сообщение jablon » 29 авг 2013, 07:07

Если обобщить задачу, то это выглядит так:
Представить в графическом виде на одном окне показания от всех или почти всех датчиков в Android - устройстве (хотя б от акселерометра, датчика магнитного поля и, например, датчика освещенности).

Ответить