Arduino Mega Server

Модератор: Alex

Beer100
Сообщения: 15
Зарегистрирован: Чт мар 28, 2013 12:33 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Arduino Mega Server

Сообщение Beer100 » Пн фев 01, 2016 11:34 am

Подскажите, каковы правила подключения датчиков к конкретным пинам ардуины? Где и как в AMS настраивать эти моменты? Я так понимаю, привязку пинов к датчикам можно менять "на лету"?
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн фев 01, 2016 12:54 pm

Сейчас практически готов первый блок (долгожданной) документации и в ближайшее время он будет выложен на сайте. И посвящён этот блок как раз подключению датчиков и устройств к АМС.
Beer100
Сообщения: 15
Зарегистрирован: Чт мар 28, 2013 12:33 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Arduino Mega Server

Сообщение Beer100 » Пн фев 01, 2016 3:29 pm

Думаю, не только я буду очень этому рад!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн фев 01, 2016 4:39 pm

Думаю, не только я буду очень этому рад!
Я тоже так думаю и всем пользователям, которые умудрились работать с такой сложной системой как АМС без документации, нужно памятник поставить. :)

Но документации не было по объективной причине — это отдельный и большой труд. Теперь, постепенно, будет выкладываться документация.

Но теперь затормозится развитие АМС — я не могу делать всё и сразу. (Благо 0.14 версия очень достойная)
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino Mega Server

Сообщение Xseon » Пн фев 01, 2016 5:44 pm

Alex'y respect и просьба или вопрос...
Как правильно обработать запрос вида http://ipAMS/index.htm?rgb=1&r=10&g=110&b=100&a=40
Я при находжении command="rgb" передаю в функцию setRGBA() параметр вида 1&r=10&g=110&b=100&a=40
Вот функция установки RGB в AMS:

Код: Выделить всё

void setRGBA() {
  byte parsedParams=0;  
  int r, g, b, a;
  unsigned char* buf = new unsigned char[32];
  parameter.getBytes(buf, 32, 0);
  char* inputString = (char*)buf;
  parsedParams=0;
  char* buffer = strtok(inputString,"&");
  if(buffer!=NULL){
    for(buffer=strtok(NULL,"&"); buffer!=NULL;     buffer=strtok(NULL,"&") ) 
    {
      String buffer1= String(buffer);
      params[parsedParams].name= buffer1.substring(0,buffer1.indexOf('='));   
      params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1)); 
      parsedParams++; // отмечаем сколько удалось распарсить
    }
   } 
  r = params[0].value;
  g = params[1].value;
  b = params[2].value;
  a = params[3].value;
  color(led1, r, g, b); //Вызываем функцию установки цвета из стандартного пакета AMS
 }
Код рабочий, НО при частом обращении из вне, контроллер виснет наглухо...с чем связано понять пока не удалось...может кто чего дельного подскажет или Alex допишет сам)))
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн фев 01, 2016 6:11 pm

Если на простые вопросы есть возможность отвечать, то на анализ кода и эксперименты сейчас нет времени (может кто из мастеров или заинтересованных подскажет).

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

Установить где конкретно виснет можно поставив маркеры, выводящие сообщения в Сериал. Причина выясняется за пять минут.
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Пн фев 01, 2016 7:56 pm

Xseon писал(а):Alex'y respect и просьба или вопрос...
Как правильно обработать запрос вида http://ipAMS/index.htm?rgb=1&r=10&g=110&b=100&a=40
Я при находжении command="rgb" передаю в функцию setRGBA() параметр вида 1&r=10&g=110&b=100&a=40
Вот функция установки RGB в AMS:

Код: Выделить всё

