убийца титанового велосипеда для тактовой кнопки.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018
 
тут один профи решил поразить меня в печень. #30
...обещал поразить бесплатно, но теперь требует денег.
цитирую, чисто напоржать и поучиться у профессионала, как нужно побеждать в дискуссиях с непрофессионалами... за бабло. О_О
 
*прошу модераторов прибить тему.
пусть народ пользуется убивцем велосипеда от профессионала.
шо? деньги?
отож.
 
Клапауций 555
Offline
Зарегистрирован: 10.03.2018

>некто Logik#30

Ничего подобного, я профи, пишу код за деньги. И если кому надо коду от меня - так не за так. И об этом изначально я те писал, влом только искать. Но учитывая чтот ты настырно клянчиш уже который месяц и беря во внимание, что недавно был день дурака, а заслуженого подарка на форуме ты так и нифига не получил, то дарю. Но не все ;) Интересные методы классов я позатираю, поля данных оставлю для подсчета. Так до поступления финансов на счет.

#ifndef cbi
#define cbi(sfr, bit) (sfr &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif 

enum KBD_EVENT
{
  // физические события изменения состояния кнопок
    KBD_EVENT_DONE,
    KBD_EVENT_UP,
  //логические события  
    KBD_EVENT_LONG,
    KBD_EVENT_SHORT,
    KBD_EVENT_DBL,
    KBD_EVENT_PRESS,
    
    KBD_EVENT_TIME,

};

void setup(void)
{
  Serial.begin(9600);
  PORTC=0x1f;
  DDRC=0x1f;
  PORTD=0xfc;
  PORTB=0x03;
}

#define MAX_STROBE  5

#define KEY_TIME_MAX 4  //столько кнопок одновременно можно нажать 

//Сканирование матрицы, поиск нажатий и отправка их в SelectPress. Генерация  KBD_EVENT_TIME
class PhisicalKBD 
{
 
  virtual void SetStrob(byte n, byte s)=0;
  virtual byte GetReturn(void)=0;
  
  //Ищем изменения в состоянии матрицы и уведомляем о них уровень выше
  //Про завершение сканирования уведомляем сообщением KBD_EVENT_TIME
  void Select(void)
  {
   byte r;
   byte rez;
   byte a;

   rez=0;
   for(byte i=0;i<MAX_STROBE;i++)
   {
    a=KbdScrean[i];
    r=KbdOldScrean[i] ^ a;
    KbdOldScrean[i]=a;

    SelectPress(i, r, a);
   }
   SelectLongPress(KBD_EVENT_TIME, 0);
 }
 
 protected:
   byte Strob;
   byte OldTime;
   byte KbdScrean[MAX_STROBE];
   byte KbdOldScrean[MAX_STROBE];

   //сюда класс отправит все состояния возвратов для каждого строба
   //i-строб
   //r-маска кнопок изменивших состояние
   //ф-маска текущих состояний кнопок
   virtual  void SelectPress(byte i, byte r, byte a) {};
   //выделяем короткие и длинные нажатия, обработка комбинаций
   virtual void SelectLongPress(byte evnt, byte Key, byte FlCombi = false) =0;
  
 public:
   PhisicalKBD()
   {
    Strob=0xff;
   }
   
  //Выполняем очередную фазу сканирования и опроса кнопок
  //Если цикл сканирования завершился - анализируем кнопки в Select()
  void Scaning(void)
  {
    if(Strob==0xff)
    {
     for(byte i=0;i<MAX_STROBE;i++) 
     {
       SetStrob(i, HIGH); 
     }
     Strob=0;
    }
    else
      KbdScrean[Strob]=~GetReturn();  //храним с инверсией для удобства при старте
    
    SetStrob(Strob, HIGH); 
    Strob++;
    if(Strob>MAX_STROBE)
    {
     Strob=0;
     Select(); 
    }
    SetStrob(Strob, LOW); 
  }

// Процесс формирования временных интервалов сканирования и опроса кнопок
// Достаточно часто вызываем из loop.  
  byte Process(byte t)
  {
    if(byte(t-OldTime)<20)
      return 0;
    
    OldTime=t;
    Scaning();
  }
};

//Класс формирования физических сообщений - KBD_EVENT_DONE и KBD_EVENT_UP
class BaseKBD : public PhisicalKBD
{
  куку! ;)
};


class LongPressKBD : public BaseKBD
{
  struct  KyeTime
  {
    byte Key;
    byte Time;
  };

  KyeTime KT[KEY_TIME_MAX]; //храним нажатия кнопок
   //по содержимому KT выявляем код комбинации, если его нет возвращаем 0

 куку! ;)

protected:
  byte TimeKbd; //счетчик тактов сканирования кнопок
};

class DblPressKBD : public LongPressKBD
{
  byte Key_SH;
  byte Key_SH_Time;  

 куку! ;)
};

#define DBG
#ifdef DBG 
byte Tic;
byte Key=0xff;
byte Key1=0xff;
#endif


class KBD : public DblPressKBD
//class KBD : public BaseKBD
{
 public:
 // KBD(byte s) : PhisicalKBD(s)  {  };
  KBD(byte s) : DblPressKBD(s)  {  };
  
 private:
 // работаем напрямую с портом
  void SetStrob(byte n, byte s)  
{
#ifdef DBG  
  if((n==3) && (s==LOW))
  {
  Key1=Key;
  }
  else 
    Key1=0xff;
#else  
  s?sbi(PORTC,n):cbi(PORTC,n);         
#endif
  } 
  byte GetReturn(void)           
  {
#ifdef DBG  
    byte r=Key1;Key1=0; return r; 
#else     
  return (PIND & 0xfc) | (PINB & 0x3); 
#endif
  }
  
  byte SelectCombiKey(void){ return 0;}
  void KeyEvent(byte evnt, byte key)
  {
#ifdef DBG 
    if(evnt==KBD_EVENT_TIME)
      Tic++;
    if(!(Tic&63))  
    {
    Serial.println("Tic!!");
      Key=0xf9; 
      Tic++;
    }
    if((Tic&63)==3)
     Key=0xf8;
    if((Tic&63)==7)
     Key=0xf9;
    if((Tic&63)==9)
     Key=0xfd;
     
    if((Tic&63)==12)
     Key=0xff;
    
    if(evnt==KBD_EVENT_TIME)
     return;
     
 #endif
     
    Serial.print("Event=");
    Serial.print(evnt);
    Serial.print(" Key=");
    Serial.println(key, HEX);
  };
};

KBD kbd(MAX_STROBE);

void loop(void)
{
  static byte OldTime;
 // static byte KbdScrean[MAX_STROBE];
  byte Time;  
  
  Time=millis();
  
  switch(kbd.Process(Time))
  {
    case KBD_EVENT_DONE: break;
    case KBD_EVENT_UP: break;
    case KBD_EVENT_LONG: break;
    case KBD_EVENT_SHORT: break;
    case KBD_EVENT_DBL: break;
  }
}

Ну и вывод при полном наличии иерархии классов 

Event=0 Key=19
Event=0 Key=1A
Event=0 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=1 Key=19
Event=3 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=1A
Event=5 Key=1B
Event=1 Key=1B
Event=2 Key=1B
Event=5 Key=1A
Event=5 Key=1A
Event=5 Key=1A
Event=1 Key=1A
Event=2 Key=1A
Tic!!
Event=0 Key=1A
Event=0 Key=1B
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=1A
Event=5 Key=1B
Event=0 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=1 Key=19
Event=3 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=1A
Event=5 Key=1B
Event=1 Key=1B
Event=2 Key=1B
Event=5 Key=1A
Event=5 Key=1A
Event=5 Key=1A
Event=1 Key=1A
Event=2 Key=1A
Tic!!

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Этта шо?  О_О

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

DetSimen пишет:

Этта шо?  О_О

шо-шо - пока не заплатишь Логику, не узнаешь. но, мне уже заочно стыдно. о_О

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нууу... я думаю, у профессионалов Phisical   несколько по-другому пишеца. :) 

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

DetSimen пишет:

нууу... я думаю, у профессионалов Phisical   несколько по-другому пишеца. :) 

Fizicheskiye ? L_o

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

ну, не знаю...

чел не моргнув глазом хранит время в байтах

считает, что можно ограничиться обработкой четырёх кнопок

но, самое феерическое, что кнопок обрабатывается, допустим, четыре, а событий с этих кнопок может прийти одновременно... ОДНО.

235   switch(kbd.Process(Time))
236   {
237     case KBD_EVENT_DONE: break;
238     case KBD_EVENT_UP: break;
239     case KBD_EVENT_LONG: break;
240     case KBD_EVENT_SHORT: break;
241     case KBD_EVENT_DBL: break;
242   }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

нууу... я думаю, у профессионалов Phisical   несколько по-другому пишеца. :) 

Да у него, по-моему, и Viev за норму считается.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

sadman41 пишет:

DetSimen пишет:

нууу... я думаю, у профессионалов Phisical   несколько по-другому пишеца. :) 

Да у него, по-моему, и Viev за норму считается.

к какой-то фигне придираетесь.

DetSimen, тоже не DedSemen...

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак мы же не высоквалифицированные программисты за деньги, чего нам еще обсуждать-то?  Хоть так приобщимся...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Клапауций 555 пишет:

чел не моргнув глазом хранит время в байтах

