PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   iCarDS (http://pccar.ru/forumdisplay.php?f=121)
-   -   iCarDS + Arduino = iCarDuino (http://pccar.ru/showthread.php?t=16718)

holywillie 01.11.2013 14:54

Андрей, подскажите как быть сжег JoyStick в который загрузил ваш код. все работало. купил не JoyStick а Arduino Nano7. нужно ли до загрузки кода что то еще проделать с Arduino? я имею ввиду порты, скорости назначение пинов. или без спецзнаний я это не сделаю? Или проще купить еще JoyStick?

все сделал. спасибо

Murkur 01.11.2013 15:38

Цитата:

Сообщение от holywillie (Сообщение 275727)
Андрей, подскажите как быть сжег JoyStick в который загрузил ваш код. все работало. купил не JoyStick а Arduino Nano7. нужно ли до загрузки кода что то еще проделать с Arduino? я имею ввиду порты, скорости назначение пинов. или без спецзнаний я это не сделаю? Или проще купить еще JoyStick?

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

holywillie 01.11.2013 19:28

[удалил все сделал. спасибо

Murkur 01.11.2013 19:44

Цитата:

Сообщение от holywillie (Сообщение 275758)
ну а как прописать 20 порт и скорость обмена? скетч я заливал но в кармониторовский джойстик в котором 20 порт уже был выбран

Первый пост перечитайте , там написано про порт и скорость обмена.

holywillie 01.11.2013 20:02

удалил все сделал. спасибо

Dj Aleks 02.11.2013 12:45

Цитата:

Сообщение от Dj Aleks (Сообщение 275671)
Подскажите плиз(((( сегодня поставил наконец то... только без разных датчиков, чисто резестивные кнопки... все сделал по инструкции... когда перешел на кнопку настройки клавиш... стал нажимать поочередно кнопки и назначать действия... заметил что те которые уже были тоже срабатывали... например нажимаю громкость больше мне срабатывала то что по умолчанию было например яркость выше и автоматом добавлялась новая строка в которой назначил громкость. так вот теперь она иногда тупит по некоторым кнопкам... как удалить те которые уже были, я так понимаю это они сбивают иногда т.к. назначено 2 действия сразу на одну кнопку?

а по моему вопросу подскажет кто?

Murkur 02.11.2013 13:15

Цитата:

Сообщение от Dj Aleks (Сообщение 275791)
а по моему вопросу подскажет кто?

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

Dj Aleks 02.11.2013 13:51

Цитата:

Сообщение от Murkur (Сообщение 275793)
А собрал точно с такими сопротивлениями как на схеме из первого поста? Если сопротивления немного отличаются, тогда и скетч править нужно, так как значения могут перекрываться и, соответственно, на одно нажатие будет два значения.

нет не с такими... был распаян пульт давно на другие сопротивления под pioneer... а это что так сыграет роль? может как можно удалить старые значения?

Murkur 02.11.2013 14:47

Цитата:

Сообщение от Dj Aleks (Сообщение 275794)
нет не с такими... был распаян пульт давно на другие сопротивления под pioneer... а это что так сыграет роль? может как можно удалить старые значения?

Да, эти сопротивления играют большую роль, так как на их значениях и построен данный скетч. Если не думаешь заменить свои резисторы, тогда нужно в скетче изменять данные под твои значения.
Посмотри, какие именно значения у тех резисторов. Я так понял, что главное, чтобы они были одинаковые. А скетч сам уже делит общее значение на количество кнопок.

Dj Aleks 02.11.2013 15:32

проще тогда оставить тогда кармониторовскую прошивку. там вроде все равно какие сопротивления

Bersenev 02.11.2013 15:42

Цитата:

Сообщение от Dj Aleks (Сообщение 275671)
Подскажите плиз(((( сегодня поставил наконец то... только без разных датчиков, чисто резестивные кнопки... все сделал по инструкции... когда перешел на кнопку настройки клавиш... стал нажимать поочередно кнопки и назначать действия... заметил что те которые уже были тоже срабатывали... например нажимаю громкость больше мне срабатывала то что по умолчанию было например яркость выше и автоматом добавлялась новая строка в которой назначил громкость. так вот теперь она иногда тупит по некоторым кнопкам... как удалить те которые уже были, я так понимаю это они сбивают иногда т.к. назначено 2 действия сразу на одну кнопку?

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

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

А что бы сбросить все настройки удали содержимое файлов duino_key_command.ini, duino_key_info.ini и duino_key_list.txt в папке DuinoKey

Bersenev 02.11.2013 15:48

Цитата:

Сообщение от Dj Aleks (Сообщение 275801)
проще тогда оставить тогда кармониторовскую прошивку. там вроде все равно какие сопротивления

Для резистивных кнопок сопротивления значения не имеют. Сопротивления играют роль только для энкодеров

Dj Aleks 02.11.2013 15:53

Цитата:

Сообщение от Bersenev (Сообщение 275802)
Из того что здесь написано я толком ничего не понял, так что буду догадываться, что именно ты хотел написать.

ладно постараюсь обьяснить еще раз... когда поставил Icar подключил дуину с прошивкой с первого поста... следую по инструкциям от туда же... ставлю галочку в 4 вкладке, перезапускаю... захожу в настройки на 4 вкладке... у меня уже добавлены какие то строки и им назначены действия! думаю ладно... буду настраивать. Нажимаю первую кнопку добавляется еще одна строка (т.е. уже моя) и параллельно показывает действие с тех строк что выше (яркость выше)... я в новодобавленную строку пишу значение которое мне нужно (громкость +) и настраиваю дальше кнопки... а теперь получается что при нажатии кнопки какой нибудь на нее назначено 2 действия (т.к. там 2 строки под нее) вот я и спрашиваю как удалить ВСЕ строки там и назначить по новой!?

Dj Aleks 02.11.2013 16:08

Цитата:

Сообщение от Bersenev (Сообщение 275802)
А что бы сбросить все настройки удали содержимое файлов duino_key_command.ini, duino_key_info.ini и duino_key_list.txt в папке DuinoKey

в папке iCarDuino у меня только 4 файла
iCarDuino.dll
iCarDuino.tlb
RegAsm
RunMe1st

Dj Aleks 02.11.2013 16:13

папку нашел в скинах, удалил все 3 файла и там стало пусто (в настройках) спасибо большое! буду пробовать заново назначить и смотреть...

Bersenev 02.11.2013 16:15

Цитата:

Сообщение от Dj Aleks (Сообщение 275806)
(т.к. там 2 строки под нее)

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

Dj Aleks 02.11.2013 16:17

Цитата:

Сообщение от Bersenev (Сообщение 275811)
Под одну кнопку ( а точнее под один код, так как иногда из-за дребезга кнопка выдаёт несколько кодов) не может быть две строки. Если кнопка выдаст код который уже есть в списке, то он не добавится в конец списка, а просто произойдёт переключение на него. Коды в списке дублироваться не могут, а следовательно и влиять друг на друга не могут. Но почистить список никто не запрещает, хуже не будет

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

Dj Aleks 02.11.2013 22:27

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

Bersenev 02.11.2013 23:39

Цитата:

Сообщение от Dj Aleks (Сообщение 275851)
попробовал, удалил все строки и заново прописал... за три часа полет нормальный... ложных срабатываний нет... не смотря на то что нет подтяжки на землю как на схеме резистором....

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

Dj Aleks 02.11.2013 23:42

я покупал с кармонитора джостик, это он.

Glouck 05.11.2013 23:23

Собрал сей девайс для управления резистивными кнопками. Заработало с первого раза, огромное спасибо Андрею за прошивку и плагин. После пары дней использования возникло пожелание - сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду. Особенно актуально, если физических кнопок не много (у меня их всего 5 шт на руле). Возможно ли такое реализовать?

И еще, у меня одна из штатных кнопок вообще без резистора - т.е. замыкает накоротко, и прошивка ее игнорирует. Я, конечно, поправил прошивку себе, но вдруг еще у кого-то такая проблема возникнет...

Dj Aleks 05.11.2013 23:27

Цитата:

Сообщение от Glouck (Сообщение 276191)
Собрал сей девайс для управления резистивными кнопками. Заработало с первого раза, огромное спасибо Андрею за прошивку и плагин. После пары дней использования возникло пожелание - сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду. Особенно актуально, если физических кнопок не много (у меня их всего 5 шт на руле). Возможно ли такое реализовать?

И еще, у меня одна из штатных кнопок вообще без резистора - т.е. замыкает накоротко, и прошивка ее игнорирует. Я, конечно, поправил прошивку себе, но вдруг еще у кого-то такая проблема возникнет...

если я правильно понял то есть функция shift

Glouck 07.11.2013 06:17

Цитата:

Сообщение от Glouck (Сообщение 276191)
сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду.

В общем, переделал прошивку на долгие нажатия вместо автоповтора. Если надо кому - пишите...

OsDima 07.11.2013 11:55

Цитата:

Сообщение от Glouck (Сообщение 276316)
В общем, переделал прошивку на долгие нажатия вместо автоповтора. Если надо кому - пишите...

Конечно надо. Режим "шифт" мне не очень нравится (надо помнить в каком он режиме "шифт или "не шифт".

Glouck 07.11.2013 21:29

Цитата:

Сообщение от OsDima (Сообщение 276328)
Конечно надо.

Вот кусок прошивки отвечающий за кнопки. Сделано на основе прошивки Андрея. Писал левой ногой, сильно не пинайте...
Код:

#include
#define RES_KEY_FLAG_ 0x16  // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино                  -
//-----------------------------------------

const int RES_PIN = 5 ;      // аналоговый вход(пин) для резестивных(рулевых) кнопок

//-----------------------------------------
//- переменные включения функций скетча  -
//-----------------------------------------

boolean is_res_keys = false;

//-----------------------------------------
//- Новые переменные для кнопок

#define RES_BT_CNT 50  // макс кол-во кнопок
#define VOL_BT_CNT 2  // кол-во кнопок с автоповтором
#define RES_DT_MIN 5  // мин значение АЦП
#define  RES_DT_MAX 1020  // макс значение АЦП
unsigned long res_key_wait_long = 600;  // задержка длинного нажатия кнопки (ms)
unsigned int key_to_send = 0;
boolean res_key_hold = false;

//-----------------------------------------
//- Переменные для резистивных кнопок    -
//-----------------------------------------

unsigned long  res_dt = 0;
unsigned long  res_dt_sum = 0;
#define RES_DT_COUNT 400 // Количество считываемых данных
#define RES_DT_SKIP_COUNT 100 // Количество данных, которые надо пропустить при нажатии
#define RES_DT_POINT 6 // Точность
int res_dt_n = 0;
unsigned long res_key = 0;
unsigned long res_key_old = 0;
unsigned long res_key_wait_next = 200;  // задержка автоповтора (ms)
unsigned long res_key_wait_millis = 0;
unsigned long res_key_millis;
unsigned long res_key_array[RES_BT_CNT + 1][2];
unsigned int res_key_count = 0;
unsigned int res_key_delta = 3;

//-----------------------------------------
void setup() {               

  Serial.begin(115200);
    res_key_millis = millis();
   
    unsigned int first_run_key = EEPROM.read(0);
    if ( first_run_key == RES_KEY_FLAG_ )
    {
      res_key_count = EEPROM.read(1);
      //EEPROM.write(addr, val);
      for(int i=0; i       {
        res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+RES_BT_CNT) - res_key_delta; res_key_array[i][1] = res_key_array[i][0] + res_key_delta + res_key_delta;
      }
    }
    for(int i=res_key_count; i<(RES_BT_CNT+1);i++)
    {
      res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
    }

}

//-----------------------------------------
void loop() {

  if (Serial.available() >= 1) // Проверяем наличие команд от компьютера
  {
    switch (Serial.read())
    {
    case 0x06: // включить передачу данных от резестивных кнопок
      is_res_keys = true;
    break;

    case 0x86: // выключить передачу данных от резестивных кнопок
      is_res_keys = false;
    break;

    }
  }
  if( is_res_keys ) res_keys();                        //  резистивные кнопки
//  res_keys();
 
}

//----------------------------------------------------------------------------------
// Функция работы с резистивными кнопками
//----------------------------------------------------------------------------------
void res_keys()

  {
    res_dt = analogRead(RES_PIN); // прочитать данные АЦП
    if( res_dt >= RES_DT_MIN && res_dt <= RES_DT_MAX )
    {
      res_dt_n++;
      if( res_dt_n > RES_DT_SKIP_COUNT )
      {
        res_dt_sum += (res_dt << RES_DT_POINT);
        if( res_dt_n == RES_DT_COUNT)
        {
//          res_key = (res_dt_sum / (RES_DT_COUNT - RES_DT_SKIP_COUNT));
          res_key = (((((( res_dt_sum / (( RES_DT_COUNT - RES_DT_SKIP_COUNT ) + (2^(RES_DT_POINT-1)-1) ) >> (RES_DT_POINT-1)) + 1) >> 1) + 1)>> 1)); // + 1) >> 1;
          res_dt_sum = 0; res_dt_n = 0;
        }
      }
    }
    else
    {
      res_dt_sum = 0; res_dt_n = 0; res_key = 0;
      res_key_wait_millis = 0;
    }
  }

//  обработка нажатия
  int key_code = 0;

  if (res_key != 0)  // что-то нажато
  {
    key_code = keyCode(res_key);
    if (key_code <= VOL_BT_CNT)  // первые кнопки с автоповтором
    {
      if (res_key_old == res_key)  // удержание кнопки
      {
        if (millis() - res_key_wait_millis > res_key_wait_next)  // задержка автоповтора
        {
          sendKey(key_code);
          res_key_wait_millis = millis();
        }
      }
      else
      {
        sendKey(key_code);
        res_key_wait_millis = millis();
        res_key_old = res_key;
      }
    }
    else  // кнопки с долгим нажатием
    {
      if (res_key_old == res_key)  // удержание кнопки
      {
        if (millis() - res_key_wait_millis > res_key_wait_long)  // длинное нажатие
        {
          if (!res_key_hold)
          {
            sendKey(key_code+RES_BT_CNT);
            res_key_wait_millis = millis();
            res_key_hold = true;
          }
        }
      }
      else
      {
        key_to_send = key_code;
        res_key_wait_millis = millis();
        res_key_old = res_key;
      }
    }
  }
  else  // ничего не нажато
  {
    res_key_old = 0;
    if (key_to_send != 0 && !res_key_hold) sendKey(key_to_send);
    res_key_hold = false;
    key_to_send = 0;
  }
}

void sendKey(int key_code)
{
  bytes[0] = 0xAA;          // преобразовать в 4-байта 
  bytes[1] = 0; 
  bytes[2] = RES_PIN;
  bytes[3] = key_code;
  Serial.write( bytes,4); // отправить прочитаное значение компьютеру
/*
  Serial.write(bytes[3]+0x30); // отправить прочитаное значение компьютеру
  Serial.print(" ");
  Serial.print(res_key,DEC);
  Serial.println("");
*/
}

unsigned int keyCode(unsigned long key_res)
{
  int i = 0; boolean exit = false;
  while( res_key_array[i][0] != 0xFFFFFFFF && (!exit) )
  {  // проверяем новая ли кнопка
    if( (res_key_array[i][0] <= key_res) && (key_res <= res_key_array[i][1]) ) exit = true; else i++;
  }
  if ( exit )  // кнопкка уже известная
  {
    return (i+1);
  }
  else {  // кнопка новая
    if ( res_key_count < RES_BT_CNT )
    {
      res_key_array[res_key_count][0] = key_res - res_key_delta;
      res_key_array[res_key_count][1] = key_res + res_key_delta;
      res_key_count++;
           
      EEPROM.write(1, res_key_count); // Запоминаем количество кнопок
      byte one_byte = key_res / 256;
      EEPROM.write(res_key_count+1, one_byte ); // Запоминаем старший байт значения кнопки
      one_byte = key_res - one_byte * 256;
      EEPROM.write(res_key_count+1+RES_BT_CNT, one_byte ); // Запоминаем младший байт значения кнопки
      EEPROM.write(0, RES_KEY_FLAG_);
           
      return res_key_count;
    }
    else
    {  // переполнение - больше кнопок не запоминаем
      bytes[0] = 0xAA;          // преобразовать в 4-байта 
      bytes[1] = 0xAA; 
      bytes[2] = (key_res & 0xFF00) >> 8;
      bytes[3] = key_res & 0xFF;
      Serial.write( bytes,4); // отправить прочитаное значение компьютеру
    }
  }
}

После заливки этого кода при первом включении, первые две нажатые кнопки будут с автоповтором (для регулировки громкости), остальные - обычные. Короткое нажатие работает на отпускание, длинное - по задержке в 600 мс.
Если надо переопределить кнопки для автоповтора - поменяйте значение RES_KEY_FLAG_ на любое другое число, и перезалейте прошивку. Если нужно больше двух кнопок с автоповтором - поменяйте значение VOL_BT_CNT.

jos911 13.11.2013 12:07

Ребята подскажите пожалуйста, а можно ли повесить резистивные кнопки так, что-бы они дублировали экранные кнопки в блоке реле. Хочется, сделать так- допустим нажал на экранную кнопку в плагине блок реле, выполнилось какое то действие, например: включился свет в салоне, но если я стаю на стоянке и монитор выключен, то я жму резистивную кнопку и она выполняет тоже действие, только если я свет включил с экранной кнопки то резистивная его выключает или наоборот.
Комп стоит в грузовике, блок резистивных кнопок хочу установить в "спальник", и что-бы каждый раз на бегать и включать монитор Было бы не плохо реализовать так.
Спасибо.

Bersenev 13.11.2013 12:44

Если речь о выключении кнопок при работающем компьютере, то вешаешь на резистивную кнопку команду икара duino_rеlay_1_toggle , вместо единицы указываешь свой номер реле.

А вот если комп выключен, то надо писать другой скетч для ардуино

jos911 13.11.2013 12:48

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

Fernando 15.11.2013 23:28

А как назначить горячую клавишу на кнопку управления реле, что-то долгим нажатием не получается. Точнее, задача такая: внешняя программа посылает комбинацию клавиш по событию, по этой комбинации реле нужно включить на заданный интервал времени (1000мс). Как это сделать?

Tygra 26.11.2013 14:29

Получил с почты ардуину мега 2560 , отковырял энкодер с муз центра старого, отдельно энкодер проверил, работает. Пытался загрузить скетч но получил ошибку
Цитата:

IRremoteInt.h:113: error: 'uint8_t' does not name a type
т.к. ардуину первый раз вижу, то полез к гуглу, выяснилось что для версии проги ардуины выше 1 ( у меня 1,0,5) нужно править библиотеку IRremoteInt.h , нужно дописать
Цитата:

#include
. Возможно что я велосипед изобретаю, но поиском не нашел ответа на форуме, а беглый поиск по 59 страницам ничего не дал. Если это уже не однократно было , удалите сей пост. А так м\б кому поможет....
P\S Запустил только один энкодер без всей остальной обвязки, круть, заработало все почти с пол пинка. Единственно что второй энкодер которого нет, глючил. Т.е. с него шел сигнал, но его физически нет, порт его висел в воздухе, заземлил пин второго энкодера и стало все замечательно..... Остальное еще не проверял, думаю "запилить" будет не сильно сложно....... Вот бы еще климат-контроль замутить .... Помимо приобретения самого икара, я бы подумал доплатить за модуль климы.
По поводу сервоприводов в ардуине http://wiki.amperka.ru/%D1%80%D0%BE%...BE%D0%B4%D1%8B

Tygra 26.11.2013 16:37

А никто не пилил скетч под нормальные релюшки ? Что то у меня не хватает фантазии куда деть 24 реле. Штук 6 более чем хватило бы, прямым управлением на пины без мультиплексора.

AlexIz 16.12.2013 08:34

Цитата:

Сообщение от Glouck (Сообщение 276387)
После заливки этого кода при первом включении, первые две нажатые кнопки будут с автоповтором (для регулировки громкости)

Не совсем понял фразу. Поясни, пожалуйста.

Glouck 17.12.2013 03:47

Цитата:

Сообщение от AlexIz (Сообщение 280788)
Не совсем понял фразу. Поясни, пожалуйста.

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

Vodkin 05.01.2014 20:20

Добрый день. Подскажите (толком не нашел): хочу на кнопку назначить команду сон или выключить целиком. А как правильно они называются в командах икара? Спасибо.

OsDima 06.01.2014 10:54

Цитата:

Сообщение от Vodkin (Сообщение 282377)
Добрый день. Подскажите (толком не нашел): хочу на кнопку назначить команду сон или выключить целиком. А как правильно они называются в командах икара? Спасибо.

Этот пост. Только у меня не работает?

Vodkin 06.01.2014 13:58

Цитата:

Сообщение от OsDima (Сообщение 282422)
Этот пост. Только у меня не работает?

Спасибо. Пробовал эти команды только без CF перед ними. Как в первом случае, так и во втором реакция одна - зависон ИКАРА капитальный. Не завершить даже из диспетчера задач... :(

OsDima 06.01.2014 23:00

Цитата:

Сообщение от Vodkin (Сообщение 282430)
Спасибо. Пробовал эти команды только без CF перед ними. Как в первом случае, так и во втором реакция одна - зависон ИКАРА капитальный. Не завершить даже из диспетчера задач... :(

У меня примерно тоже самое было.
Плюнул тапаю по экрану, когда увожу в спящий режим.

Vodkin 06.01.2014 23:38

ООО! Еще один не понятный мне момент: до этого тестировал все на домашнем компе. Перенес Дуину на автомобильный комп, а на нем второй энкодер и кнопки вообще команд в Икар не шлют. Первый энкодер - все нормально. Кто подскажет в чем может быть проблема?

Zhirnov 07.01.2014 00:16

Вложений: 1
Не могу найти com порт JoyCon EX. В диспетчере устройств видно "USB-устройство ввода". Из-за этого не работает в IcarDS. Кто знает?

http://pccar.ru/attachment.php?attac...1&d=1389035430

Сам JoyCon работает через JoyCon Explorer


Zhirnov 07.01.2014 01:46

Опа! JoyCon не поддерживается??


Часовой пояс GMT +4, время: 16:45.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot