Мы продолжаем рассказ о подключении интерфейса Wi-Fi к 3D принтеру MZ3D-256 начатый в статьях:

  1. 3D ПРИНТЕР И WIFI. ДОБАВЛЯЕМ БЕСПРОВОДНОЙ ИНТЕРФЕЙС УПРАВЛЕНИЯ 3D ПРИНТЕРОМ.
  2. ЛЕТАЮТ ЛИ КРОКОДИЛЫ И КАКОЕ ОТНОШЕНИЕ ЭТО ИМЕЕТ К 3D?

 На самом деле, данный документ скорее для программистсого блога, но может так случиться, что кто-то вдохновится моими предыдущими статьями и повторит мой путь, а потом - начнёт грязно ругаться, что я не предупредил, что путь-то тупиковый. Так вот, предупреждаю: путь действительно может показаться тупиковым. Да, принтер прекрасно печатает всё, но закрываем в браузере страницу принтера, а затем -открываем её заново, и головка несколько раз замирает на секунду-другую. Сие есть неприемлемо.

   Сначала кажется, что во всём виноват слабый чип ESP8266. Но ведь как-то же мы жили до исторического материализма. БКшки были ещё слабей, я уже молчу про серию КР580. И ничего, горы сворачивали! Так что давайте всё-таки разберёмся подробно, "кто, куды, чаво и как"!

   Выясняется, что если запросы идут по одиночке (например, AJAX-запросы раз в секунду), то они обслуживаются без тормозов. Если же они идут массово (страничка грузит много картинок), то вот тут-то могут быть задержки, кратные трём секундам. То есть, 3, 6 или 9 секунд. А страничка, которую нарисовал мой ребёонк, картинок грузит много (я уже молчу про пачку скриптов). При этом задержки - спонтанные, не привязаны к конкретному файлу, а сами файлы грузятся не более 0.6 секунды (это самый большой библиотечный файл jquery.js).

Wifi_part_3.png

   Ох и порылся же я в Инете. День поиска привёл к тому, что я нашёл описание точно такой же проблемы. Именно 3 секунды. Именно спонтанно. Именно для WebServer. Но там автор нашёл жутчайшее описание на сайте производителя микросхемы. Сам автор в этом описании ничего не понял, спрашивал советов у сообщества. Сообщество молчало... На самом деле, правильно делало, так как дело совершенно не в этом (ибо на сайте производителя было сказано про тормоза из-за режима SoftAP, а у нас точка доступа отключена).

   В качестве последней меры, я начал профилировать код, насколько это позволяют отладочные средства того контроллера. Профилирование, хоть и потребовало моря усилий, но принесло свои плоды. Всё то, что нашёл вышеупомянутый автор на сайте производителя чипа - не относится к делу. Разработчики чипа понятия не имеют про Arduino-подобную библиотеку, а затыки происходят в ней. Скажем, в файле Parsing.cpp, в функции

      bool ESP8266WebServer::_parseRequest(WiFiClient& client) {

   Она может подвисать на пару секунд. Откуда берётся эта пара секунд? Ну, тут всё просто. Парсер - часть класса ESP8266WebServer, он через цепочку наследований является наследником класса Stream, а у того есть функция readStringUntil. Кто знает Ардуину (ещё 3 недели назад я её не знал), тот в курсе, что там может возникнуть таймаут. В общем, анализируя этот класс, находим несколько мест, где всё может крутиться по 1-2 секунды. В сумме 3 набегает. Само собой, это происходит в исключительных ситуациях (в частности, когда к серверу стучится много запросов), но принтеру всё равно, когда бесцельно лить пластик из застрявшей головки - в исключительной или в обычной ситуации. Управление нам не возвращено, а значит, послать новую строку в COM порт мы не можем.

   Понятно, что надо делать выдачу данных в COM независимо от основного кода. Всё бы ничего, но данные для COM порта идут с SD карты. И странички в моём варианте грузились с неё. А памяти у модуля мало, кэш на несколько файлов сделать проблематично. В общем, всё плохо. Но на самом деле, на модуле есть файловая система SPIFFS. Для ESP12F размер тома может быть 1М или 3М (но тогда при размере программы более 512К, будет невозможно обновлять прошивку через Wifi). Я выбрал режим 1М, всё и так влезает. Как заливать файлы? Говорят, раньше всё было в среде разработки, но сейчас это оттуда вырезано. Я подозревал, что на C# всё может быть написано просто, но даже не думал, что настолько просто... Кладём заливаемые файлы в тот же каталог, что и EXE, а в EXE вставляем функцию такого вида:

using System.IO;

using System.Net;

private void OnUploadFiles(object sender, EventArgs e)

{

    string address = "http://"+textBox1.Text+"/";

    var files = Directory.GetFiles(Directory.GetCurrentDirectory());

    using (WebClient client = new WebClient())

    {

        foreach (var file in files)

        {

            if (!file.Contains(".exe"))

            {

                while (client.IsBusy){}

                client.UploadFile(address + "edit", file.ToString());

            }

        }

    }

}

 

   Всё. Файлы уйдут через WiFi в лучшем виде, надо только адрес правильный указать!

   Так, теперь SD у нас используется только для файлов GCode. Как мы будем читать с неё? В модуле есть RTOS, но окинув её взглядом, я немного побоялся делать отдельную задачу. Если бы ОС была мне подконтрольна, была бы полная халява. Я бы просто сделал задачу, которая подчитывала бы строчку и кидала её в COM. Кто-то может пойти этим путём. Пока в этом модуле не наша ОС,  я пошёл по пути, каким ходил до исторического материализма (скажем, во времена БКшки).

   Вводим кэш. Скажем, на 1 килобайт. В функции loop() мы его наполняем.  А когда его надо опустошать? Когда пришёл "ок" от принтера. Прекрасно, садимся на прерывание "Входящий FIFO не пуст". Если там не перевод строки, то копим строку, если перевод - обрабатываем её. Строки могут быть информационные (например, при прогреве стола раз в секунду приходит температура) или "ок". Если она информационная, то учитываем информацию. Если "ок", то посылаем очередную строчку из очереди.

   Всё стало круто, но при некоторых условиях, очередь опустошалась. Пришлось найти места в обработчике сервера, где также добавить подчитывание данных с SDшки в кэш. Но это - уже совсем для программистов...

Заключение

   "Подвисания" модуля на базе микросхемы ESP8266 говорят не о том, что это слабый модуль, а о том, что библиотеки от Arduino адаптированы к нему несколько небрежно. В принципе, для интернета вещей этой адаптации, скорее всего, должно хватить. Для 3D печати, к сожалению, малейшие "подвисания" чреваты браком. Тем не менее, при определённой доработке библиотек, трудности могут быть устранены. Экспериментально выяснено, что поиск и доработка не являются чем-то архисложным.

 

С уважением В.Ш.