Поскольку приезд ADK задерживается а в загашниках имеется Arduino и USB Host Shield, то грех было не попробовать собрать заменитель ADK и подружить матрицу с Android. На самом деле раньше я уже собирал заменитель ADK, там же описаны проблемы, с которыми я столкнулся, так что тут уже не будем поднимать эту тему, а поговорим о передаче данных и их кодировании.
Итак, напомню, что у нас есть матрица размером 32х16 (512 светодиодов), способная отображать 3 цвета - зеленый, красный и оранжевый. Четвертый цвет - черный (светодиод погашен), т.е. для передачи состояния светодиода достаточно двух битов:
00 - черный
01 - зеленый
10 - красный
11 - оранжевый
Выходит что в одном байте можно передать состояния четырех светодиодов, осталось всего лишь реализовать алгоритм кодирования и декодирования состояний четырех светодиодов в один байт, и тут на помощь приходят битовые операции
Android (кодирование):
Сама работа с Usb Accessory взята из DemoKit приложения. Результат можно наблюдать на видео:
Все-таки при перерисовке большой области заметны лаги, похоже следующий этап - оптимизация.
[1] Исходный код LedMatrix
[2] Android Open Accessory API
Итак, напомню, что у нас есть матрица размером 32х16 (512 светодиодов), способная отображать 3 цвета - зеленый, красный и оранжевый. Четвертый цвет - черный (светодиод погашен), т.е. для передачи состояния светодиода достаточно двух битов:
00 - черный
01 - зеленый
10 - красный
11 - оранжевый
Выходит что в одном байте можно передать состояния четырех светодиодов, осталось всего лишь реализовать алгоритм кодирования и декодирования состояний четырех светодиодов в один байт, и тут на помощь приходят битовые операции
Android (кодирование):
byte[] frame;
frame = new byte[128];
Arrays.fill(frame, (byte) 0);
/*...*/
// в циклах с перебором координат по X (i) и Y (z) и формированием color
frame[i * 4 + (int) z/4] = (byte) (frame[i * 4 + (int) z/4] | (color << (z % 4) * 2));
/*...*/
mActivity.sendCommand(frame);
Arduino (декодирование):
byte msg[128];
if (acc.isConnected()) {
int len = acc.read(msg, sizeof(msg), 1);
for (int i = 0; i < len; i++){
plot(i * 4 + 0, (msg[i] >> 0) & 3);
plot(i * 4 + 1, (msg[i] >> 2) & 3);
plot(i * 4 + 2, (msg[i] >> 4) & 3);
plot(i * 4 + 3, (msg[i] >> 6) & 3);
}
}
Сама работа с Usb Accessory взята из DemoKit приложения. Результат можно наблюдать на видео:
Все-таки при перерисовке большой области заметны лаги, похоже следующий этап - оптимизация.
[1] Исходный код LedMatrix
[2] Android Open Accessory API
No comments:
Post a Comment