Не особо разбирался в коде, но если интервалы длиннее 255 не интересуют, то хранить в байтах наиболее разумно (насчёт "моргать" - не знаю). Нафига тратить больше, если нет разницы?

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

ЕвгенийП пишет:

Не особо разбирался в коде, но если интервалы длиннее 255 не интересуют, то хранить в байтах наиболее разумно (насчёт "моргать" - не знаю). Нафига тратить больше, если нет разницы?

если чисто считать время отклика кнопки(ака-антидребезг), то не интересуют, но - нет:

010   // физические события изменения состояния кнопок
011     KBD_EVENT_DONE,
012     KBD_EVENT_UP,
013   //логические события 
014     KBD_EVENT_LONG,
015     KBD_EVENT_SHORT,
016     KBD_EVENT_DBL,
017     KBD_EVENT_PRESS,

да-да - вся фигня у нас случается в диапазоне 0-255 миллисекунд.

но самая веселуха начинается, когда заюзаешь диапазон значений 255-время_лупа <-> 255. О_о

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Logik пишет:

У Вас оригинальный способ определения профессионалов. Стоматолога тоже так выбирали? Только хирурга так не выбирайте, а то семе прийдется мастера по надгробям выбирать. Вот там точно орфография важна будет.

ты не на личности переходи, а ответь - сколько кнопок у тебя можно одновременно нажать?

четыре?

#define KEY_TIME_MAX 4  //столько кнопок одновременно можно нажать

или одну?

237     case KBD_EVENT_DONE: break;
238     case KBD_EVENT_UP: break;
239     case KBD_EVENT_LONG: break;
240     case KBD_EVENT_SHORT: break;
241     case KBD_EVENT_DBL: break;

 

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 555 пишет:

ну, не знаю...

чел не моргнув глазом хранит время в байтах

считает, что можно ограничиться обработкой четырёх кнопок

но, самое феерическое, что кнопок обрабатывается, допустим, четыре, а событий с этих кнопок может прийти одновременно... ОДНО.

Не совсем одно, их там много будет учитывая KBD_EVENT_DONE. Но конкретно при одновременном нажатии четырех кнопокм спецом прийдет с кодом  соответствующим именно такой комбинации. Очень удобно. Получается комбинации обрабатываются как обычное нажатие и на уровне loop их можна и не различать вобще если хочется.

Клапауций 555 пишет:

но самая веселуха начинается, когда заюзаешь диапазон значений 255-время_лупа <-> 255. О_о

А причем тут 0-255 миллисекунд? На одном байте  интервал хоть в мильенлет отмеряется. Только с точность вопрос, если 40тыс. лет устраивает то можна.  В данном коде до 2,55сек меряю. Для лонгклика нужно. Точность 0,1сек при работе с кнопками достаточно.

Клапауций 555, вместо того чтоб дальше сотрясать форум своим уровнем непонимания, определись с простым вопросом. Код покупаеш или нет? Если нет - хоре клянчить, я не подаю. Если да - поговорим как культурные люди ;)

Думаю всем понятно что бесплатным бывает не только сыр, но и велосипеды. С соответствующими последствиями типа

Клапауций 112 пишет:

ну, не знаю - на данный момент у меня на матрицу 10х10=100 кнопок расходуется 840 байт RAM.

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Честно говоря, так же не вижу ничего плохого в "кривых" названиях переменных и объектов. Видел много "профи" кода, там и не такое встречается. А про правила хорошего тона при написании кода, говорить так же не правильно, то что для кого то хорошо, другому - плохо. 

Другой вопрос, нужны ли такие пляски с классами для элементарного опроса клавиатуры... Но это дело вкуса.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

brokly пишет:

Другой вопрос, нужны ли такие пляски с классами для элементарного опроса клавиатуры... Но это дело вкуса.

Тссс, на святое покушаешься :) Тело, помнится, уходило в истерику и несознанку, когда речь шла о классах, а оно вон оно чо, оказывается: там не только нахер не нужная иерархия (видимо, паттерны программирования тело не особо знает), так ещё и раздутая VMT. Типичный подход "горе от ума": предпосылки мне ясны - хотелось сделать как удобнее, но - получилось как всегда, мухи с котлетами перемешались, сразу видно "я освоил наследование, куда бы его впихнуть?". Там всё великолепно решается гораздо проще, но - пример кода приведу только за деньги :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIYMan пишет:

пример кода приведу только за деньги :)

"Экий ты меркантильный Маргадон, о душе бы подумал!"

Logik
Offline
Зарегистрирован: 05.08.2014

brokly пишет:

Честно говоря, так же не вижу ничего плохого в "кривых" названиях переменных и объектов. Видел много "профи" кода, там и не такое встречается. А про правила хорошего тона при написании кода, говорить так же не правильно, то что для кого то хорошо, другому - плохо. 

