Всякие глупые вопросы, терзающие меня

Это оффтопик или флудилка или курилка
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Всякие глупые вопросы, терзающие меня

Post by AndreyB »

puff wrote:кстати, что делает SWAP_UINT16?
Для кого там комментарий?

Code: Select all

// http://en.wikipedia.org/wiki/Endianness

#define SWAP_UINT16(x) ((x) << 8) | ((x) >> 8)
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Всякие глупые вопросы, терзающие меня

Post by AndreyB »

Что-то я https://github.com/rusefi/rusefi/pull/411/files понять не могу

Можно русским языком нежно объяснить логику его работы? А может быть даже лучше комментарии в код по-английски?
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

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

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

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

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

я сначала сделал раз в 0,5с, если не путаю - но оно переставало работать уже на 80км/ч
при отправке пакета раз в 0,25с оно работало на 185км/ч по датчику, а уже на 190км/ч по датчику скорость по одометру (сидел с секундомером) получалась около 40 км/ч (где-то в табличку себе замеры сохранял)
сейчас сделал раз в 0,15с (если ничего не путаю) - на 210км/ч вроде бы работало исправно.


итак, по самому коду:
в vehicle_speed.cpp оно в колбеке (который, как я понимаю, случается каждый импульс vss) увеличивает значение метража на пройденный за этот импульс путь.
в can_hw.cpp оно текущее значение округляет (из float в char) и отправляет раз в какое-то время в приборку, и очень может быть, что приборка отслеживает время между импульсами и скорость.

неснятые вопросы:
1. почему оно на высокой скорости по датчику скорость по одометру и секундомеру роняло в разы.
2.  чему равно (char) 255.999~ или (char)257
3. не исследовал поведение этого безобразия, если коэффициент vss изменять в разы. возможно, задержка между пакетами должна зависеть от числа импульсов на километр

PS пересчет частоты пульсов в скорость - имхо проще всего считать импульсы на метр или на километр.
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

мб так будет понятнее:
на малых скоростях второй байт пакета 1056 меняется с каждым пакетом примерно так:
1 - 1 - 2 - 2 - 3 - 4 - 5 - 6 - 7 - 8
на более высоких скоростях уже так:
1 - 5 - 10 - 16 - 23 - 29 - 37 - 48
на совсем высоких так:
50 - 80 - 115 - 155 - 210 - 10 - 65

когда значение меняется с первой сотни на вторую и на третью - одометр увеличивается (проехали очередные 100м)
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

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

ну и про чекенджин бы узнать - для чего он сейчас есть в rusefi?
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: Всякие глупые вопросы, терзающие меня

Post by andreika »

Пардон, что вмешиваюсь, если что...
puff wrote:когда значение меняется с первой сотни на вторую и на третью - одометр увеличивается (проехали очередные 100м)
Если там передаётся только один LSB (что странно само по себе!), и оно ловит переходы между сотнями, то тогда, может быть, попробовать сделать так:

Code: Select all

lastSignalTimeNt = nowNt;
engine->engineState.mazdaOdoCounter = (engine->engineState.mazdaOdoCounter + tickOdoDistance) % 200;
И ещё, лучше вместо "(char)" использовать "(uint8_t)", поскольку char может быть знаковым:

Code: Select all

txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

я не уверен насчет LSB (MSB?) - в живом логе значения менялись последовательно от 0 до 255, но и скорость автомобиля там была очень маленькая. лога с болшой скоростью у меня нет. я всего лишь повторил то, что увидел в логе - и у меня получилось.

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

имхо строчка

Code: Select all

engine->engineState.mazdaOdoCounter = (engine->engineState.mazdaOdoCounter + tickOdoDistance) % 200;
будет приводить к накоплению ошибки. когда мы делаем (char) при отсылке пакета, мы вроде как не меняем сам engineState.mazdaOdoCounter?
я думаю, правильнее там даже не

Code: Select all

engine->engineState.mazdaOdoCounter = 0 
а

Code: Select all

if ((char)(engine->engineState.mazdaOdoCounter + tickOdoDistance)> 255)) 
 engine->engineState.mazdaOdoCounter=engine->engineState.mazdaOdoCounter - 255;
engine->engineState.mazdaOdoCounter = engine->engineState.mazdaOdoCounter + tickOdoDistance;
(надо всё же понять про преобразование из float)

про "поскольку char может быть знаковым" - поподробнее бы, в чем проблема?
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: Всякие глупые вопросы, терзающие меня

Post by andreika »

puff wrote:будет приводить к накоплению ошибки.
Если mazdaOdoCounter float, то тогда лучше сделать так:

Code: Select all

engine->engineState.mazdaOdoCounter = fmodf(engine->engineState.mazdaOdoCounter + tickOdoDistance, 200.0f);
puff wrote:про "поскольку char может быть знаковым" - поподробнее бы, в чем проблема?
Проблемы нет, это просто вопрос соблюдения "type safety" - использовалось явное приведение к знаковому типу ("char"), а конечный тип был объявлен как беззнаковый ("uint8_t"). Такое поведение может вызвать предупреждение компилятора: "conversion from 'char' to 'uint8_t', signed/unsigned mismatch", и его лучше избегать.
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

да, mazdaOdoCounter имеет тип float

я не очень понимаю, почему % 200, а не % 255?
ведь в какой-то момент времени она может срабатывать при увеличении с 99 на 100. в какой-то - с 130 на 234

раскопал определение CANTxFrame в чибиос - ок. почему-то не подумал, что char - знаковый.

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

короче, про патч:
как я понял,

Code: Select all

engine->engineState.mazdaOdoCounter = fmodf(engine->engineState.mazdaOdoCounter + tickOdoDistance, 255.0f);
будет по результату как раз эквивалентом

Code: Select all

if ((char)(engine->engineState.mazdaOdoCounter + tickOdoDistance)> 255)) 
 engine->engineState.mazdaOdoCounter=engine->engineState.mazdaOdoCounter - 255;
engine->engineState.mazdaOdoCounter = engine->engineState.mazdaOdoCounter + tickOdoDistance;
только выглядит лучше и исполняться будет, вероятно, быстрее?
про
txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
не очень понятно что такое & 0xff (наверное что-то связанное со знаком?)

ну и в can_hw пакет с id1056 вроде как нужно отправлять не так часто, как пакет с Id 520 - для этого там костыль с if и еще один счетчик...

(я правильно понимаю, что в CAN ID пакета помимо самого ID ещё указывает и на его приоритет? чем меньше ID - тем важнее пакеты? или опять что-то путаю?)
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

тэкс. на эту строчку компилятор поругался:

Code: Select all

./hw_layer/can_hw.cpp:157:65: error: invalid operands of types 'float' and 'int' to binary 'operator&'
  txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
напомню, engineState.mazdaOdoCounter - float.
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: Всякие глупые вопросы, терзающие меня

Post by andreika »

puff wrote:тэкс. на эту строчку компилятор поругался:

Code: Select all

./hw_layer/can_hw.cpp:157:65: error: invalid operands of types 'float' and 'int' to binary 'operator&'
  txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
напомню, engineState.mazdaOdoCounter - float.
Да, если float, то "& 0xff" не нужно.
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

собралось без ошибок. а почему russian не примет pull request?
чтобы эти изменения внести - я запутался, как быть? алгоритм какой?
Abricos
contributor
contributor
Posts: 849
Joined: Mon Aug 18, 2014 12:32 am
Location: Carteret, NJ 07008

Re: Всякие глупые вопросы, терзающие меня

Post by Abricos »

А дата шит или pdf на эту катушку по номеру детали ???
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

катушку?
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

кстати, в одну строчку оно выглядит лаконичнее и понятнее.
но вот с выводом насчёт ресурсов я наверное поспешил. всё же, как эффективнее? или то же самое?
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: Всякие глупые вопросы, терзающие меня

Post by andreika »

puff wrote:engine->engineState.mazdaOdoCounter = fmodf(engine->engineState.mazdaOdoCounter + tickOdoDistance, 255.0f);
будет по результату как раз эквивалентом
if ((char)(engine->engineState.mazdaOdoCounter + tickOdoDistance)> 255))
engine->engineState.mazdaOdoCounter=engine->engineState.mazdaOdoCounter - 255;
engine->engineState.mazdaOdoCounter = engine->engineState.mazdaOdoCounter + tickOdoDistance;
Строго говоря, это не эквивалент. Если tickOdoDistance > 255, то код с if не выполнит задачу. К тому же, в fmodf нужно указывать 256.0f, если нужно "уместить" значение в байт.
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

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

