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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   CITROEN-ARDUINO (http://pccar.ru/showthread.php?t=23275)

lti1 26.02.2016 15:57

Беззнаковая арифметика в Java

GASCHE 26.02.2016 16:57

Уж не знаю что у него , но вот он писал
Цитата:

int LengthP;
LengthP = (buf[0] & 0x0F * 256 + buf[1]) - (len - 2);
и говорит что работает.

lti1 26.02.2016 17:06

Цитата:

Сообщение от GASCHE (Сообщение 352919)
Уж не знаю что у него , но вот он писал

и говорит что работает.

Внимательнее прочитайте.
Цитата:

Сообщение от T_r_D (Сообщение 352790)
Народ- дурацкий вопрос. Передаю из ардуины дройду два байта
DATA[9] = 0x09;
DATA[10] = 0xA0;
принимаю на стороне дройда нормально, а теперь пытаюсь их склеить и получаю чушь!
(Arbyte[9] << 8) + Arbyte[10])

Arbyte[9] равно -91 и поэтому заполняется еденицами, а нужно чтоб нолями.
Как это сделать?


T_r_D 01.03.2016 13:28

Найдена очередная неточность в описании от autowp.
ID 265
байт 2 это не текущий элемент меню, а вообще выбранный элемент! Тоесть скажем Sport и он будет выбран даже после выхода из меню.

байт 3 это текущяя PTY станции. Если она не совпадает с выбранной в меню, то значёк PTY перечёркнут, а если совпадает, то нормальный.

T_r_D 02.03.2016 18:02

В том же 265 ID
Байт 0 бит 5 это сообщение Please Wait когда идёт поиск PTY станций.
Причём 1 когда надписи нету, тоесть рабочий режим.

ошибся!
Всё ещё проще
байт 0
бит 7 надпись RDS
бит 5 надпись перечёркнутая RDS и REG
бит 4 TA
бит 2 перечёркнутое TA

байт 1
бит7 PTY
бит6 PTY menu show
бит4 надпись перечёркнутая PTY

T_r_D 03.03.2016 14:56

ещё покопал.
Сообщение Please Wait обозначается почему-то в двух ID сразу!

1E0 второй байт в режиме радио и если идёт поиск PTY с надписью на экране
Please Wait, то 61 если надпись пропала, то A2.
Скорее всего там только какой-то бит отвечает за это, а что остальное- хз.

А второе место из раскопаного ID 225
Byte 0
0- В процессе поиска PTY (бит 2 показывает тоже самое?).
1- 1 когда идёт поиск частоты радио
2- см выше
3- не опознан
4- не опознан
5- в какую сторону шло сканирование. Если в + частоты, то 1 если в - то 0
6- не опознан
7- после поиска PTY 1- нашли, 0- нет. Если 1, то мультифреймом выводится список, если 0, то надпись что не нашли с выбранной опцией PTY.

Byte 1
Если текущая частота в памяти то 10,20,30,40,50,60 в DEC или если не в памяти, то 0

Byte 2
10dec- fm1
20dec- fm2
40dec- fm ast
50dec- MW

Byte 3,4 частота радио для FM формула (byte3|byte4)/20+50, для MW byte3|byte4

T_r_D 07.03.2016 16:33

Вложений: 12
Спасибо lti1. Научил меня делать скриншоты с планшета :)

Ловите!

T_r_D 07.03.2016 16:44

Вложений: 3
Ну и фотки того что творю не в виртуальном мире, а в материальном.
Обтянуто плёнкой, оргстекло как основа для крепления платы и держалка планшета в рамке.

T_r_D 08.03.2016 17:15

Вложений: 3
Все окна что выводят инфу они поверх всего и вылезают даже когда приложение скрыто.

Дописал PTY лист и сообщение когда идёт поиск PTY

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

T_r_D 09.03.2016 14:24

Вложений: 1
И ещё одна менюшка готова.

Dmitry8 09.03.2016 19:01

Цитата:

Сообщение от T_r_D (Сообщение 354113)
Все окна что выводят инфу они поверх всего и вылезают даже когда приложение скрыто.

Интересно, можно узнать подробности? Я так понимаю, Приложение состоит из фоновой службы и активностей вызываемых по определенным событиям? Какие свойства должны быть у активностей для описываемого здесь поведения?

T_r_D 09.03.2016 20:30

приложение состоит из трёх частей.

Первая часть это главное активити которое стартует сервис.
Сервис принимает сообщения из порта и делит в две стороны- в главную активити и на всплывающие окно. Это часть два.
И часть три это всплывающее окно. Оно реализовано тоже сервисом.

Ну и да- в фоне всегда служба приёма пакетов :)

T_r_D 09.03.2016 21:45

В основе лежит всё равно проект автора дров.
https://github.com/felHR85/UsbSerial
Я не претендую на первенство- я просто модифицировал его библиотеку под себя.

Dmitry8 09.03.2016 21:50

Я немного о другом спрашивал. Что вы подразумеваете под:
Цитата:

Сообщение от T_r_D (Сообщение 354258)
всплывающие окно.


T_r_D 09.03.2016 21:53

Dmitry8
Про свойства активности я не понял, но окно создаётся динамически.
Сначала создаётся сервис, а потом создаётся лейаут и компоненты на нём формируя конечное "окно".

Dmitry8 09.03.2016 21:58

Цитата:

Сообщение от T_r_D (Сообщение 354271)
Dmitry8
Про свойства активности я не понял, но окно создаётся динамически.
Сначала создаётся сервис, а потом создаётся лейаут и компоненты на нём формируя конечное "окно".

Чтобы было понятнее, выложите сюда код xml-файла, описывающего свойства активити, которое на последнем скриншоте.

T_r_D 09.03.2016 22:00

нету его. XML в смысле
И активити там нет.
Динамически из явы создаётся

Код создания окна если поможет
public void Window_style_rec (){
Typeface face = Typeface.createFromAsset(getAssets(), "lcd.ttf");
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
ll = new LinearLayout(this);
msgstr = new TextView(this);
img = new ImageView(this);
LinearLayout.LayoutParams llParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParam s.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT );
ll.setBackgroundColor(Color.argb(180, 0, 0, 0)); //255,0,0
ll.setOrientation(LinearLayout.HORIZONTAL);


ViewGroup.LayoutParams groupParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP _CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
img.setLayoutParams(groupParameters);
msgstr.setTypeface(face);
msgstr.setTextSize(80);
msgstr.setTextColor(0xFFE6E9FD);
msgstr.setLayoutParams(groupParameters);


ll.setLayoutParams(llParameters);
ll.addView(img);
ll.addView(msgstr);

WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(WindowManager.LayoutPar ams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTE NT,WindowManager.LayoutParams.TYPE_PHONE,WindowMan ager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
parameters.x = 0;
parameters.y = 0;
parameters.gravity = Gravity.CENTER | Gravity.CENTER;
wm.addView(ll, parameters);
}

T_r_D 10.03.2016 10:28

Народ- вопрос.
Кто что знает про радиотекст?
Интересует есть ли у него ограничение по длине текста или нет?

xmetal 10.03.2016 11:53

Цитата:

Сообщение от T_r_D (Сообщение 354303)
Народ- вопрос.
Кто что знает про радиотекст?
Интересует есть ли у него ограничение по длине текста или нет?

До 64 знаков. Страница 25. ftp://ftp.rds.org.uk/pub/acrobat/rbds1998.pdf

T_r_D 10.03.2016 18:51

Вложений: 2
xmetal Вот спасибо!

Так, теперь в ход пошла тяжёлая артиллерия.
Мультифрейм стало быть.

T_r_D 11.03.2016 11:05

Вложений: 2
Может кто знает.
Есть XML
В нём рамка.
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    
    <solid android:color="#DC000000" />
    <stroke
        android:width="3dip"
        android:color="#FFFFFF" />

    <corners android:bottomRightRadius="10dip"
        android:bottomLeftRadius="10dip"
        android:topLeftRadius="10dip"
        android:topRightRadius="10dip"/>

</shape>

Она соответственно на лейаут применяется.
Получается как на первой картинке, а надо как на второй.
Что куда вписать?

T_r_D 11.03.2016 12:39

Вложений: 1
Вопрос с LayoutInflater снят.

Результат:

T_r_D 11.03.2016 18:06

Вложений: 1
Ну и пошёл процесс окультуривания

T_r_D 12.03.2016 12:27

Всё, сегодня я закончил со всеми меню которые можно повторить без эмуляции дисплея. Мне осталось сделать
1 отображение если станция в памяти (Mem1 -6)
2 Радиотекст
3 Отловить поиск станций РДС. Надпись появляется RDS Search и всё замолкает.

T_r_D 12.03.2016 17:50

Вложений: 1
Вот окончательный вид интерфейса. Не реальный только радиотекст, всё остальное снимается с магнитолы которая лежит на столе.

T_r_D 13.03.2016 20:03

Вопрос с радиотекстом решён. Кстати он почему-то всегда одного размера в кане передаётся. Максимального :)
Вот код
PHP код:

//____________________________MULTIFRAME__________________________________
          
if(canId == 164// 125HEX
            
{
              if ((
buf[0] >> 4) == 0x01){
                
LengthR = ((buf[0] & 0x0F) * 256 buf[1]) - 6;
                
DataBufSizeR 2;
                
MULTIFRAMER[0] = buf[6];
                
MULTIFRAMER[1] = buf[7];
             } 

              if(((
buf[0] >> 4) == 0x02) && LengthR 0multiframef();
              if(((
buf[0] >> 4) == 0x02) && LengthR == 0)
              {
             for(
int i=0;i<=53;i++) Serial.print(char(MULTIFRAMER[i]));
             
Serial.println();
             }
             }

   }
}
  
void multiframef(){
              if (
LengthR 8)
              {
                for (
int i=07;i++) MULTIFRAMER[DataBufSizeR] = buf[i+1];
                
DataBufSizeR DataBufSizeR 7;
                
LengthR LengthR 7;
              }
              else{
                for (
int i=0LengthR;i++) MULTIFRAMER[DataBufSizeR] = buf[i+1];
                
DataBufSizeR DataBufSizeR LengthR;
                
LengthR 0;
              }


Как бы всё отображается.

T_r_D 16.03.2016 12:13

Всё народ. С первой частью задачи я справился благодаря всем вам. За что вам огромное спасибо.

На данный момент полностью повторён дисплей. Тоесть отображаем на планшете всё что на дисплее. Бортовик, всё что отображает магнитола в режиме радио\ЦД\Ченджера, настройки аудио и громкость.

Во второй части будем пытаться эмулировать дисплей. Без этого невозможно отобразить меню(3 разных для каждого режима работы) по кнопке ОК и меню по кнопке MENU.
Делать меню по кнопке ОК я не буду так как не удобно, а вот по кнопке MENU сделать нужно.

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

dmit 17.03.2016 17:52

Заказал Ардуино и Шилд . Тоже хочу помучаться в этом плане. Идея такая на первых порах ловить сообщения, которые рисуют надписи на штатном мониторе. И посылать сообщения для того, чтобы написать свои сообщения на штатном мониторе ! Конкретно для чего пока не знаю, но мысли есть ! Возможно ли такая процедура на Ардуино ? Авто Ниссан Теана2 . Направьте в нужное русло с чего начинать ? Может ЕЛМ327 пока протокол пощупать ? Какой принцип прорисовки экрана в протоколе, текст допустим ascii сообщениями (если я не ошибаюсь), а прорисовка других элементов ?

T_r_D 18.03.2016 03:39

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

Ардуине с CAN платой вполне справляется с задачами обработки, приёма и передачи данных из шины.

Возможно или нет на дисплее что-то писать своё станет понятно после разбора протокола.
И сообщения в CAN ходят не обязательно в ASCII, тем более что в нём нет русских буковок, а в тиане они скорее всего есть.

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

dmit 18.03.2016 12:25

Цитата:

Сообщение от T_r_D (Сообщение 355402)
Для начала нужно узнать какая шина в тиане на которой висит дисплей.
Потом уже разбираться с протоколом.

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

Ардуине с CAN платой вполне справляется с задачами обработки, приёма и передачи данных из шины.

Возможно или нет на дисплее что-то писать своё станет понятно после разбора протокола.
И сообщения в CAN ходят не обязательно в ASCII, тем более что в нём нет русских буковок, а в тиане они скорее всего есть. В Теане 2 в моей по крайней мере нет русских букв !

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

т.е если выловить данные управляющие стандартными меню дисплея в шине, то этими меню можно управлять для своих сообщений !

dmit 18.03.2016 12:36

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

т.е если выловить данные управляющие стандартными меню дисплея в шине, то этими меню можно управлять для своих сообщений !

T_r_D 18.03.2016 14:28

dmit
Нету понятия монитор, дисплей, магнитола и так далее. Есть понятие "шина данных".
Она бывает по крайней мере двух типов- стандартная высокоскоростная и FT-CAN.
Для стандартной на плате распаяна микруха TJA1050, для FT потребуется перепайка на TJA1054 или 1055.
Эти данные можно узнать перебором. Перебирая для каждой из категорий скорость.
Но лутчше найти данные сразу.

Там не так всё просто.
Более или менее просто "читать" данные из шины и выводить их на своё устройство.

Нельзя просто взять и вмешаться своими сообщениями в шину. Точнее в некоторых случаях можно, но в 90% сообщения цикличны. Тоесть каждые, скажем 500мс, идёт передача данных о, ну допустим, нажатой или нет кнопке.
И этот статус будет в битовом виде допустим 0, а ты будешь пихать ему 1. С кнопкой это может и прокатит, а вот с сообщениями, кроме как мерцания ни чего не выйдет.

Короче. При удачном подключении к шине нужно будет заниматься анализом пакетов. Тупо тыкать кнопки, крутить ручки и смотреть что происходит.
Это долго и уныло. Да ещё можно и чего-то не заметить.
С наскока не выйдет короче.

Посмотри дату начала этой темы и пойми сколько нужно время для раскопки примерно 50% информации в шине FT(кан комфорт).

dmit 19.03.2016 19:25

Цитата:

Сообщение от T_r_D (Сообщение 355440)
dmit
Нету понятия монитор, дисплей, магнитола и так далее. Есть понятие "шина данных".
Она бывает по крайней мере двух типов- стандартная высокоскоростная и FT-CAN.
Для стандартной на плате распаяна микруха TJA1050, для FT потребуется перепайка на TJA1054 или 1055.
Эти данные можно узнать перебором. Перебирая для каждой из категорий скорость.
Но лутчше найти данные сразу.

Там не так всё просто.
Более или менее просто "читать" данные из шины и выводить их на своё устройство.

Нельзя просто взять и вмешаться своими сообщениями в шину. Точнее в некоторых случаях можно, но в 90% сообщения цикличны. Тоесть каждые, скажем 500мс, идёт передача данных о, ну допустим, нажатой или нет кнопке.
И этот статус будет в битовом виде допустим 0, а ты будешь пихать ему 1. С кнопкой это может и прокатит, а вот с сообщениями, кроме как мерцания ни чего не выйдет.

Короче. При удачном подключении к шине нужно будет заниматься анализом пакетов. Тупо тыкать кнопки, крутить ручки и смотреть что происходит.
Это долго и уныло. Да ещё можно и чего-то не заметить.
С наскока не выйдет короче.

Посмотри дату начала этой темы и пойми сколько нужно время для раскопки примерно 50% информации в шине FT(кан комфорт).

1.Т.е. получается сразу ориентироваться на перепайку микрухи ? скорее всего в Теане тоже FT(кан комфорт)
2. Получается кроме анализа никакой радости не принес попытка разбираться с сообщениями. Если я допустим вычислю как опустить стеклоподъемник , то послав свое сообщение , а не нажимая кнопки стекло не опуститься ? Или монитор не напишет слово и не прорисует стандартное меню ?
3. Хотел бы уточнить по Вашему проекту . Как я понял Вы просто перевели содержимое штатного монитора на свой ! Т.е. вы выловили сообщения , расшифровали их и средсвами Андроид нарисовали на экране андроида в своей современной интерпритации ! Ардуин у вас вылавливает сообщения , а далее что , кто занимается формирование новой информации на основе выловленых данных, тоже Ардуин ? Как соединен АРдуин с Андроид ? Вот здесь можно подробнее ?

T_r_D 20.03.2016 14:11

1 Сначала пробовать.
2 Пока не увидишь что происходит и не попробуешь послать пакет ни чего не узнаешь. Протокол у всех разный.
2. У меня всё идёт при помощи разных ID и байт/бит в них, сама визуализация в дисплее вшита. Отдельно только идёт мультифрейм для вывода сообщений и RDS.
Они идут фактически в ASCII.
Ардуина ловит с платы кан сообщения и передаёт их на сериал порт, а к тому уже подключена микруха которая выдаёт это на ЮСБ(стандартный разъём на плате ардуины). Далее по юсб это подключено к планшету.
На планшете при помощи изисканий вот этого дяди написан софт
https://github.com/felHR85/UsbSerial/releases/

T_r_D 20.03.2016 14:14

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

Как отфильтровать аппаратно при помощи mcp пакеты?
нашёл только это
INT8U init_Mask(const INT8U num,const INT32U ulData); /* init Masks */
INT8U init_Filt(const INT8U num,const INT8U ext,const INT32U ulData);
Что с этим делать не понятно.
Какой фильтр подсовывать и маску чего?
Мне надо пропускать около 30 ID, а всё остальное игнорировать.

Сегодня выяснилось что очень большие грабли с приёмом одиночных сообщений.
Коими является мультифрейм.
Дома всё ок, всё принимается нормально, менюшки выскакивают, очень редко бывают пустыми, но это фигня.
В машине меню показывает с 10 нажатия, часто не закрывает.
Единственное логическое объяснение такому поведению это то, что ардуина сравнивает все пакеты которые приходят немаленьким кодом и просто захлёбывается данными.

xmetal 20.03.2016 19:05

Там по-моему можно только 6 аппаратных фильтров настроить. Нужно либо оптимизировать проверки, либо переносить всю логику в андроид. Ардуине оставить фильтр и передачу сырых данных в компорт.

T_r_D 21.03.2016 05:56

Я как понял там две маски на Разрешить и Запретить и 6 фильтров.
Мало.
Нужно проверять 21 ID.

По пробую заменить if на switch.
Должно быть быстрее.

Ps.
Попробовал подключить к своей шине стандартный контроллер can с tja1050 и увидил странную штуку- половину id он видит, но только половину ))

xmetal 21.03.2016 12:19

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

T_r_D 24.03.2016 19:30

Цитата:

Сообщение от xmetal (Сообщение 355697)
Я больше думаю на то, что где-то слишком долго идет обработка самих данных. На ардуиновский код можно посмотреть?

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

Если заменить if на switch, то задержки даже в 20 мало- каша пишется.
Может совместно разобраться выйдет...

T_r_D 24.03.2016 23:18

вот код- сильно не пинать, потом окультурю
PHP код:

#include <SPI.h>
#include "mcp_can.h"
MCP_CAN CAN(10);
unsigned char len 0;
unsigned char buf[8];
INT32U canId 0x000;
unsigned long time0 = -120;

//RDS
int digit1digit2;

uint8_t DATA[162] = {};
uint8_t DATA2[162] = {};
boolean Flag false;
boolean Flag2 false;
int Count 0;
int Count2 0;
int FMS 0;
int VolCount 5;
int arrcmp;

//Multiframe
int LengthP
int DataBufSize;
int Scroll 0;
uint8_t MULTIFRAMEFTMP[3] = {};
uint8_t MULTIFRAMETMP[54] = {};
uint8_t MULTIFRAME[55] = {};
//Multiframe RDTxT
//Package length: 64
int LengthR
int DataBufSizeR;

void setup()
{
  
DATA[14] = 0x20;
    
Serial.begin(115200);
    
pinMode(9INPUT);
    
CAN.begin(CAN_125KBPS,MCP_8MHz);
}

unsigned long time2 0;
unsigned char stmp[8] = {140015100160};

void loop()
{
//  if ((millis() - time2) > 100){
//  CAN.sendMsgBuf(0x036, 0, 8, stmp); //Это пакет зажигания.
//  time2 = millis();}
  
       
if(!digitalRead(9))
       {
       
CAN.readMsgBuf(&lenbuf);
       
canId CAN.getCanId();

if(
canId == 0x125) {
  if (
buf[0] == 1) {
     
bitWrite(DATA[30],5,0);bitWrite(DATA[30],6,0);bitWrite(DATA[30],7,0);
     
memset(MULTIFRAMEFTMP0sizeof(MULTIFRAMEFTMP));
     
memset(MULTIFRAMETMP0sizeof(MULTIFRAMETMP));
     
memset(MULTIFRAME0sizeof(MULTIFRAME));
     for (
int i=0i<55i++) DATA[i+41] = 0x00;
  }
  else {              
              if (
buf[0] == 4DATA[39] = buf[4];
               if (
buf[1] == 112 &&  buf[0] == 6){
                  
bitWrite(DATA[30],7,1);
                  
bitWrite(DATA[30],5,0);
                  
bitWrite(DATA[30],6,0);
                   if (
buf[4]!=16 && buf[4]!=19 && 
                       
buf[4]!=64 && buf[4]!=65 && 
                       
buf[4]!=66 && buf[4]!=67DATA[39] = buf[4];
                   else {
                    if (
buf[4] == 16 || buf[4] == 64DATA[39] = 0x00;
                    if (
buf[4] == 65DATA[39] = 0x01;
                    if (
buf[4] == 66DATA[39] = 0x02;
                    if (
buf[4] == 19 || buf[4] == 67DATA[39] = 0x03;
                    }
                    if (
buf[4] == 16Scroll 1;
                    if (
buf[4] == 19Scroll 2;
                    if (
buf[4] != 16 && buf[5] != 19Scroll 0;
                  
DATA[40] = buf[3] + 0x01;
               }
              
              if ((
buf[0] >> 4) == 0x01){
                
LengthP = ((buf[0] & 0x0F) * 256 buf[1]) - 6;
                
DataBufSize 0;
                
MULTIFRAMEFTMP[0] = buf[6];
                
MULTIFRAMEFTMP[1] = buf[7];
                if (
buf[1] == 13 || buf[1] == 22 || buf[1] == 31 || buf[1] == 40){
                    
FMS 1;
                    if (
buf[5] == 64 || buf[5] == 16DATA[39] = 0x00;
                    if (
buf[5] == 65 || buf[5] == 33DATA[39] = 0x01;
                    if (
buf[5] == 66 || buf[5] == 50DATA[39] = 0x02;
                    if (
buf[5] == 67 || buf[5] == 19DATA[39] = 0x03;
                    if (
buf[5] == 16Scroll 1;
                    if (
buf[5] == 19Scroll 2;
                    if (
buf[5] != 16 && buf[5] != 19Scroll 0;
                    }
                if (
buf[1] == 58){
                    
FMS 2;
                    if (
buf[3] == 16DATA[39] = 0x00;
                    if (
buf[3] == 32DATA[39] = 0x01;
                    if (
buf[3] == 48DATA[39] = 0x02;
                    if (
buf[3] == 64DATA[39] = 0x03;
                    if (
buf[3] == 80DATA[39] = 0x04;
                    if (
buf[3] == 96DATA[39] = 0x05;
                    
Scroll 0;
                    }
             } 

              if(((
buf[0] >> 4) == 0x02) && LengthP != 0multiframef();
              if(((
buf[0] >> 4) == 0x02) && LengthP == 0)
              {
              if (
Scroll == 0){
              
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
              
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
              for(
int i=0;i<=51;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];}

              if (
Scroll == 1){
                for (
int i 26i>=0i--) MULTIFRAME[i+9] = MULTIFRAME[i];
                
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
                
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
                for (
int i 0i<7;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];
                }

              if (
Scroll == 2){
                for (
int i 0i<=26i++) MULTIFRAME[i] = MULTIFRAME[i+9];
                
MULTIFRAME[27] = MULTIFRAMEFTMP[0];
                
MULTIFRAME[28] = MULTIFRAMEFTMP[1];
                for (
int i 0i<7;i++) MULTIFRAME[i+29] = MULTIFRAMETMP[i];
                }
              for (
int i=0i<54i++) DATA[i+41] = MULTIFRAME[i];
              if (
FMS == 1) {bitWrite(DATA[30],5,1); bitWrite(DATA[30],6,0); bitWrite(DATA[30],7,0);}
              if (
FMS == 2) {bitWrite(DATA[30],6,1); bitWrite(DATA[30],5,0); bitWrite(DATA[30],7,0);}
              }
  }
}
          if(
canId == 0xA4 && bitRead(DATA[21],5) == 1)
            {
              if ((
buf[0] >> 4) == 0x01){
                
LengthR = ((buf[0] & 0x0F) * 256 buf[1]) - 6;
                
DataBufSizeR 98;
                
DATA[96] = buf[6];
                
DATA[97] = buf[7];
              } 

              if(((
buf[0] >> 4) == 0x02) && LengthR 0multiframeRF();
              if(((
buf[0] >> 4) == 0x02) && LengthR == 0){
              }
             }
          if(
canId == 0xB6){
          
DATA[0] = buf[0];DATA[1] = buf[1];
          
DATA[2] = buf[2];DATA[3] = buf[3];}
          if(
canId == 0x221){DATA[4] = buf[1];DATA[5] = buf[2];
          
bitWrite(DATA[36],3,bitRead(buf[0],3));} 
          if(
canId == 0x2A1){DATA[6] = buf[3];DATA[7] = buf[4];<< buf [4];
          
DATA[8] = buf[0];
          
DATA[9] = buf[1];DATA[10] = buf[2];}
          if(
canId == 0xF6DATA[11] = buf[6];
          if(
canId == 0x1A1){if (bitRead(buf[2],7) == 1DATA[12] = 0x01; else DATA[12] = 0x00;
          
DATA[13] = buf[1];}
          if(
canId == 0x1A5//421 1A5
            
if (buf[0] <= 30){ 
            
DATA[14] = buf[0];
            
VolCount 0;
            }
            else {
              if (
VolCount 5VolCount VolCount +1;
              else 
DATA[14] = 0x1F;
            }
          if(
canId == 0x1E5){
            if (
bitRead(buf[0],7) == || bitRead(buf[1],7) == || bitRead(buf[2],7) == || bitRead(buf[4],7) == || 
                
bitRead(buf[5],7) == || bitRead(buf[5],4) == || bitRead(buf[6],6) == 1){
                  if (
bitRead(buf[0],7) == 1){DATA[15] = 0x01DATA[16] = (buf[0] & 0x7F);}
                  if (
bitRead(buf[1],7) == 1){DATA[15] = 0x02DATA[16] = (buf[1] & 0x7F);}
                  if (
bitRead(buf[2],7) == 1){DATA[15] = 0x03DATA[16] = (buf[2] & 0x7F);}
                  if (
bitRead(buf[4],7) == 1){DATA[15] = 0x04DATA[16] = (buf[4] & 0x7F);}
                  if (
bitRead(buf[5],7) == 1){DATA[15] = 0x05DATA[16] = bitRead(buf[5],6);}
                  if (
bitRead(buf[5],4) == 1){DATA[15] = 0x06DATA[16] = bitRead(buf[5],2);}
                  if (
bitRead(buf[6],6) == 1){DATA[15] = 0x07;
                                       if ((
buf[6] & 0x1F) == 3)DATA[16] = 1;
                                       if ((
buf[6] & 0x1F) == 7)DATA[16] = 2
                                       if ((
buf[6] & 0x1F) == 11)DATA[16] = 3;
                                       if ((
buf[6] & 0x1F) == 15)DATA[16] = 4;
                                       if ((
buf[6] & 0x1F) == 19)DATA[16] = 5;
                                       if ((
buf[6] & 0x1F) == 23)DATA[16] = 6;
                                       }
                  }else 
DATA[15] = 0x00;
           
bitWrite(DATA[21],7,bitRead(buf[5],6));
           }

          if(
canId == 0x165)
          {
          if (
buf[0] == 192)DATA[17] = 0x01; else DATA[17] = 0x00;
          if (
buf[2] == 16){DATA[17] = 0x02;}
          if (
buf[2] == 32){DATA[17] = 0x03;}
          if (
buf[2] == 48){DATA[17] = 0x04;}
          if (
buf[2] == 64){DATA[17] = 0x05;}
          if (
buf[2] == 80){DATA[17] = 0x06;}
          }
          if(
canId == 0x225 && DATA[17] == 0x02)
          {
          
DATA[19] = buf[3];
          
DATA[20] = buf[4];
          
DATA[31] = buf[1];
          
bitWrite(DATA[18],0,bitRead(buf[2],4));
          
bitWrite(DATA[18],1,bitRead(buf[2],5));
          
bitWrite(DATA[18],2,bitRead(buf[2],6));
          if (
bitRead(buf[2],4) == && bitRead(buf[2],6) == 1)bitWrite(DATA[18],3,1); else bitWrite(DATA[18],3,0);
          
bitWrite(DATA[18],4,bitRead(buf[0],2));
          
//bitWrite(DATA[18],5,bitRead(buf[0],7));
          
            
if (bitRead(buf[0],2) == 1Flag true;
            if (
bitRead(buf[0],2) == && Flag == true){
            
Count Count 1;
              if (
Count 2){
              if (
bitRead(buf[0],7) == 0) {bitWrite(DATA[18],5,1);bitWrite(DATA[18],6,0);} 
              if (
bitRead(buf[0],7) == 1) {bitWrite(DATA[18],5,0);bitWrite(DATA[18],6,1);} 
              
Flag false;
              
Count 0;
              
Flag2 true;
              
Count2 0;
             }                               
            }
            if (
Flag2 == true){
              
Count2Count2 1;
              if (
Count2 == 14){
                  
bitWrite(DATA[18],5,0);
                  
bitWrite(DATA[18],6,0);
                  
Count2 0;
                  
Flag2 false;
                }
            }
            
          }
          if(
canId == 0x1E0)
          {
            
bitWrite(DATA[21],0,bitRead(buf[0],5));
            
bitWrite(DATA[21],1,bitRead(buf[0],2));
            
bitWrite(DATA[21],2,bitRead(buf[1],7));
            
bitWrite(DATA[21],3,bitRead(buf[2],5));
            
bitWrite(DATA[21],4,bitRead(buf[3],7));
            
bitWrite(DATA[21],5,bitRead(buf[4],5));
          }
          if(
canId == 0x2A5 && DATA[17] == 0x02)
          {
            if (
buf[0] != && buf[1] != && buf[2] != && buf[3] != && buf[4] != && buf[5] != && buf[6] != && buf[7] != && buf[8] != 0){
            for(
int i 22i<=29i++) DATA[i] = buf[i-22];}
            else
            {
DATA[22] = 0x20;DATA[23] = 0x4E;DATA[24] = 0x4F;DATA[25] = 0x20;
            
DATA[26] = 0x52;DATA[27] = 0x44;DATA[28] = 0x53;DATA[29] = 0x00;}
          }
          if(
canId == 0x365 && DATA[17] == 0x03DATA[20] = buf[0];            
          if(
canId == 0x3A5 && DATA[17] == 0x03)
          {
            if (
buf[3] == 255 && buf[4] == 127){
            
DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}
            else {
            
converter(buf[0]);
            
DATA[22] = digit1;
            
DATA[23] = digit2;
            
DATA[24] = 0x2D;
            
converter(buf[3]);
            
DATA[25] = digit1;
            
DATA[26] = digit2;
            
DATA[27] = 0x3A;
            
converter(buf[4]);
            
DATA[28] = digit1;
            
DATA[29] = digit2;
            }  
          }
if (
DATA[17] == 0x04) {
          if(
canId == 0x162DATA[19] = buf[3];
          if(
canId == 0x1A2DATA[20] = buf[0];
          if(
canId == 0x1E2)
          {
            if (
buf[3] == 255 && buf[4] == 127){
            
DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}
            else {
            
converter(buf[0]);
            
DATA[22] = digit1;
            
DATA[23] = digit2;
            
DATA[24] = 0x2D;
            
converter(buf[3]);
            
DATA[25] = digit1;
            
DATA[26] = digit2;
            
DATA[27] = 0x3A;
            
converter(buf[4]);
            
DATA[28] = digit1;
            
DATA[29] = digit2;
            }
          }
}

if(
canId == 0x265) {
bitWrite(DATA[21],6,bitRead(buf[0],4));
bitWrite(DATA[30],0,bitRead(buf[1],7));
bitWrite(DATA[30],1,bitRead(buf[1],6));
bitWrite(DATA[30],2,bitRead(buf[1],5));
bitWrite(DATA[30],3,bitRead(buf[0],5));
bitWrite(DATA[30],4,bitRead(buf[0],2));
DATA[32] = buf[2];
DATA[33] = buf[3];
}

          if(
canId == 0x21F)
          {
          
bitWrite(DATA[34],0,bitRead(buf[0],7));
          
bitWrite(DATA[34],1,bitRead(buf[0],6));
          if(
bitRead(buf[0],3) == && bitRead(buf[0],2) == 1bitWrite(DATA[34],2,1); else bitWrite(DATA[34],2,0);
          if(
bitRead(buf[0],3) == && bitRead(buf[0],2) == 0bitWrite(DATA[34],3,1); else bitWrite(DATA[34],3,0);
          if(
bitRead(buf[0],2) == && bitRead(buf[0],3) == 0bitWrite(DATA[34],4,1); else bitWrite(DATA[34],4,0);
          
bitWrite(DATA[34],5,bitRead(buf[0],1));
          
DATA[37] = buf[1];
          }

          if(
canId == 0x3E5)
          {
          
bitWrite(DATA[34],6,(bitRead(buf[0],6)));
          
bitWrite(DATA[34],7,(bitRead(buf[0],4)));
          
bitWrite(DATA[35],0,(bitRead(buf[0],0)));
          
bitWrite(DATA[35],1,(bitRead(buf[1],6)));
          
bitWrite(DATA[35],2,(bitRead(buf[1],4)));
          
bitWrite(DATA[35],3,(bitRead(buf[1],0)));
          
bitWrite(DATA[35],4,(bitRead(buf[2],6)));
          
bitWrite(DATA[35],5,(bitRead(buf[2],4)));
          
bitWrite(DATA[35],6,(bitRead(buf[2],2)));
          
bitWrite(DATA[35],7,(bitRead(buf[5],6)));
          
bitWrite(DATA[36],0,(bitRead(buf[5],4)));
          
bitWrite(DATA[36],1,(bitRead(buf[5],2)));
          
bitWrite(DATA[36],2,(bitRead(buf[5],0)));
          }
  }


//delay(2); //Не знаю зачем, но без этого и со строкой выше высыпается каша!
arrcmp memcmp(DATA,DATA2,161);
if ((
millis() - time0) > 100 && arrcmp != 0){
  
Serial.write(DATA161);
  
memcpy(DATA2,DATA,161);
  
time0 millis();}  
}

void converter(int inpint){
              if (
inpint 10){
                
digit1 48;
                
digit2 inpint 48;
              }
              else{
                if (
inpint 89) {digit1 48digit2 inpint 42;}
                else if (
inpint 79) {digit1 48digit2 inpint 32;}
                     else if (
inpint 69) {digit1 48digit2 inpint 22;}
                          else if (
inpint 59) {digit1 48digit2 inpint 12;}
                               else if (
inpint 49) {digit1 48digit2 inpint 2;}
                                    else if (
inpint 39) {digit1 48digit2 inpint 8;}
                                         else if (
inpint 29) {digit1 48digit2 inpint 18;}
                                              else if (
inpint 19) {digit1 48digit2 inpint 28;}
                                                   else if (
inpint 9) {digit1 48digit2 inpint 38;}
              }
}

void multiframef(){
              if (
LengthP 7)
              {
                for (
int i=07;i++) MULTIFRAMETMP[DataBufSize] = buf[i+1];
                
DataBufSize DataBufSize 7;
                
LengthP LengthP 7;
              }
              else{
                for (
int i=0LengthP;i++) MULTIFRAMETMP[DataBufSize] = buf[i+1];
                
LengthP 0;
              }
}

void multiframeRF(){
              if (
LengthR 7)
              {
                for (
int i=07;i++) DATA[DataBufSizeR] = buf[i+1];
                
DataBufSizeR DataBufSizeR 7;
                
LengthR LengthR 7;
              }
              else{
                for (
int i=0LengthR;i++) DATA[DataBufSizeR] = buf[i+1];
                
LengthR 0;
              }




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

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