Другой вопрос, нужны ли такие пляски с классами для элементарного опроса клавиатуры... Но это дело вкуса.

Почему классы? Отвечаю. Из задачи следует. В ней явно видны уровни обработки. Я начал было сразу в лоб без ООП, но передумал. На самом нижнем уровне сканируем кнопки и просто выявляем изменения состояния. Далее по результатам сканирования формируются сообытия о изменении статуса кнопок, на этом уровне уже ничего не известно о сканировании. На следующем - по данным о времени изменения статус - формируются события долгого и короткого нажатия. В следующем - даблклик. Далее  - одновременное нажатие. В принципе возможно и разветвление наследования. Но пока не нужно.  Эта иерархия наследования отлично выносится в либу. А в софте пользоователя - только класс KBD в котором реализованы методы сканирования, и приема результатов. Теперь вопрос - от кого его наследовать? А от любого члена иерархии! При этом функционал (и размер кода и данных разумеется) зависит от того, от кого унаследовались. Т.е. не нужен даблклик - наследуемся от класса до него. Все просто. Ну и кроме того в данном случае ООП оправдано и значительным числом чиртуальных методов. А они позволяют легко вынести с базового класса работу с пинами. Она специфична для проекта, сканы и возвраты могут быть разбросаны по портам и даже висеть на расширениях или других устройствах.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Logik пишет:

Т.е. не нужен даблклик - наследуемся от класса до него. Все просто. 

Надеюсь, понимающим ясно, в каком месте огромный архитектурный косяк и костыль вида "сбоку бантик"?

Logik пишет:

Ну и кроме того в данном случае ООП оправдано и значительным числом чиртуальных методов. 

Которые там нахер не нужны.

Logik пишет:

А они позволяют легко вынести с базового класса работу с пинами. 

А для этого не нужен базовый класс. Для этого есть другие, более правильные архитектурные решения. Могу привести пример кода, 10000 рублей и он твой.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Чем отличется профессионал от любителя? Профессионал продает код за деньги, а любитель пишет на интерес. Но в обоих случаях код может быть отстойным и не рабочим.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Logik пишет:

Даффай еще! Больше злобы, зубы шире скаль! За ногу, за ногу кусай!

ПС. По существу вопросы будут?

К тебе? По существу? Если бы ты был способен адекватно воспринимать критику - были бы. А так - смысла не вижу, ты ж у нас раззвездатый физдабол, как известно, какие к такому телу могут быть вопросы по существу? Тебя вон как ни макай - оно тебе всё время родное, похоже, тебе это удовольствие доставляет, что ли, раз ты уже своё вонючее начал сюда выкладывать?

По существу я, кстати, написал: сплошной архитектурный косяк и непонимание того, что делаешь - первый признак недоучки с ЧСВ. Такая иерархия, как приведена - это идиотизм и костыль, паттерны программирования тебе неизвестны - так, освоил классы, вроде бы (ключевое тут - вроде бы). Кучу виртуальных методов для решения такой тривиальной задачи - минус премия сразу, идиотов надо наказывать.

Как сделать правильно - я тебе предложил: 10000 рублей и так и быть, я продемонстрирую архитектурный костяк без твоих идиотизмов. Но ты мало того, что трепло и неграмотный, так ещё и жлоб, впрочем, это ясно, по-моему, не только мне.

Продолжай дальше упиваться своей исключительностью здесь, раз в коллективе чмырят.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Logik пишет:

Не совсем одно, их там много будет учитывая KBD_EVENT_DONE. Но конкретно при одновременном нажатии четырех кнопокм спецом прийдет с кодом  соответствующим именно такой комбинации. Очень удобно. Получается комбинации обрабатываются как обычное нажатие и на уровне loop их можна и не различать вобще если хочется.

т.е. у тебя одновременно обрабатывается не ОДНА кнопка, а ОДНО действие со всеми кнопками? О_О

а, когда у тебя одновременно нажата, допустим, одна кнопка и отпущены три - отжатие этих трёх ты тупо скипаешь? алё! гараж! у вас три автомобиля уехало в неизвестном направлении, пока вы принимали один! О_О

Logik пишет:

А причем тут 0-255 миллисекунд? На одном байте  интервал хоть в мильенлет отмеряется. Только с точность вопрос, если 40тыс. лет устраивает то можна.  В данном коде до 2,55сек меряю. Для лонгклика нужно. Точность 0,1сек при работе с кнопками достаточно.

а, при том, что время отклика кнопки у тебя болтается в диапазоне 0-0,1 сек вместо ожидаемого и настроеного пользователем 0,1+время_луп