void setRGBA() {
  byte parsedParams=0;  
  int r, g, b, a;
  unsigned char* buf = new unsigned char[32];
  parameter.getBytes(buf, 32, 0);
  char* inputString = (char*)buf;
  parsedParams=0;
  char* buffer = strtok(inputString,"&");
  if(buffer!=NULL){
    for(buffer=strtok(NULL,"&"); buffer!=NULL;     buffer=strtok(NULL,"&") ) 
    {
      String buffer1= String(buffer);
      params[parsedParams].name= buffer1.substring(0,buffer1.indexOf('='));   
      params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1)); 
      parsedParams++; // отмечаем сколько удалось распарсить
    }
   } 
  r = params[0].value;
  g = params[1].value;
  b = params[2].value;
  a = params[3].value;
  color(led1, r, g, b); //Вызываем функцию установки цвета из стандартного пакета AMS
 }
 
Код рабочий, НО при частом обращении из вне, контроллер виснет наглухо...с чем связано понять пока не удалось...может кто чего дельного подскажет или Alex допишет сам)))
1. Чем код Алекса по парсингу запросов не устроил?
2. Откуда код стащили?
3. Зачем столько указателей?
4. увидел
5. Проблема в "unsigned char* buf = new unsigned char[32];" - если не знаете, то зачем забивать кучу?
Последний раз редактировалось SPbDima Пн фев 01, 2016 8:23 pm, всего редактировалось 1 раз.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino Mega Server

Сообщение Xseon » Пн фев 01, 2016 8:08 pm

1. Если вы штатным парсингом Алекса можете распарсить несколько параметров за раз, то подскажите как, был бы очень признателен.
2. С простор интернета и переделкой под себя.
3. Можно и без них, но увеличится объем резервируемой памяти.
4. Входящий параметр штатный

Код: Выделить всё

parameter.getBytes(buf, 32, 0); // Этот штатный "parameter" типа String 
5. Я так понимаю меня спасет sizeof?
Спасибо за отклик тёска.
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Пн фев 01, 2016 8:22 pm

5. Нет, ты создал объект и его не удалил. Куча, очень опасная вещь, не надо её использовать без крайней надобности.
Код дам завтра.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino Mega Server

Сообщение Xseon » Пн фев 01, 2016 8:23 pm

Премного благодарен!
UPD Починил по наводке Димы! Действительно sizeof должным образом отрабатывает и не переполняет буффер!
Ну и рабочий код оставлю на всякий случай

Код: Выделить всё

===Объявлено снаружи===
struct port_param_t{String name; int value;};
#define MAX_PARAMS 20 // сколько параметров максимально мы умеем парсить
port_param_t params[MAX_PARAMS];
===Объявлено снаружи===
void setRGBA() {
  byte parsedParams=0;  
  int r, g, b, a;
  unsigned char* buf = new unsigned char[parameter.length()]; // С sizeof(parameter) НЕ РАБОТАЕТ!!! 
  parameter.getBytes(buf, parameter.length()); // С sizeof(parameter) НЕ РАБОТАЕТ!!! 
  char* inputString = (char*)buf;
  parsedParams=0;
  char* buffer = strtok(inputString,"&");
  if(buffer!=NULL){
    for(buffer=strtok(NULL,"&"); buffer!=NULL;     buffer=strtok(NULL,"&") ) 
    {
      String buffer1= String(buffer);
      params[parsedParams].name= buffer1.substring(0,buffer1.indexOf('='));   
      params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1)); 
      parsedParams++; // отмечаем сколько удалось распарсить
    }
    if(parsedParams>MAX_PARAMS-1)return; // больше нет места куда сохранять парсенное.
   } 
  r = params[0].value;
  g = params[1].value;
  b = params[2].value;
  a = params[3].value;
  color(led1, r, g, b);

 }
int strtoint(String str) // Процедура переобразования строки в число
{
  int tempInt;
  char rez[str.length()+1];
  str.toCharArray(rez, sizeof(rez));
  tempInt = atoi(rez);
  return tempInt;
}
 
Еще раз спасибо Диме!
Последний раз редактировалось Xseon Пн фев 01, 2016 10:25 pm, всего редактировалось 3 раза.
Ответить