Web-свалка на RTL871x

Elik

New member
Возможно, но несколько позже.
Данная Web-свалка пока не доросла до этого :) Она пока в зародыше и не умеет делать многое оптимально и без ошибок. :)
Основные причины - там винегрет из разных SDK и включенные туда примеры не состыкованы... Пробита тропинка только для работы основного кода web...
Т.е. не для раздела "Для начинающих" - если им дать возможность собрать и прошить по одной кнопке, то будет масса не нужных на данном этапе вопросов (подобных, разбираемым выше на этой странице - почему варнинги не такие, почему не собирается пример, почему в том углу пишет что-то и т.д.).
Я думал с этого и надо было начинать проект, сделать его легкопрошиваемым и с автоматическим обновлением, а далее править ошибки и вносить дополнения - приятный сюрприз для юзеров....
Так как прошить модуль, пошагово, не надо в первый пост, давайте сюда раз такое дело... интересно поюзать, может что то новое, полезное (кроме идеи выше) и я внесу в проект... Могу конечно бегать по темам и гуглу и самому найти как, через что, откуда, по какой команде и адресу, но вы ведь уже делаете, вам поделиться уже имеющимся опытом легче легкого...
 

pvvx

Активный участник сообщества
Я думал с этого и надо было начинать проект, сделать его легкопрошиваемым и с автоматическим обновлением, а далее править ошибки и вносить дополнения - приятный сюрприз для юзеров....
Так как прошить модуль, пошагово, не надо в первый пост, давайте сюда раз такое дело... интересно поюзать, может что то новое, полезное (кроме идеи выше) и я внесу в проект... Могу конечно бегать по темам и гуглу и самому найти как, через что, откуда, по какой команде и адресу, но вы ведь уже делаете, вам поделиться уже имеющимся опытом легче легкого...
Просто слишком сложно описать, если пользователю не понятно, что надо в Eclipse нажать одну из кнопок, для выбора, что пожелает прошить:
Снимок1605.gif
Придется описывать, что такое Windows, как её установить на компьютер и какие проблемы бывают... Что такое MinGW, какие разновидности у него бывают... Как экспортировать проект в Eclipse...
Так-же для GCC и сторонних утилит программаторов, включая, что данная версия поддерживает STLink->Jlink, DAP-Link и прочие типы программаторов, подходящих для RTL модулей и у них тоже есть разные опции, как и опции в make проекта для выбора типов программаторов...
В итого тема будет не о Web-cвалке, а о об указанном в абзацах выше.
 
Последнее редактирование:

Elik

New member
Просто слишком сложно описать, если пользователю не понятно, что надо в Eclipse нажать одну из кнопок, для выбора, что пожелает прошить:
Посмотреть вложение 4658
Придется описывать, что такое Windows, как её установить на компьютер и какие проблемы бывают... Что такое MinGW, какие разновидности у него бывают... Как экспортировать проект в Eclipse...
Так-же для GCC и сторонних утилит программаторов, включая, что данная версия поддерживает STLink->Jlink, DAP-Link и прочие типы программаторов, подходящих для RTL модулей и у них тоже есть разные опции, как и опции в make проекта для выбора типов программаторов...
В итого тема будет не о Web-cвалке, а о об указанном в абзацах выше.
Можно было без сарказма все это изложить )))
Подскажите как ресетнуть модуль через вебинтерфейс? Ах нашел....debug and test....
спасибо ;)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Можно было без сарказма все это изложить )))
Подскажите как ресетнуть модуль через вебинтерфейс? Ах нашел....debug and test....
спасибо ;)
deep_sleep на страничке не работает - не даны права (в HTM не указан запрос пароля для выполнения данной команды) :p
Тесты запросов к web и websocket пока производятся сторонними HTM, расположенными на компе...
 

Elik

New member
deep_sleep на страничке не работает - не даны права (в HTM не указан запрос пароля для выполнения данной команды) :p
Тесты запросов к web и websocket пока производятся сторонними HTM, расположенными на компе...
Еще такой вопрос посылаю через UART данные, но так кажись ограничение на размер? 100-120 символов свободно проходит, а воть больше - начинает тормозить?
 

pvvx

