Показать сообщение отдельно
Старый 14.03.2014, 19:11   #8
d3890666
Пользователь
 
Регистрация: 22.01.2013
Город: Москва
Регион: 77, 97, 99, 177
Машина: Renault Duster
Сообщений: 38
d3890666 is on a distinguished road
По умолчанию

Закончил с переделкой кнопок с ардуино. Подключал уже не через резисторы, а все 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]));}
         }
        }
       }
__________________
Nexus 7+Duster

Последний раз редактировалось d3890666; 15.03.2014 в 02:49.
d3890666 вне форума   Ответить с цитированием