хотя, ты мне ранее аргументированно доказал, что тормоза, тебя окружающие не различают время 0 и 0,1 секунды. лично я отличаю время реакции 0,05 и 0,1. для кодовой однопальцевевой клавиатуры подойдёт 0,1. для набора текста - отклик 0,1 будет выбешивать, а если этот параметр случаен в диапазоне 0-0,1, то возникнет желание найти пейсателя сего и заплатить ему по полной программе.

Logik пишет:

В данном коде до 2,55сек меряю.

у тебя сколько этих кодов? давай код, где меряется 4,294,967,295 миллисекунд, одновременно обрабатываются ВСЕ кнопки - допустим 100. не скипаются разные, но одновременные события. О_О

Logik пишет:

Код покупаеш или нет?

ты желаешь, что бы я попросил админа забанить тебя за торговлю в несоответсвующей ветке форума?

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

тема чистится от личных разборок.

да-да, у меня есть кнопка "сбросить в пропасть без разговоров". О_О

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Ворота пишет:

А чё, твой срач с логиком - не личная разборка?

нет. это - спор о качестве кода класс титановый велосипед для тактовой кнопки.

Логик, недоволен расходом оперативки - я с ним согласен.
оперативки расходуется 9 байт на один экземпляр класса обработчика одной кнопки.
это цена за диапазон временных параметров кнопки совпадающий с диапазоном значений миллис.
 
Логик грозился доказать, что можно сделать экономней...
и, чито мы имеем на данный момент? 
 
время unsigned long он запихал в byte, параметра "время события кнопки" не существут как такового - вместо него "общее время опроса всех кнопок", количество обработчиков сократил до 4-х, одновременно обрабатывает один тип событий.
 
дык,.. и я там могу так сделать в класс титановый велосипед для тактовой кнопки.
 
но, не делаю - догадайся, почему.
Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 555 пишет:

Logik пишет:

Не совсем одно, их там много будет учитывая KBD_EVENT_DONE. Но конкретно при одновременном нажатии четырех кнопокм спецом прийдет с кодом  соответствующим именно такой комбинации. Очень удобно. Получается комбинации обрабатываются как обычное нажатие и на уровне loop их можна и не различать вобще если хочется.

т.е. у тебя одновременно обрабатывается не ОДНА кнопка, а ОДНО действие со всеми кнопками? О_О

а, когда у тебя одновременно нажата, допустим, одна кнопка и отпущены три - отжатие этих трёх ты тупо скипаешь?

Ты бы код сразу почитал щоле прежде чем фантазировать. Реакция на отжатие зависит от того отжимается кнопка из числа описаных как комбинация или нет. Если кнопки из комбинации то физические эвенты для каждой, а логические для комбинации в твоем примере одно на три. Если кнопки не являются комбинацией - то на каждую и физические и логические. Ты в то что под спойлером не заглядываеш, ладно перетяну. Три кнопки с кодами 19, 1A, 1B, нажаты одновременно, отпущены по очереди все события на местах. Причем первая попала в короткий клик а две другие - длинный.

Event=0 Key=19
Event=0 Key=1A
Event=0 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=1 Key=19
Event=3 Key=19
Event=5 Key=1A
Event=5 Key=1B
Event=5 Key=1A
Event=5 Key=1B
Event=1 Key=1B
Event=2 Key=1B
Event=5 Key=1A
Event=5 Key=1A
Event=5 Key=1A
Event=1 Key=1A
Event=2 Key=1A

Клапауций 555 пишет:

Logik пишет:

А причем тут 0-255 миллисекунд? На одном байте  интервал хоть в мильенлет отмеряется. Только с точность вопрос, если 40тыс. лет устраивает то можна.  В данном коде до 2,55сек меряю. Для лонгклика нужно. Точность 0,1сек при работе с кнопками достаточно.

а, при том, что время отклика кнопки у тебя болтается в диапазоне 0-0,1 сек вместо ожидаемого и настроеного пользователем 0,1+время_луп

хотя, ты мне ранее аргументированно доказал, что тормоза, тебя окружающие не различают время 0 и 0,1 секунды. лично я отличаю время реакции 0,05 и 0,1.

К сожалению это голословное утверждение не подтверждено хоть чем либо. Цифра 0,1 сек придумана не мной. Ты там в старте на тему сослался. В ней тоже люди опрашивают кнопку 0,1сек. Это общепринято. Возможно для ряда специальных приложений и/или товарищей будет не достаточно - так пофиг меняется константа и всех делов. Я так понял если с тобой договоримся, я те вышлю софт с периодом опроса 0,05 ;)

Клапауций 555 пишет:

Logik пишет:

В данном коде до 2,55сек меряю.

у тебя сколько этих кодов? давай код, где....