Активный участник сообщества
Еще такой вопрос посылаю через UART данные, но так кажись ограничение на размер? 100-120 символов свободно проходит, а воть больше - начинает тормозить?
В cоnsole ограничено, т.к. используются функции ROM-BIOS и её сегменты data/rodata/bss в RAM. Там выделено всего в UART_LOG_BUF UartLogBuf ... u8 UARTLogBuf[127]; //record the input command.
Как и u8 UartLogHistoryBuf[5][127];
rtl_printf и DiagPrintf (второй в ROM) тоже имеют ограничения заданные областью, распределяемую странслированной в ROM частью (и ограниченную) init_rom_libgloss_ram_map() от стандартных библиотек СИ по жестким адресам.
Если эти функции printf не устраивают, то используйте включение стандартных либ СИ (USE_GCC_LIB), а для console пользуйте полные контроллеры UART, т.к. кроме ограничения в ROM-BIOS у logUART не выставляются стандартные скорости 9600, ... и выбрана 38400 по причине наименьшей ошибки. В остальных скоростях стандартного ряда слишком большая ошибка - logUART это сильно урезанный контроллер UART и годится только для лога.
 
Последнее редактирование:

Elik

New member
В cоnsole ограничено, т.к. используются функции ROM-BIOS и её сегменты data/rodata/bss в RAM. Там выделено всего в UART_LOG_BUF UartLogBuf ... u8 UARTLogBuf[127]; //record the input command.
Как и u8 UartLogHistoryBuf[5][127];
rtl_printf и DiagPrintf (второй в ROM) тоже имеют ограничения заданные областью, распределяемую странслированной в ROM частью (и ограниченную) init_rom_libgloss_ram_map() от стандартных библиотек СИ по жестким адресам.
Если эти функции printf не устраивают, то используйте включение стандартных либ СИ (USE_GCC_LIB), а для console пользуйте полные контроллеры UART, т.к. кроме ограничения в ROM-BIOS у logUART не выставляются стандартные скорости 9600, ... (очень большая ошибка - logUART это сильно урезанный контроллер UART и годится только для лога)
Блин прошу прощения, но я писал по ESP8266... там те же ограничения? можно как то этот буфер увеличить в 3 раза?
 

pvvx

Активный участник сообщества
Блин прошу прощения, но я писал по ESP8266... там те же ограничения?
У ESP8266 вход RX в консоли вообще не задействован. Если же его активизировать и оставить обслуживать функциями ROM, то любой чих на пине RX приведет к перезагрузке...
Встроенный Printf так-же ограничен и ещё жестче по размеру, как и вообще весь стек CPU...
можно как то этот буфер увеличить в 3 раза?
Можно переназначить в другой участок памяти, переписать функции ROM в свои ... и памяти у малых RTL будет совсем ёк :)

В базовой SDK, с примерами "AT" ограничение в 127 символов частично снимается путем переливания в другой буфер... что отъедает ещё 4 килобайта :)
А в базе у SDK //LOG_SERVICE_BUFLEN: default, only 63 bytes could be used for keeping input cmd, the last byte is for string end ('\0').

По многим причинам "AT" и прочие протоколы переводят на 3 других полноценных встроенных контроллера UART в RTL-ах. Там ограничений у их дров и аппаратной части нет.
 
Последнее редактирование:

Elik

New member
У ESP8266 вход RX в консоли вообще не задействован. Если же его активизировать и оставить обслуживать функциями ROM, то любой чих на пине RX приведет к перезагрузке...
Встроенный Printf так-же ограничен и ещё жестче по размеру, как и вообще весь стек CPU...

Можно переназначить в другой участок памяти, переписать функции ROM в свои ... и памяти у малых RTL будет совсем ёк :)

В базовой SDK, с примерами "AT" ограничение в 127 символов частично снимается путем переливания в другой буфер... что отъедает ещё 4 килобайта :)
А в базе у SDK //LOG_SERVICE_BUFLEN: default, only 63 bytes could be used for keeping input cmd, the last byte is for string end ('\0').
Наверное я не так обяснил суть проблемы:
В UART ESP8266 (наверное в RTL будет также) посылаются данные, которые считываются с файла test.xml
<response>
<date0>~sys_ram0x60000000~</date0>
<date1>~sys_ram0x60000000~</date1>...
...
</response>

скриптом, и этих переменных свободно считывается определенное количество (где то 95 символов в формате web.cgi?sys_ram0x60000000=0x), далее начинаются тормоза, почему?
 

pvvx

Активный участник сообщества
Наверное я не так обяснил суть проблемы:
В UART ESP8266 (наверное в RTL будет также) посылаются данные, которые считываются с файла test.xml
<response>
<date0>~sys_ram0x60000000~</date0>
<date1>~sys_ram0x60000000~</date1>...
...
</response>

скриптом, и этих переменных свободно считывается определенное количество (где то 95 символов в формате web.cgi?sys_ram0x60000000=0x), далее начинаются тормоза, почему?
Кол-во переменных в скопе или длина описания одной переменной?
Для всей строки web.cgi? ... ограничения к нескольким килобайтам, больше чем у Windows Эксплорера на PC.

