Много одинаковых строк в скетче

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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



if (hand_brake_if_plus == 1) {
  if ((analogRead(HAND_BRAKE_IN) > HAND_BRAKE_ON ) && (ruchnaya_kpp == 0) ) //без ручника не делаем запуск
  {
    rucnik_OFF = 0;
    do_shutdown();
    actual_mode = 1; // заканчиваем попытки запустить движок
    left_start_try = 0; //без ручника другие попытки бесполезны
    if  (razriv == 0)
    {
      sms_esli_stoit_na_skorosti();
      razriv = 1;
    }
    return;
  }
  else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск
  {
    rucnik_OFF = 0;
    do_shutdown();
    actual_mode = 1; // заканчиваем попытки запустить движок
    left_start_try = 0; //без ручника другие попытки бесполезны
    if  (razriv == 0)
    {
      sms_esli_stoit_na_skorosti();
      razriv = 1;
    }
    return;
  }
}
else if (hand_brake_if_plus == 0) {
  if ((analogRead(HAND_BRAKE_IN) <= HAND_BRAKE_ON ) && (ruchnaya_kpp == 0)) //без ручника не делаем запуск
  {
    rucnik_OFF = 0;
    do_shutdown();
    actual_mode = 1; // заканчиваем попытки запустить движок
    left_start_try = 0; //без ручника другие попытки бесполезны
    if  (razriv == 0)
    {
      sms_esli_stoit_na_skorosti();
      razriv = 1;
    }
    return;
  }
  else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск
  {
    rucnik_OFF = 0;
    do_shutdown();
    actual_mode = 1; // заканчиваем попытки запустить движок
    left_start_try = 0; //без ручника другие попытки бесполезны
    if  (razriv == 0)
    {
      sms_esli_stoit_na_skorosti();
      razriv = 1;
    }
    return;
  }
}

я вывел одинаковые строки в отдельную функцию:

void had_brake_proverka()
{
  rucnik_OFF = 0;
  do_shutdown();
  actual_mode = 1; // заканчиваем попытки запустить движок
  left_start_try = 0; //без ручника другие попытки бесполезны
  if  (razriv == 0)
  {
    sms_esli_stoit_na_skorosti();
    razriv = 1;
  }
}
    if (hand_brake_if_plus == 1) {
      if ((analogRead(HAND_BRAKE_IN) > HAND_BRAKE_ON ) && (ruchnaya_kpp == 0) ) //без ручника не делаем запуск
      {
        had_brake_proverka();
        return;
      }
      else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск
      {
        had_brake_proverka();
        return;
      }
    }
    else if (hand_brake_if_plus == 0) {
      if ((analogRead(HAND_BRAKE_IN) <= HAND_BRAKE_ON ) && (ruchnaya_kpp == 0)) //без ручника не делаем запуск
      {
        had_brake_proverka();
        return;
      }
      else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск
      {
        had_brake_proverka();
        return;
      }
    }

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

ЗЫ: пока нашел только решенеие переносить в excel и там делать форматирование, но не очень точно он это делает, спасибо за помощь 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

просто надо добавить еще функционала, а памяти в 328 не хватает(( нужна оптимизация, пока хочу добиться вот такими сокращениями. строк кода

b707
Offline
Зарегистрирован: 26.05.2017

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

Как это можно делать автоматически - не знаю. Смотришь программу и находишь похожие куски... Сколько у вас кода-то, что вам какие-то средства нужны? В Ардуине, вроде, места немного :)

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

От кода голова закружилась.

Однако, если код повторяется и фрагменты рядом, то что мешает написать условие подлиннее, к примеру, а лишние куски почикать?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

да если бы я знал когда начинал))) да кода не много 2700 строк.

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

да вы правы... надо полностью перелопатить код... стараюсь, оптимизирую, уже почти все что надо засунул, памяти на 86% думаю прям 10-ти еще не хватит. если не оптимизировать... 

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

d13lider пишет:

да если бы я знал когда начинал))) да когда не много 2700 строк.

Обычный пусть самурая.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Мне стало любопытно.

d13lider, можно скетч полностью?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Voodoo Doll пишет:

можно скетч полностью?

не, мне стыдно))) как доделаю так и выложу)) 

b707
Offline
Зарегистрирован: 26.05.2017

d13lider пишет:

да если бы я знал когда начинал))) да когда не много 2700 строк.

что надо засунул, памяти на 86% думаю прям 10-ти еще не хватит. если не оптимизировать... 

2700 строк в Атмегу 328 - ого! Наверно это означает, что код у вас очень "рыхлый" и оптимизатор сам убирает повторы и одинаковые куски...

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

b707 пишет:

2700 строк в Атмегу 328 - ого! Наверно это означает, что код у вас очень "рыхлый" и оптимизатор сам убирает повторы и одинаковые куски...

он так умеет? а то я сжимаю ткаим образом код, и память уменьшается. да 2700 строк вместе со скобками)

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

b707 пишет:

2700 строк в Атмегу 328 - ого! Наверно это означает, что код у вас очень "рыхлый" и оптимизатор сам убирает повторы и одинаковые куски...

убрал сейчас все скобки и пробелы в экселе, получилось 1942 строки)

b707
Offline
Зарегистрирован: 26.05.2017

d13lider пишет:

убрал сейчас все скобки и пробелы в экселе, получилось 1942 строки)

ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

b707 пишет:

ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)

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

https://yadi.sk/i/OTreOL3m3YQaMc

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

А скобки с пробелами-то за что? Они .hex не увеличивают. Оптимизировать нужно именно код, а не оформление.

b707, думаю, что если прошерстить исходник ТС, то там 250 строк и останется...

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

sadman41 пишет:

А скобки с пробелами-то за что? Они .hex не увеличивают. Оптимизировать нужно именно код, а не оформление.

b707, думаю, что если прошерстить исходник ТС, то там 250 строк и останется...

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

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

Ну, положим, если весь код как в приведенном фрагменте, то треть-четверть и останется где-то. А если делать квонокод, то и половина!

b707
Offline
Зарегистрирован: 26.05.2017

d13lider пишет:

а 250 строк - это врятли, функционала много... 

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

sadman41 пишет:

Ну, положим, если весь код как в приведенном фрагменте, то треть-четверть и останется где-то. А если делать квонокод, то и половина!

процентов 10 такого кода. остальное не совпадает

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

b707 пишет:

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

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

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

b707 пишет:
если какой-то код много раз повторяется - значит надо переписывать.
В данном случае "много" == "более одного" :)

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

Мужики,

ну, бороться-то надо не со строками. Причём тут строки? У меня вот есть инклудка для делителей и количества тиков таймеров - 370 строк, и чего? Кода она не генерит вообще никакого, всё что от неё остаётся после работы препроцессора - это объявление констант типа

static const uint16_t tc1Ticks = ...;
static const uint8_t tc1Prescaler = ...;

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

И кому эти 370 строк мешают? 

 

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

b707 пишет:

ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)

Слабак :)  124264 строки по статистике гитхаба, это не считая других частей проекта.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

Мужики,

ну, бороться-то надо не со строками. Причём тут строки? У меня вот есть инклудка для делителей и количества тиков таймеров - 370 строк, и чего? Кода она не генерит вообще никакого, всё что от неё остаётся после работы препроцессора - это объявление констант типа

static const uint16_t tc1Ticks = ...;
static const uint8_t tc1Prescaler = ...;

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

И кому эти 370 строк мешают? 

 

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

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

d13lider пишет:

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

Мужики,

ну, бороться-то надо не со строками. Причём тут строки? У меня вот есть инклудка для делителей и количества тиков таймеров - 370 строк, и чего? Кода она не генерит вообще никакого, всё что от неё остаётся после работы препроцессора - это объявление констант типа

static const uint16_t tc1Ticks = ...;
static const uint8_t tc1Prescaler = ...;

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

И кому эти 370 строк мешают? 

 

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

А может проще сигнал ИВЕРТИРЕВАТЬ

ВН
Offline
Зарегистрирован: 25.02.2016

d13lider пишет:

.... допустим у машин есть 2 значения открытых дверей, на одних плюс появляется на концевике, на других минус. и вот препроцессором это никак не сделать, или я что то недопонимаю? 

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

vosara пишет:

 

А может проще сигнал ИВЕРТИРЕВАТЬ

там не жесткая 0 и 1-ца, там подается на аналоговый вход значиение 300-400 попугаев это может быть 0, а может быть и 700 это 0, как допустим чтение генератора, на некоторых машинах при заведеном двигателе не 1023 значение, диод и резистор в схеме выдает только 900 и при включеном зажигании 800, т.е. зажигание включено(двигатель заглушен) значение 800, завели двиг стало 900, но это каждая машина универсальна, на ВАЗ это значение 1023 на фольцвагене у меня 700 при заведенном, на BYD у друга при заведенном звигателе 500 и заглушенном 800. поэтому нельзя просто сигнал ИНВЕРТИРОВАТЬ

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ВН пишет:

 

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

спасибо, почитаю

 

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

d13lider пишет:

vosara пишет:

 

А может проще сигнал ИВЕРТИРЕВАТЬ

там не жесткая 0 и 1-ца, там подается на аналоговый вход значиение 300-400 попугаев это может быть 0, а может быть и 700 это 0, как допустим чтение генератора, на некоторых машинах при заведеном двигателе не 1023 значение, диод и резистор в схеме выдает только 900 и при включеном зажигании 800, т.е. зажигание включено(двигатель заглушен) значение 800, завели двиг стало 900, но это каждая машина универсальна, на ВАЗ это значение 1023 на фольцвагене у меня 700 при заведенном, на BYD у друга при заведенном звигателе 500 и заглушенном 800. поэтому нельзя просто сигнал ИНВЕРТИРОВАТЬ

Понял но Вы писали (допустим у машин есть 2 значения открытых дверей, на одних плюс появляется на концевике, на других минус.) поэтому я так и решил!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

d13lider пишет:

убрал сейчас все скобки и пробелы в экселе, получилось 1942 строки)

ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)

Да уж...

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

Вспомеил Ваш ответ "разве что при создании макета я больше времени трачу на железо, чем на софт" : http://arduino.ru/forum/obshchii/kto-s-kakoi-skorostyu-pretvoryaet-v-zhizn-proekt#comment-369645

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

Правда, для реализации проектов, как правило, используется Мега2560 или Дуэ. Иногда в одном проекте используется более одного контроллера.