Хотелку обламай. Кода у меня оч много ))) Работа такая. Только вот давать его каждому резону нету. Может те еще ключи от транспортных карт дать вместе с алгоритмом диверсификации )))

Клапауций 555 пишет:

Logik пишет:

Код покупаеш или нет?

ты желаешь, что бы я попросил админа забанить тебя за торговлю в несоответсвующей ветке форума?

нет, я желаю получит от тебя ответ в стиле да или нет. И закроем эту тему. Чтоб ты перестал требовать код.  Я ж отлично знаю, что ты нифига не купиш ))) Так хоть спасибо скажи за подарок. К следующему дню дурака может еще коду открою.

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 555 пишет:

время unsigned long он запихал в byte, параметра "время события кнопки" не существут как такового - вместо него "общее время опроса всех кнопок",

Не. Не так. Время события в байте и хранится , смотри стр. 129-135. Для до 5-и  кнопок. (Даффай не затевать дурной базар в пользу бедных на тему а если 10 сразу нажато. Этого не требуется. Будет требоватся констан KEY_TIME_MAX  запишется 10, но не требуется вобще нигде).

Клапауций 555 пишет:

 количество обработчиков сократил до 4-х, одновременно обрабатывает один тип событий.

Каких нах 4-х обработчиков. Ты вобще код смотрел прежде чем делать выводы? Он один! Но с параметром типа сообщения и кода кнопки. И за один вызов передает один тип события, просто этих вызовов столько, сколько событий возникло. Они друг за дружкой генерятся и обрабатываются.

GarryC
Offline
Зарегистрирован: 08.08.2016

Не вникая в суть рассматриваемых алгоритмов и задержек (лично меня удивило заявление "В ней тоже люди опрашивают кнопку 0,1сек. Это общепринято.", особенно его последняя часть, ну да ладно), должен отметить, что Вы не очень хорошо понимаете, зачем и как именно следует применять enum, чем отличаются виртуальные функции от переопределяемых, ну и еще ряд мелких замечаний, что недопустимо для профессионала, как Вы себя позиционируете

Logik
Offline
Зарегистрирован: 05.08.2014

Так разясни. Иначе это пустотреп просто.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Logik пишет:

Ты бы код сразу почитал щоле прежде чем фантазировать. 

какой код? где код? - нет кода. ¯\_(ツ)_/¯

Logik пишет:

нет, я желаю получит от тебя ответ в стиле да или нет. И закроем эту тему. 

нууу... если ты мне заплатишь - я закрою эту тему.

а, пока к класс титановый велосипед для тактовой кнопки. у тебя не может быть претензий.

ты выстрелил себе в ногу - я никогда тебе не заплачу, что бы ты доказал свою правоту.

GarryC
Offline
Зарегистрирован: 08.08.2016

По поводу первого моего замечания.
Вообще то профессионал должен понимать, что основное назначение enum - это не создание алиасов для констант (с чем чудесно справляются define), а попытка обеспечить строгую (ну насколько об этом можно говорить применительно к С) типизацию для языка, в котором она сознательно нарушена. Поэтому попытка смешивать в одном перечислении "физические события" и "логические события" не может быть отнесена к лучшим сторонам архитектуры программы, а использование присваивания целым переменным констант из перечисления вообще находится по ту сторону границы между добром и злом.

По поводу второго замечания - есть множество великолепной литературы, посвященной использованию С++ для микроконтроллеров (в большинстве своем она англоязычная, но это не может служить серьезным препятствием для профессионала), и это одно из основных правил - если Вы не собираетесь использовать особенности виртуальных функций (в любой книге по собственно С++ они обязательно указаны), то не следует методы делать виртуальными, поскольку это создает "overhead".

Надеюсь, разъяснил понятно? Боюсь, в противоположном случае ничем помочь не смогу, поскольку подразумеваю определенный интеллектуальный и профессиональный уровень у своего визави. Правда, Ваше "тыканье" вызывает определенные сомнения в том, что Вы отвечаете предъявленным критериям.

GarryC
Offline
Зарегистрирован: 08.08.2016

Но в то же время, Кларауций, не могу не отметить, что Ваш код требует определенного рефакторинга в плане разделения уровней обработки - но это на мой взгляд, ведь я могу и ошибаться.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Logik пишет:

Ты вобще код смотрел прежде чем делать выводы?

я же не профессионал, написал, как понял - публикуй код с подробными комментариями, пиши сопроводительную документацию... тогда и поговорим о 100 одновременно нажатых кнопках, кому это не нужно, почему ты-тормоз, не различающий 50 и 100 миллисекунд.

алё! гараж! - это не клавиатура - это 100 кнопок, которые не только человек может нажимать или не один человек, а 100.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

GarryC пишет:

Но в то же время, Кларауций, не могу не отметить, что Ваш код требует определенного рефакторинга в плане разделения уровней обработки - но это на мой взгляд, ведь я могу и ошибаться.

ну, и кто запретил публиковать комментарии в теме велосипеда с примерами оптимизации?

я не против конструктивных предложений.

а, пока - цирк с Логиком: я не плачу за то, что бы Логик доказал свою правоту. О_О

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

GarryC пишет:

По поводу первого моего замечания.
Вообще то профессионал должен понимать, что основное назначение enum - это не создание алиасов для констант (с чем чудесно справляются define), а попытка обеспечить строгую (ну насколько об этом можно говорить применительно к С) типизацию для языка, в котором она сознательно нарушена. Поэтому попытка смешивать в одном перечислении "физические события" и "логические события" не может быть отнесена к лучшим сторонам архитектуры программы, а использование присваивания целым переменным констант из перечисления вообще находится по ту сторону границы между добром и злом.

По поводу второго замечания - есть множество великолепной литературы, посвященной использованию С++ для микроконтроллеров (в большинстве своем она англоязычная, но это не может служить серьезным препятствием для профессионала), и это одно из основных правил - если Вы не собираетесь использовать особенности виртуальных функций (в любой книге по собственно С++ они обязательно указаны), то не следует методы делать виртуальными, поскольку это создает "overhead".

Надеюсь, разъяснил понятно? 

Я был более краток :) Но суть передана верно - т-щ прохфесианал у нас просто плавает в теме, ещё и кичится этим.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

GarryC пишет:

Но в то же время, Кларауций, не могу не отметить, что Ваш код требует определенного рефакторинга в плане разделения уровней обработки - но это на мой взгляд, ведь я могу и ошибаться.

GarryC, не сочти за труд - сходи в класс титановый велосипед для тактовой кнопки. и набросай на примере и в коде велосипеда, где у меня там уровни обработки и зачем их разделять.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Жесть...

Я теперь вообще боюсь что либо писать в этом форуме... А то закидают тухлыми яйцами на тему непроффесианализма... Как начнут мордой по кочкам ООП возить приговаривая типа : "А кто это сделал, А ?"