При отправке запроса http : // …. разные типы эксполреров по разному формируют пакеты TCP. Например виндовый эксплорер смотрит какая по цепи сети длина MSS до данного сервера и бьет заголовок на N-ое количество пакетов. Хром так не поступает, а просто лепит разбивку на максимум MSS, описанную в TCP стеке. В один MSS у эксплореров лезут практически только их данные, прикрученные к запросу. Т.е. при длинной строке URL выходит не один пакет а несколько…
Web-свалка жрет заголовок HTTP и запрос, переданный практически по одному байту в пакете. Можно в терминале настучать "GET /... " передаваемый посимвольно в каждом пакетике TCP...

Про это? :)

paradigm.ru/2007-12-19_url-max-length.md at master · dreikanter/paradigm.ru · GitHub

PS: Передачи данных для UART через HTTP и окружение в web-свалке никогда не будет. Web является многопользовательским, а UART нет и при таких обстоятельствах требует применения протоколов разбивки на пакеты и привязки к запросам-ответам, арбитража и согласования скоростей (uart 9600 - WiFi TCP - более 18 мегабит - где взять буфер на все случаи?), на которых не существует стандартов. Т.е. такое пишите сами под свою задачу. Из рекомендаций только одно - Для UART в Web используйте websocket с передачей бинарных данных...
 
Последнее редактирование:

Elik

New member
Кол-во переменных в скопе или длина описания одной переменной?
Для всей строки web.cgi? ... ограничения к нескольким килобайтам, больше чем у Windows Эксплорера на PC.

При отправке запроса http : // …. разные типы эксполреров по разному формируют пакеты TCP. Например виндовый эксплорер смотрит какая по цепи сети длина MSS до данного сервера и бьет заголовок на N-ое количество пакетов. Хром так не поступает, а просто лепит разбивку на максимум MSS, описанную в TCP стеке. В один MSS у эксплореров лезут практически только их данные, прикрученные к запросу. Т.е. при длинной строке URL выходит не один пакет а несколько…
Web-свалка жрет заголовок HTTP и запрос, переданный практически по одному байту в пакете. Можно в терминале настучать "GET /... " передаваемый посимвольно в каждом пакетике TCP...

Про это? :)

paradigm.ru/2007-12-19_url-max-length.md at master · dreikanter/paradigm.ru · GitHub
Кол-во переменных в скопе или длина описания одной переменной?
Для всей строки web.cgi? ... ограничения к нескольким килобайтам, больше чем у Windows Эксплорера на PC.

При отправке запроса http : // …. разные типы эксполреров по разному формируют пакеты TCP. Например виндовый эксплорер смотрит какая по цепи сети длина MSS до данного сервера и бьет заголовок на N-ое количество пакетов. Хром так не поступает, а просто лепит разбивку на максимум MSS, описанную в TCP стеке. В один MSS у эксплореров лезут практически только их данные, прикрученные к запросу. Т.е. при длинной строке URL выходит не один пакет а несколько…
Web-свалка жрет заголовок HTTP и запрос, переданный практически по одному байту в пакете. Можно в терминале настучать "GET /... " передаваемый посимвольно в каждом пакетике TCP...

Про это? :)

paradigm.ru/2007-12-19_url-max-length.md at master · dreikanter/paradigm.ru · GitHub

PS: Передачи данных для UART через HTTP и окружение в web-свалке никогда не будет. Web является многопользовательским, а UART нет и при таких обстоятельствах требует применения протоколов разбивки на пакеты и привязки к запросам-ответам, на которых не существует стандартов. Т.е. такое пишите сами под свою задачу. Из рекомендаций только одно - Для UART в Web используйте websocket с передачей бинарных данных...
У меня почти получилось то, что я задумал!
Полноценное управление всеми пинами Ардуино МЕГА, с обратной связью!

Правдо пока что могу управлять 13ю цифровыми и 10ю аналоговыми выходами, переводить их в один из 3х режимов (INPUT, OUTPUT, INPUT_PULLUP)


Для чего это мне? просто тренируюсь, далее внедрять в свой проект умного дома.

Да можно разбивать на пакеты, далее попробую так, спасибо, а пока что научился отправлять спец символы конца одного пакета, л размере которого и говорю! походу проходит всего 8символов даты, 6 символов времени, по 4 символа на каждый из 14ти цифровых выходов (1 символ режим работы, 3 симвода управление ШИМ), и 5символов на 10 аналоговых входов, + 3 символа конца пакета, что в сумме делает 123 символа! Вероятно вы были правы на счет 127и символов!
 

