здравствуйте!
принимаю с помощью http запроса картинку, отправляю обрабатывать в pngle, а выводит, во-первых, что-то другое, во-вторых, не понимаю как совместить pngle и epd_driver, чтобы отрисовало правильно
буду благодарна за советы!
#include <HTTPClient.h>
#include <Arduino.h>
#include "epd_driver.h"
#include "font/firasans.h"
#include <SPI.h>
#include "FS.h"
#include "SD.h"
#include <ArduinoJson.h>
#include "time.h"
#include "sntp.h"
#include "pngle.h"
#define WIFI_SSID ""
#define WIFI_PASS ""
char time_buf[128];
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = 21600;
const int daylightOffset_sec = 3600;
bool g;
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
strftime(time_buf, sizeof(time_buf), "%A, %B %d %Y %H:%M:%S", &timeinfo);
}
// Callback function (get's called when time adjusts via NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
epd_init();
epd_poweron();
epd_clear();
int cursor_x = 200;
int cursor_y = 250;
char *string1 = "Welcome!";
writeln((GFXfont *)&FiraSans, string1, &cursor_x, &cursor_y, NULL);
delay(10);
epd_clear();
sntp_set_time_sync_notification_cb( timeavailable );
sntp_servermode_dhcp(1);
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
//tft.printf("WiFi connected.\n");
}
double g_scale = 1.0;
Rect_t area;
// pngle callback, called during decode process for each pixel
void pngle_on_draw(pngle_t *pngle, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint8_t rgba[4])
{
Rect_t area = {
.x = x,
.y = y,
.width = w,
.height = h,
};
if (rgba[0]==255 && rgba[1]==255 && rgba[2]==255){
epd_push_pixels(area, 100, 0);
}
else{
epd_push_pixels(area, 100, 0);
}
}
bool load(const char *url, double scale = 1.0)
{
HTTPClient http;
http.begin(url);
// int cursor_x = 200;
// int cursor_y = 250;
int httpCode = http.GET();
if (httpCode != HTTP_CODE_OK) {
http.end();
return false;
}
int total = http.getSize();
WiFiClient *stream = http.getStreamPtr();
const String& Data = http.getString();
DynamicJsonDocument parsed(500); //Пул памяти
// Десериализация документа JSON
DeserializationError error = deserializeJson(parsed, Data);
//delay(1000);
// Проверьте, удастся ли выполнить синтаксический анализ.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
}
else { //Вывести если ошибок нет
Serial.println("There are no errors");
delay(1000);
}
int arraySize = parsed["count"];
Serial.println(arraySize);
uint8_t dm_data[arraySize];
for (int i = 0; i< arraySize; i++){
dm_data[i] = parsed["st"][i];
Serial.println(dm_data[i]);
}
Serial.print("Data: ");
Serial.println(Data);
return true;
http.end();
}
// ===================================================
bool load_png(const char *url, double scale = 1.0)
{
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if (httpCode != HTTP_CODE_OK) {
http.end();
return false;
}
int total = http.getSize();
Serial.printf("TOTAL: %d\n", total);
WiFiClient *stream = http.getStreamPtr();
epd_poweron();
pngle_t *pngle = pngle_new();
pngle_set_draw_callback(pngle, pngle_on_draw);
g_scale = scale;
uint8_t buf[2048];
int remain = 0;
uint32_t timeout = millis();
while (http.connected() && (total > 0 || remain > 0)) {
// Break out of loop after 10s
if ((millis() - timeout) > 10000UL)
{
Serial.printf("HTTP request timeout\n");
break;
}
size_t size = stream->available();
if (!size) { delay(1); continue; }
if (size > sizeof(buf) - remain) {
size = sizeof(buf) - remain;
}
int len = stream->readBytes(buf + remain, size);
if (len > 0) {
int fed = pngle_feed(pngle, buf, remain + len);
if (fed < 0) {
Serial.printf("ERROR: %s\n", pngle_error(pngle));
break;
}
total -= len;
remain = remain + len - fed;
if (remain > 0) memmove(buf, buf + fed, remain);
} else {
delay(1);
}
}
uint32_t wi = pngle_get_width(pngle);
Serial.println("WIDTH " + String(wi));
pngle_destroy(pngle);
http.end();
return true;
}
void loop()
{
g = load("http://192.168.0.17:8888/?55.0&85.9&meta");
if (g){
load_png("http://192.168.0.17:8888/?55.0&85.9&data");
}
delay(5000);
}