Пойду валерианки выпью.... :(

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Ворота пишет:

Не понял, в чём проблема-то? Я что не по теме пишу? Или просто "дураку дали кнопку"?

иди - пожалуйся админу за удаление постов про жопу и просто ниочём.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

brokly пишет:

Жесть...

Я теперь вообще боюсь что либо писать в этом форуме... А то закидают тухлыми яйцами на тему непроффесианализма... Как начнут мордой по кочкам ООП возить приговаривая типа : "А кто это сделал, А ?"

Пойду валерианки выпью.... :(

Нет, ну строго говоря, замечания GarryC очень даже обоснованы, я писал о том же ровно, только другим языком. Просто всем известный т-щ плевался, исходил на г., помнится - то ему классы не нра, то трава недостаточно зелёная. А тут оказалось, что он просто не смог в архитектуру и ООП, да и критику неспособен воспринимать в принципе.

Что касается кода Клапы - это как раз случай со всем известным инструментом - молоток. Да, везде есть изъяны, всегда можно найти, что улучшить, но зачем покрывать позолотой ручку, если молоток и так забивает гвозди - вот в чём вопрос? А Логика же ж уссыкалась о том, какой плохой код, да как она возьмёт, вытащит изо рта да напишет кой-чего получше. А на деле оказалось - пшик.

Что касается ООП, то если уж там его и юзать, то от той кучи виртуальных методов и проходного наследования можно смело отказаться в пользу паттернов, того же "состояния", "стратегии", "фасад". Тогда не будет дичи "надо даблклик - наследуемся от этого класса, не надо даблклик - наследуемся от другого". К тому же вводные задачи сами по себе подразумевают наличие HAL, и не так, как это попыталась нацарапать Логика. 

Т.е., с архитектурной точки зрения, совершенно прозрачно напрашиваются следующие сущности:

1. HAL

2. Состояние

3. Стратегия.

Стратегий может быть овердохрена, и применять их можно к состоянию в бесконечном кол-ве вариантов, на примере тупого псевдокода в лоб "нужен/не нужен даблклик":

// кнопки на пинах
Button btn1(1);
Button btn2(2);

// описываем состояние пинов
PinHAL hal(ATMEGA328, [&btn1,&btn2]);

// паттерн "Состояние"
State state(&hal);

// стратегии
ClickStrategy click;
DoubleClickStrategy dblclick;

void loop()
{
	// обновляем состояние
	state.handle();
	
	// применяем стратегии
	if(click.execute(&btn1))
	{
		// кнопка 1 кликнута
	}
	
	if(dblclick.execute(btn1))
	{
		// кнопка 1 даблкликнута
	}
}

Вот это - ООП, и то, прошу заметить - тупые непродуманные наброски без претензий. Но уже здесь прослеживается полное разделение способов хранения, получения и работы с данными. А те каракули, которые были нассаны выше одним телом - они от нарциссизма и упивания своей "исключительностью". Я же говорю - чморят в коллективе, видимо.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Незнаю. Помоему писать "универсальную клавиатуру" как то незачем, что ли... А уж если делать это для сообщества, то красивее использовать калбэки, все же событийную логику никто не отменял, уж если мы с объектами дружим, так пусть они и ведут себя как объекты. 

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

brokly пишет:

Незнаю. Помоему писать "универсальную клавиатуру" как то незачем, что ли... А уж если делать это для сообщества, то красивее использовать калбэки, все же событийную логику никто не отменял, уж если мы с объектами дружим, так пусть они и ведут себя как объекты. 

brokly, это не клавиатура - это просто кнопка, класс обработчика кнопки и класс-оболочка для администрирования 1+ кнопки.

калбеки я видел в одной из библиотек для кнопки - синтаксически не совсем красиво, много нужно ручками прописывать... а, так - набор готовых переменных.

по поводу того, что не нужно - я тоже думал, что короткие и длинные нажатия не нужны, оказалось, что - нужны.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

brokly пишет:

Пойду валерианки выпью.... :(

Лучше фирменного среццтва от DetSimen.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Клапауций, а можно вопрос... Почему у тебя в "титановой кнопке" задержки заданы не дефайнами, а константами? Это просто вопрос, без наездов и подколок. Правда интересно.

Клапауций 555 пишет:

по поводу того, что не нужно - я тоже думал, что короткие и длинные нажатия не нужны, оказалось, что - нужны.

Когда кнопок мало, нужны не только короткие и длинные клики, попы и пушы, но и даблклики , и удержания.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Клапауций 555 пишет:

 оказалось, что - нужны.

однозначно нужны, особенно если пинов мало и хочеться парой кнопкой целое меню с кучей действий делать.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

ЕвгенийП пишет:

brokly пишет:

Пойду валерианки выпью.... :(

Лучше фирменного среццтва от DetSimen.

Дык он не присылает, далеко видимо. У меня есть такое средство от тещи, но супруга жестко контролит неурочные возлияния :) Если так лечиться, то сопьешся нахрен... 

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

brokly пишет:

Клапауций, а можно вопрос... Почему у тебя в "титановой кнопке" задержки заданы не дефайнами, а константами? Это просто вопрос, без наездов и подколок. Правда интересно.

ну, смотри - сейчас актуальная версия 14-я. на какую из них смотришь ты сейчас - я не знаю.

были версии и с дефайнами и константами - тогда я в меру своего незнания пытался найти компромисс между расходом оперативки и возможностью юзать раздельные настройки для разных экземпляров класса.

дефайны не позволяют сделать раздельные настройки - сейчас настройки у меня хранятся в переменных оболочки класса и передаются обработчику кнопки пакетом.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Жесть...

Я теперь вообще боюсь что либо писать в этом форуме... А то закидают тухлыми яйцами на тему непроффесианализма... Как начнут мордой по кочкам ООП возить приговаривая типа : "А кто это сделал, А ?"

Пойду валерианки выпью.... :(

Сделай катушку Мишина, стрессы снимает без химикатов )))

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

brokly пишет:

Когда кнопок мало, нужны не только короткие и длинные клики, попы и пушы, но и даблклики , и удержания.

andycat пишет:

однозначно нужны, особенно если пинов мало и хочеться парой кнопкой целое меню с кучей действий делать.

всё есть - но, уговаривают ещё автоповтор прикрутить. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Клапауций 555 пишет:

ну, смотри - сейчас актуальная версия 14-я. на какую из них смотришь ты сейчас - я не знаю.

Я смотрел ту , которая в начале твоей темы. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

brokly пишет:

Пойду валерианки выпью.... :(

Лучше фирменного среццтва от DetSimen.

Моё, с кедровыми арешками, адназначна лучше валерянки. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Чесного С и кедровки всем срачующимся!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Клапауций 555 пишет:

тогда я в меру своего незнания пытался найти компромисс между расходом оперативки и возможностью юзать раздельные настройки для разных экземпляров класса.

дефайны не позволяют сделать раздельные настройки - сейчас настройки у меня хранятся в переменных оболочки класса и передаются обработчику кнопки пакетом.

Как вариант: отдельная структура настроек, передающаяся указателем в конструктор или метод: сколько разных настроек захотели, столько и структур, не надо будет держать в каждом классе настройки. Но тут надо смотреть по расходу памяти, т.к. указатель - тоже два байта, как ни крути.