Elik

New member
Удалось! Ура!
вот видео:

Особая благодарность PVVX !!!
 
Последнее редактирование:

Elik

New member
Установил Эклипс опция для разработчиков С/C++,
Установил MiniGW,
Скачал ваш репозиторий,
Сделал вот это:
Проект RTL00 - MP3 + AT

1. Клонируете в какую-то папку GitHub - pvvx/RTL00MP3: RTL00(RTL8710AF) Test MP3

2. Разворачиваете RTL00_AT.zip в другую папку.

3. Запускаете Eclipse, в ней File->Import->General->Existing Projects into Workspase->Next, указываете директорию MP3, ставите галку "Copy projects into workspase", Next

4. Опять File->Import->General->Existing Projects into Workspase->Next, указываете директорию c AT, ставите галку "Copy projects into workspase", Next

5.Отмечаете проект RTL00_AT, далее в меню Project->Properties:



Не могу найти и сделать вот это:
6. В обоих проектах проверить установку:



нет такого значка у меня...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пока с INA219 и dygraph.js выходит так (измеряет потребление самого себя с RTL8710AF):
SMPS = 1038 измерений в сек.
Кто знает, как соблюсти кратность опроса по I2C с данного датчика с его внутренним стробированием? Там вроде предел к 2*532 мкс при 12 битах. Если опрашивать чаще, то получаем 2 одинаковых замера...
 

KomX

Member
... INA219 ...
Кто знает, как соблюсти кратность опроса по I2C с данного датчика с его внутренним стробированием? Там вроде предел к 2*532 мкс при 12 битах. Если опрашивать чаще, то получаем 2 одинаковых замера...
В регистре Bus Voltage Register есть бит готовности данных CNVR. Анализируя его состояние, получайте новое значение с последующим сбросом этого бита одним из 2-х способов (см. стр. 23).
 

pvvx

Активный участник сообщества
В регистре Bus Voltage Register есть бит готовности данных CNVR. Анализируя его состояние, получайте новое значение с последующим сбросом этого бита одним из 2-х способов (см. стр. 23).
А при Hi speed она сама не тянет ready (писано SMBUS-compatible)?
 

KomX

Member
А при Hi speed она сама не тянет ready (писано SMBUS-compatible)?
Не совсем понял связь готовности данных с частотой шины и SMBUS-compatible режимом.
Там вроде предел к 2*532 мкс при 12 битах.
Предел Вы выбираете сами (установкой битов MODE в регистре конфигурации). Если Вам нужны значения тока и напряжения (MODE=3 - одноразово, MODE=7 - циклично), то "двоечка" имеет место быть, т.к. поочерёдно измеряются две шины. Если же Вам нужен только ток (MODE=1 - одноразово, MODE=5 - циклично) или только напряжение (MODE=2 - одноразово, MODE=6 - циклично), то 532-х мкс на один замер будет достаточно.
 

pvvx

Активный участник сообщества
Не совсем понял связь готовности данных с частотой шины и SMBUS-compatible режимом.
Уже посмотрел - врут, что она SMBUS-compatible :)
Нет задержки CLK:
Снимок1651.gif
Все другие микрухи с SMBUS используют притяжку CLK к GND, как READY...
Берем тот-же TI: http://www.ti.com/lit/an/slua475/slua475.pdf
Снимок1654.gif



Предел Вы выбираете сами (установкой битов MODE в регистре конфигурации). Если Вам нужны значения тока и напряжения (MODE=3 - одноразово, MODE=7 - циклично), то "двоечка" имеет место быть, т.к. поочерёдно измеряются две шины. Если же Вам нужен только ток (MODE=1 - одноразово, MODE=5 - циклично) или только напряжение (MODE=2 - одноразово, MODE=6 - циклично), то 532-х мкс на один замер будет достаточно.
Не тянет на 532 мкс -> опять обман у TI :)
Предел в циклическом опросе по таймеру со стробом 32768 Гц в режиме 12 бит вышел 936 smps (сампле пер сек).
Снимок1653.gif
Это при задании таймеру 532*2+30 us. Следующий шаг таймера (532*2 us) дает пропуски (бит 1 CNVR иногда опущен).
Снимок1655.gif
Смысла нет измерять только одну величину INA219, т.к. в RTL есть ADC на более менее 15.5 бит и к 40 кГц.
HTML:
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="dygraph.css">
    <title>Get data INA219</title>
    <script type="text/javascript" src="dygraph.js"></script>
  </head>
  <body>
    <div style="width:1000px; height:500px;">
    <div id="div_v"    style="width:100%; height:400px;"></div>
    <p style="text-align: center;">
        <input type="button" id="butOnOff" value="Stop">
        <input type="radio" name='rm1'  id="FixEnd"/>
        <label for="FixEnd">Fixed</label>
        <input type="radio" checked name='rm1' id="FixNone"/>
        <label for="FixNone">Float</label><br>
        Window: <span id='wdsize'>?</span> sec<br>
        Sample Rate: <span id='smprate'>?</span> smps
    </p>
    <div id='labdiv' style="text-align: center;"></div>
    </div>