про 256 - наверное правда.

во всём этом коммите меня смущает то, что оно используется и крутится на процессоре для всех. а по уму надо, чтобы попадало в код только если приборка от RX8.

вообще может есть смысл подумать об уходе от универсальной сборки, чтобы указывать в опциях - что именно нужно.
хотя тогда хз что будет с процессом тестирования...
User avatar
Maxi
Sr Consultant
Sr Consultant
Posts: 786
Joined: Wed Oct 23, 2013 4:25 pm

Re: Всякие глупые вопросы, терзающие меня

Post by Maxi »

Смешно читать как вы тут 2 страницы обсуждаете проблемы преобразования типов (которых вообще нет). &-0xff флоату делаете...
хотя всего лишь надо engineState.mazdaOdoCounter сделать uint16t и передавать его старшую часть сдвигом на 8 а плюсовать к нему целочисленным дискретом..
но у вас же громадье говнокода тут... 100500 не нужных никому преобразований + вагон рассеянных граблей.
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

блин. опять дяди-хулиганы в песочницу пришли :-)

но вообще крутое и экономное решение, спасибо!
остаётся правильно посчитать из float это приращение

я правильно понимаю, что
uint16t - это от 0 до 65535? что происходит если

Code: Select all

uint16t i = 65535
i++;


опять 0?

про целочисленный дискрет:

Code: Select all

float delta; // тут приращение пути за импульс в метрах
uint16t inc;
inc=(uint16t) (delta/255);  //а тут - уже целочисленное значение

ничего не путаю?
Last edited by puff on Thu May 11, 2017 12:06 pm, edited 1 time in total.
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

Abricos, я не очень понимаю - о чем ты? Ты вспомнил мои давние проблемы с модулем зажигания? я не уверен, может быть, я импульс не инвертировал на дискавери - попробую в течение месяца еще раз.
User avatar
Maxi
Sr Consultant
Sr Consultant
Posts: 786
Joined: Wed Oct 23, 2013 4:25 pm

Re: Всякие глупые вопросы, терзающие меня

Post by Maxi »

про целочисленный дискрет:

Code: Select all

float delta; // тут приращение пути за импульс в метрах
uint16t inc;
inc=(uint16t) (delta/255);  //а тут - уже целочисленное значение

ничего не путаю?
да не нужны преобразования типов - вообще не нужны.
delta - uint16t путь за импульс в метрах *256!
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

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


интересно, примет ли russian этот патч...
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: Всякие глупые вопросы, терзающие меня

Post by andreika »

Maxi wrote:Смешно читать как вы тут 2 страницы обсуждаете проблемы преобразования типов (которых вообще нет). &-0xff флоату делаете...
Преобразования типов как раз были у puff, да ещё и с floatа, как оказалось. Вот и пришлось это обсуждать - ничего не поделаешь (название темы обязывает ;))..
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

так собралось сразу и без ошибок. осталось прошиться и провериться на практике

очередные глупые вопросы:
1. при каких условиях нужно обновлять конфиг в тюнерстудии?
2. файл rusefi.ini используется только тюнерстудией?

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

у бена краснова один из последних видосов про вывод кан данных из теслы в браузер (правда, я еще не смотрел)
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

про idle.
можно вместо нынешних PE10, PE12, PE14 поставить PB10, PB15, PB14 в rover_v8? конфликтов не будет?
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

вот на этой картинке почему-то второй пин недоступен для редактирования - это что-то означает?
Image
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Всякие глупые вопросы, терзающие меня

Post by AndreyB »

Очевиднл 8 cylinders, wasted spark?
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: Всякие глупые вопросы, терзающие меня

Post by puff »

Угу, из роверовского конфигурации. Просто заметил, что все остальные редактируются, а этот - нет.

Sent from my XT1058 using Tapatalk
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Всякие глупые вопросы, терзающие меня

Post by AndreyB »

Ты меня пугаешь
5? 6? 7? 8?
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Post Reply