Пользователь
Регистрация: 22.01.2013
Город: Москва
Регион: 77, 97, 99, 177
Машина: Renault Duster
Сообщений: 38
|
Закончил с переделкой кнопок с ардуино. Подключал уже не через резисторы, а все 6 проводов к цифровым входам. Таким образом смог задействовать скролл и подчистить сам скетч.
Провода по пинам:
13-черный;
11-красный;
10-коричневый;
7-синий;
6-зеленый;
5-желтый;
От земли к пинам 13,11,10 - резисторы по 4-10кОм. Большинство кнопок возвращают коды нажатия клавиатуры. Остальные для RemoteWhellControll с xda. Почти у каждой кнопки по 3 положения. Длина зажатия определяется "LongPressTime" и "LooongPressTime". Возвращаемые значения в большом массиве. Если вдруг кто захочет использовать и не сможет разобраться, пишите.
Код:
нажатие зажим менее 2 секунд зажим более 2 секунд
media HOME тек. Музыка меню приложен. музыки
radio BACK тек. Нави меню приложен. нави
+ D_PAD_LEFT след. трек
play D_PAD_CENTER PLAY_PAUSE MUTE
- D_PAD_RIGHT пред. трек
ok SEARCH контакты сочетание ALT+TAB
scrollUp D_PAD_UP
scrollDown D_PAD_DOWN
По опыту использования кнопок с августа понял что не самое главное это открытие предопределенных приложений, а возможность управлять планшетом без использования тача. Так и реализовал. D_PAD аналог стрелок на клавиатуре и ENTER. Получилось использовать практически все кнопки без переопределения Generic.kl. Только кнопку SEARCH пришлось переопределить. Все функции что написаны на русском реализованы таскером и РемоутКонтроллом.
Код:
int rows[]={5,6,7}; //указываем пины строк.
int scroll=3;
int cols[]={10,11,13}; //и столбцов
int scrollWire=0;
int Button=0;
int ArrayOfAltTab=0;
int AtlTab=-3;
int LooongPressTime=1900;
int LongPressTime=550;
int PauseButton=6;
int test=0;
int AltEsc=-4;
int KEY_END_TAB=-2;
int KEY_SEARCH=-5;
//int LEFT_ALT=(125);
//int TAB=13;
//int KEY_SHIFT=14;
//int DPad=KEY_RETURN;
//int DUp=KEY_UP_ARROW;
//int DDown=KEY_DOWN_ARROW;
//int Dleft=KEY_LEFT_ARROW;
//int DRight=KEY_RIGHT_ARROW;
int Buttons[3][3]={
{0,3,6},//{"ScrollUP","DOWN","Media"},
{1,4,7},//{"ScrollDown","Search","Radio"},
{2,5,8}//{"3","UP","PLAY"}
};
int idButtons[9][5]={
//0 1 2 keyboard ALTTab
{-1, 0, 0, KEY_UP_ARROW, KEY_TAB},//ScrollUP
{-1, 0, 0, KEY_DOWN_ARROW, KEY_LEFT_SHIFT},//ScrollDown
{0, 0, 0, 0, 0},//не такой кнопки
{0, 1555, 0, KEY_LEFT_ARROW, KEY_LEFT_SHIFT},//DOWN
{666, 1666, AtlTab, AtlTab, 0},//Search
{0, 1333, 0, KEY_RIGHT_ARROW, KEY_TAB},//UP
{0, 111, 2111, AltEsc, 0},//Media
{0, 222, 2222, KEY_ESC, KEY_ESC},//Radio
{0, 1444, 2444, KEY_RETURN, KEY_END_TAB} //PLAY
};
void setup() {
Serial.begin(9600);
Keyboard.begin();
//Serial.println("Starting...");
ArrayOfAltTab=0;
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(13, INPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(7, OUTPUT);
for(int i=0;i<3;i++) //цикл для перехода по всем строкам
{digitalWrite(rows[i],HIGH);
if(digitalRead(cols[scrollWire])==HIGH) {scroll=i;}} //подаем на текущую строку высокий уровень }
}
void loop() {
for(int i=0;i<3;i++){ //цикл для перехода по всем строкам
digitalWrite(rows[i], HIGH); //подаем на текущую строку высокий уровень
for(int j=0;j<3;j++){ //цикл для переходов по всем столбцам
if(digitalRead(cols[j])==HIGH && (j!=scrollWire || i!=scroll)){ //если уровень высокий, то кнопка нажата
int a=FindKey(i,j);
if(j==scrollWire){scroll=i;}
}
}
digitalWrite(rows[i], LOW); //выключаем высокий уровень для пройденной строки
}
}
//функция возвращающая код нажатой кнопки
int FindKey(unsigned int CodeI,unsigned int CodeJ)
{unsigned long TimeKeyPressed;
unsigned long TimeKeyReliased;
if(test==1){Serial.println("!");}
if(CodeJ==scrollWire)
{
if(scroll==2 && CodeI==0 || scroll==0 && CodeI==1 || scroll==1 && CodeI==2)
{
SendKey(Buttons[1][0],CodeJ,100); return Buttons[1][0];
}
else if(scroll==0 && CodeI==2 || scroll==1 && CodeI==0 || scroll==2 && CodeI==1)
{
SendKey(Buttons[0][0],CodeJ,100); return Buttons[0][0];
}
}
else
{ boolean i;TimeKeyPressed=millis();
int button=Buttons[CodeI][CodeJ];
i=digitalRead(cols[CodeJ]);
for(i;i>0;i=digitalRead(cols[CodeJ])){delay(45);
if(test==1){Serial.println(millis()-TimeKeyPressed);}
//if(button==PauseButton && (millis()-TimeKeyPressed)>10000){break;}
if(button!=PauseButton && (millis()-TimeKeyPressed)>LooongPressTime+100){break;}}
TimeKeyReliased = millis();
SendKey(button,CodeJ,TimeKeyReliased-TimeKeyPressed);
return button;
}
}
void SendKey(int Key, unsigned int CodeJ,unsigned long Time)
{int value=0;
int LongPressArray=0; //Serial.print(Key);
if(Time<LongPressTime){LongPressArray=0;}
else if(Time>LongPressTime && Time<LooongPressTime){LongPressArray=1;}
else if(Time>LooongPressTime && Time<100000){LongPressArray=2;}
//else if(Time>10000){Serial.println("pause_loop forever."); delay(100000);}
value=idButtons[Key][LongPressArray];
//Serial.print(value);
//Serial.print(LongPressArray);
//Serial.print(ArrayOfAltTab);
if (value>0 && ArrayOfAltTab==0){
if(value==666){Keyboard.write(198);}
else{ Serial.print("<click:");
Serial.print(value);
Serial.print(">");}}
//Serial.println();}
else if (value<=0 || ArrayOfAltTab==1) {
value=idButtons[Key][3+ArrayOfAltTab];
//Serial.println(value);
if(value==AtlTab)
{
ArrayOfAltTab=1;
if(test==0){Keyboard.press(KEY_LEFT_ALT);Keyboard.press(KEY_TAB);Keyboard.release(KEY_TAB);}
//Serial.println("ATBeg");
}
else if(value==KEY_TAB)
{
if(test==0){Keyboard.press(value);Keyboard.release(value);}
//Serial.println(value);
//Serial.println("ATNext");
}
else if(value==KEY_LEFT_SHIFT)
{
if(test==0){Keyboard.press(KEY_LEFT_SHIFT);Keyboard.press(KEY_TAB);Keyboard.release(KEY_LEFT_SHIFT);Keyboard.release(KEY_TAB);}
//Serial.print("ATPrev");
}
else if(value==KEY_END_TAB)
{
if(test==0){
//Keyboard.press(KEY_RETURN);Keyboard.release(KEY_RETURN);
Keyboard.release(KEY_LEFT_ALT);}
ArrayOfAltTab=0;
//Serial.println("ATend");
}
else if(value==KEY_ESC && ArrayOfAltTab==1)
{
if(test==0){
Keyboard.press(KEY_ESC);Keyboard.release(KEY_ESC);
Keyboard.release(KEY_LEFT_ALT);}
ArrayOfAltTab=0;
//Serial.println("ATend");
}
else if(value==AltEsc)
{
if(test==0){Keyboard.press(KEY_LEFT_ALT);Keyboard.press(KEY_ESC);Keyboard.release(KEY_LEFT_ALT);Keyboard.release(KEY_ESC);}
//Serial.println(value);
//Serial.println("ATNext");
}
else
{
if(test==0){Keyboard.press(value);Keyboard.release(value);}
//Serial.println("s");
//Serial.println(value);
}
}
if(CodeJ!=scrollWire){
delay(150);
boolean i;
i=digitalRead(cols[CodeJ]);
for(i;i>0;i=digitalRead(cols[CodeJ])){
if(test==1){Serial.println(digitalRead(cols[CodeJ]));}
}
}
}
Последний раз редактировалось d3890666; 15.03.2014 в 02:49.
|