<script type="text/javascript">
var $ = function(id) {
    return document.getElementById(id);
}
var stg = 0;
var smprate = 1819;
var smps = smprate;
var samples = 10*smprate;
var rend = 1;
var oldblkid = 0;
var rdnextflg = false;
var cur_idx = 0;
var sttim = 0;
$("butOnOff").onclick =  function() {
    if(rend) {
        rend = 0;
        $("butOnOff").value = "Run";
    } else {
        rend = 1;
        $("butOnOff").value = "Stop";
    }
}
var datau = [];
var gu;
function wsping() {
    clearTimeout(wstt);
    ws.send('ina219');
    wstt = setTimeout(wsping, 500);
}
ws = new WebSocket('ws://rtl871x0/web.cgi');
ws.binaryType = 'arraybuffer';
ws.onopen = function(){ ws.send('user=rtl871x:supervisor'); ws.send('sys_debug=0'); wstt = setTimeout(wsping, 50);};
ws.onmessage = function (event) {
    if(event.data instanceof ArrayBuffer) {
        clearTimeout(wstt);
        var wordarray = new Int16Array(event.data);
        if(wordarray.length > 2) {
            var blksz = wordarray[0];
            if(wordarray.length == blksz*2 + 2) {
                if(!sttim) {
                    sttim = new Date().getTime();
                    setInterval(function(){wsSmpRate()}, 500);
                } else {
                    var blkid = wordarray[1] & 0xFFFF;
                    if(rdnextflg) {
                        cur_idx += (blkid - oldblkid) & 0xFFFF;
                    } else rdnextflg = true;
                    oldblkid = blkid + blksz;
                    for (var i=2; i<wordarray.length; i+=2) {
                        if(rend) {
                            if(cur_idx >= samples ) datau.shift();
                            if(wordarray[i] & 2) datau.push([cur_idx/smprate, wordarray[i]*0.0005, wordarray[i+1]*0.1]);
                            else datau.push([cur_idx/smprate]);
                        }                
                        cur_idx++;
                    }
                    if(!stg) {
                        gu = new Dygraph(
                        $("div_v"),
                        datau,
                        {
                            title: 'U & I (INA219)',
                            showRangeSelector: true,
                            showRoller: true,
                            xlabel: 'T(sec)',
                            ylabel: 'U(V)',
                            y2label: 'I(mA)',
                            colors: ['rgb(51,204,204)','rgb(255,100,100)'],
                            series : { 'I': { axis: 'y2' } },
                            axes: {
                                x: {valueFormatter: function(x){return this.getLabels()[0] + ': '+ x.toPrecision(3);}},
                                y: {valueRange: [0,]},
                                y2: {valueRange: [0,]}},
                            labels: ['T', 'U', 'I'],
                            labelsDiv: $('labdiv'),
                            legend: 'always',  // "follow"
                        });
                        setInterval(function(){renderChart()}, 50);
                        stg = 1;
                    }
            }    }
            wstt = setTimeout(wsping, 40);
}    }    }
function wsSmpRate() {
    smps = cur_idx * 1000/ (new Date().getTime() - sttim);
    $('smprate').innerHTML = smps.toFixed(1);
}
var renderChart = function() {
    var dl;
    if (gu.dateWindow_) {
        dl = gu.dateWindow_[1] - gu.dateWindow_[0];
        if ($("FixEnd").checked) {
            var ls = datau.length - 1;
            gu.dateWindow_[1] = datau[ls][0];
            gu.dateWindow_[0] = datau[ls][0] - dl;
        } else if (gu.dateWindow_[0] < datau[0][0]) {
            gu.dateWindow_[0] = datau[0][0];
            gu.dateWindow_[1] = datau[0][0] + dl;
          }
    } else dl = datau.length/smprate;
    $("wdsize").innerHTML = dl.toFixed(3);
    if(rend) gu.updateOptions({'file': datau});
}
</script>
  </body>
</html>
dygraph.css и dygraph.js с сайта http://dygraphs.com/
 
Последнее редактирование:
Сверху Снизу