Содержимое переменной как указатель на функцию.

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

sadman41, ну почему вы стребетесь. Вот есть скалярная и векторная графика. Если скалярная это блок переменных, то векторное это передача изображения через макросы, о которых говорил выше.

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

//Но зато новый полет мысли в ардуиностроении.

У Вас полеты мысли ради полетов мысли :) 

KISS (акроним для «Keep it simple, stupid») — принцип проектирования, принятый в ВМС США в 1960[1][2]. Принцип KISS утверждает, что большинство систем работают лучше всего, если они остаются простыми, а не усложняются. Поэтому в области проектирования простота должна быть одной из ключевых целей, и следует избегать ненужной сложности. 

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

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

"если из чемоданчика мастера выложить часть инструментов, его работа лучше не станет". 

Если чемоданчик без ущерба для функциональности будет легче, мастер будет меньше уставать, и повысится производительность его труда.

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

qwone пишет:

Вот есть скалярная и векторная графика.

А что такое скалярная графика?

И почему она скалярная?

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

Logik пишет:
У Вас полеты мысли ради полетов мысли :)

Все сложности системы надо прятать во внутрь. Снаружи системы должны выглядить просто.

enum {
  imEnd = 0, /*конец блока*/
  imColor,/*выбор цвета*/
  imPen,/*выбор карандаша*/
  imRectangle,/*нарисовать квадрат*/
  imCur,/*установка курсора*/
  imText/*текст*/
};
const byte  image1[] PROGMEM= {
  imColor, 0,/*установить цвет поля 0*/
  imPen, 7,/*установить цвет карандаша 7*/
  imRectangle, 0, 0, 100, 20,/*нарисовать прямоугольник (0,0)-(100,20)*/
  imCur, 0, 0,/*курсор в 0,0*/
  imText, 'H', 'E', 'L', 'L', 'O', 'W', 0 ,/*написать текст Hellow*/
  imEnd/*конец*/
};

 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Благодарю за разъяснение. Поясняю. Да, мне удобнее предавать команды текстом. Как на управляемых свичах вроде dell или cisco. Понравилось как там реализовано.

Здесь так же есть плюс в понятности ввода-вывода. Тоесть если кодом отправлять специальные байты, или код вроде 018\n который заставит модуль перезагрузится. То при разработкие клиент-серверной части, логировании событий, опросов, скриптовании я измучаюсь помнить все их, более того делать прослойку между своим легким протоколом и человекопонятным, для того чтобы одна команда скажем идущая от веб сервера с кнопочки веб панели reboot несла в себе байты нужной команды - не особо хочется.
А простым reboot или getTemperature, мне будет с обоих сторон не то что понятно где зачем и почему, но и назвав имя исполняемой функции в качестве передающего параметра кажется проще.

Я поразмыслю и над вашим вариантом. Судя по описанию он должен быть легким. Вот только я на таком уровне что я не совсем понял про send() это из консоли или это составляющая команды. Ну есть такое некоторые люди могут по другому представлять.

Я продумал стиль общения arduino на mega328 и arduino на esp8266 котрый по идее должен быть в симбиозе с первым. И вот как идеалист хотел бы придерживаться того стиля который пришел мне в голову. А между прочим этот проект жуется в голове не один месяц и даже не пол года. Когда додумал структуру, схватился за написание так называемого движка, и тут бац, а чего это мы пишем кучу if-ов... непорядок.

А может я просто уперся и хочу текстовые команды тупо из принципа своей типагениальности))

которые в последствии при разросшемся функционале соберутся в памяти и проведут митинг куда утекут все 2 кило байтиков озу, а я в свое время буду вынужден упростить задачу МК. Уж незнаю

 

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

sadman41 пишет:

Предлагаю на вход ардуине передавать инструкции честного Си. Это достаточно концептуально?

Зачем, С? Я ж писал в #17, что-нибудь вроде Forth - интерпретатор маленький, всё дёшево и сердито. Можно удалённо загружить полноценные программы.

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

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

Зачем, С? Я ж писал в #17, что-нибудь вроде Forth - интерпретатор маленький, всё дёшево и сердито. Можно удалённо загружить полноценные программы.

Так видимо этот вариант не подошёл, я предлагаю альтернативу.

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

qwone пишет:

sadman41, ну почему вы стребетесь.

Даже и не думал. Сам неоднократно перелопачивал свой код в поисках оптимального (с точки зрения ресурсов и моего субъективизма) решения. Зачастую выигрывал простой if() (даже у switch-a). Но, безусловно, что для принятия взвешенного решения нужно составить точное ТЗ, реализовать его несколькими способами, произвести замеры. Иначе всё это просто трёп и маниловщина начальной стадии.

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

UserDead пишет:

 я не совсем понял про send() это из консоли или это составляющая команды. Ну есть такое некоторые люди могут по другому представлять.

Пока это чисто абстрактная функция осуществляющая отправку ))) А Вы уж сами её конкретизируете задав канал,  формат и пр..

UserDead пишет:

А может я просто уперся и хочу текстовые команды тупо из принципа своей типагениальности))

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

boolean ExecAT(char* pInpStr, byte currchar, sEventsMap *em)
{
      sEventsMap *e=em;

      for(;e->Name;e++)
      {
        if(!memcmp(e->Name,pInpStr+currchar,strlen(e->Name)))
        {
         if(e->Event)
         {
           char *p=InpStr;
           if(e==em)
             pInpStr[currchar]=0; //если ОК - удаляем его
           else
             p+=strlen(e->Name); 
  
            e->Event(p);
         }
         return true;
       }
      }
  return false;  
}

Некоторое усложнение вызывает три момента: возможность появления команды не в начале строки (отсюда эти pInpStr+currchar), желание передать в вызываемую функцию указатель на строку (там могут быть параметры) и возможность игнорить ОК (условие  if(e==em)) . Первое и второе Вам может пригодится.

ПС. сижу втыкаю, почему p+=strlen(e->Name); а не p+=strlen(e->Name)+currchar. Наверно это бага. Скорей всего случай когда команды не в начале строки и есть параметры одновременно не встречались и она не проявилась. Теорема о том что в любом коде есть бага снова доказана )))