From 71dc1952d198ce985c17272718f2b71d2e39e45e Mon Sep 17 00:00:00 2001 From: KafCoppelia <18231415@bjtu.edu.cn> Date: Thu, 17 Feb 2022 16:31:59 +0800 Subject: [PATCH] First version --- README.md | 13 +- WioHeweather/Free_Fonts.h | 377 ++++++++++++++++++++++++ WioHeweather/RawImage.h | 71 +++++ WioHeweather/WioHeweather.cpp | 369 ++++++++++++++++++++++++ WioHeweather/WioHeweather.h | 91 ++++++ WioHeweather/WioRealTime.cpp | 118 ++++++++ WioHeweather/WioRealTime.h | 33 +++ WioHeweather/WioTFTLCDDisplay.cpp | 396 ++++++++++++++++++++++++++ WioHeweather/WioTFTLCDDisplay.h | 26 ++ WioHeweather/keywords.txt | 15 + WioHeweather/lcd_backlight.hpp | 109 +++++++ WioHeweatherDemo/WioHeweatherDemo.ino | 162 +++++++++++ source/100.bmp | Bin 0 -> 2052 bytes source/CourierNewPS-ItalicMT-16.vlw | Bin 0 -> 9440 bytes source/CourierNewPS-ItalicMT-24.vlw | Bin 0 -> 17018 bytes source/CourierNewPSMT-24.vlw | Bin 0 -> 53799 bytes source/TimesNewRomanPSMT-16.vlw | Bin 0 -> 33512 bytes source/TimesNewRomanPSMT-24.vlw | Bin 0 -> 64507 bytes source/logo_128x128.bmp | Bin 0 -> 32772 bytes source/logo_64x64.bmp | Bin 0 -> 8196 bytes source/wi-cloud.bmp | Bin 0 -> 1804 bytes source/wi-cloudy.bmp | Bin 0 -> 1804 bytes source/wi-day-cloudy.bmp | Bin 0 -> 1804 bytes source/wi-day-sunny.bmp | Bin 0 -> 1804 bytes source/wi-dust.bmp | Bin 0 -> 1804 bytes source/wi-fog.bmp | Bin 0 -> 1804 bytes source/wi-hail.bmp | Bin 0 -> 1804 bytes source/wi-night-clear.bmp | Bin 0 -> 1804 bytes source/wi-rain.bmp | Bin 0 -> 1804 bytes source/wi-sandstorm.bmp | Bin 0 -> 1804 bytes source/wi-sleet.bmp | Bin 0 -> 1804 bytes source/wi-snow.bmp | Bin 0 -> 1804 bytes 32 files changed, 1778 insertions(+), 2 deletions(-) create mode 100644 WioHeweather/Free_Fonts.h create mode 100644 WioHeweather/RawImage.h create mode 100644 WioHeweather/WioHeweather.cpp create mode 100644 WioHeweather/WioHeweather.h create mode 100644 WioHeweather/WioRealTime.cpp create mode 100644 WioHeweather/WioRealTime.h create mode 100644 WioHeweather/WioTFTLCDDisplay.cpp create mode 100644 WioHeweather/WioTFTLCDDisplay.h create mode 100644 WioHeweather/keywords.txt create mode 100644 WioHeweather/lcd_backlight.hpp create mode 100644 WioHeweatherDemo/WioHeweatherDemo.ino create mode 100644 source/100.bmp create mode 100644 source/CourierNewPS-ItalicMT-16.vlw create mode 100644 source/CourierNewPS-ItalicMT-24.vlw create mode 100644 source/CourierNewPSMT-24.vlw create mode 100644 source/TimesNewRomanPSMT-16.vlw create mode 100644 source/TimesNewRomanPSMT-24.vlw create mode 100644 source/logo_128x128.bmp create mode 100644 source/logo_64x64.bmp create mode 100644 source/wi-cloud.bmp create mode 100644 source/wi-cloudy.bmp create mode 100644 source/wi-day-cloudy.bmp create mode 100644 source/wi-day-sunny.bmp create mode 100644 source/wi-dust.bmp create mode 100644 source/wi-fog.bmp create mode 100644 source/wi-hail.bmp create mode 100644 source/wi-night-clear.bmp create mode 100644 source/wi-rain.bmp create mode 100644 source/wi-sandstorm.bmp create mode 100644 source/wi-sleet.bmp create mode 100644 source/wi-snow.bmp diff --git a/README.md b/README.md index d61ffc5..bd656e3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ -# WioWeatherStation -Weather station based on Wio Terminal via QWeather +## Weather Station for Wio Terminal + +### Dependencies + +1. 在 `.ino`中**配置您的WIFI**(SSID + PASSWORD),所需要获取的城市**Location ID**(默认北京); +2. 需要通过TF卡导入CourierNewPS-ItalicMT-16, TimesNewRomanPSMT-24字体及主页图片,天气图标等。该项资源在 `./source `内; +3. Enjoy 😆 + +👉 AUTHOR: KafCoppelia / 葉SiR + +👉 [My CSDN](https://blog.csdn.net/weixin_46422143?spm=1000.2115.3001.5343) diff --git a/WioHeweather/Free_Fonts.h b/WioHeweather/Free_Fonts.h new file mode 100644 index 0000000..75de9b8 --- /dev/null +++ b/WioHeweather/Free_Fonts.h @@ -0,0 +1,377 @@ +// Attach this header file to your sketch to use the GFX Free Fonts. You can write +// sketches without it, but it makes referencing them easier. + +// This calls up ALL the fonts but they only get loaded if you actually +// use them in your sketch. +// +// No changes are needed to this header file unless new fonts are added to the +// library "Fonts/GFXFF" folder. +// +// To save a lot of typing long names, each font can easily be referenced in the +// sketch in three ways, either with: +// +// 1. Font file name with the & in front such as &FreeSansBoldOblique24pt7b +// an example being: +// +// tft.setFreeFont(&FreeSansBoldOblique24pt7b); +// +// 2. FF# where # is a number determined by looking at the list below +// an example being: +// +// tft.setFreeFont(FF32); +// +// 3. An abbreviation of the file name. Look at the list below to see +// the abbreviations used, for example: +// +// tft.setFreeFont(FSSBO24) +// +// Where the letters mean: +// F = Free font +// M = Mono +// SS = Sans Serif (double S to distinguish is form serif fonts) +// S = Serif +// B = Bold +// O = Oblique (letter O not zero) +// I = Italic +// # = point size, either 9, 12, 18 or 24 +// +// Setting the font to NULL will select the GLCD font: +// +// tft.setFreeFont(NULL); // Set font to GLCD + +#define LOAD_GFXFF + +#ifdef LOAD_GFXFF // Only include the fonts if LOAD_GFXFF is defined in User_Setup.h + + // Use these when printing or drawing text in GLCD and high rendering speed fonts + #define GFXFF 1 + #define GLCD 0 + #define FONT2 2 + #define FONT4 4 + #define FONT6 6 + #define FONT7 7 + #define FONT8 8 + + // Use the following when calling setFont() + // + // Reserved for GLCD font // FF0 + // + + #define TT1 &TomThumb + + #define FM9 &FreeMono9pt7b + #define FM12 &FreeMono12pt7b + #define FM18 &FreeMono18pt7b + #define FM24 &FreeMono24pt7b + + #define FMB9 &FreeMonoBold9pt7b + #define FMB12 &FreeMonoBold12pt7b + #define FMB18 &FreeMonoBold18pt7b + #define FMB24 &FreeMonoBold24pt7b + + #define FMO9 &FreeMonoOblique9pt7b + #define FMO12 &FreeMonoOblique12pt7b + #define FMO18 &FreeMonoOblique18pt7b + #define FMO24 &FreeMonoOblique24pt7b + + #define FMBO9 &FreeMonoBoldOblique9pt7b + #define FMBO12 &FreeMonoBoldOblique12pt7b + #define FMBO18 &FreeMonoBoldOblique18pt7b + #define FMBO24 &FreeMonoBoldOblique24pt7b + + #define FSS9 &FreeSans9pt7b + #define FSS12 &FreeSans12pt7b + #define FSS18 &FreeSans18pt7b + #define FSS24 &FreeSans24pt7b + + #define FSSB9 &FreeSansBold9pt7b + #define FSSB12 &FreeSansBold12pt7b + #define FSSB18 &FreeSansBold18pt7b + #define FSSB24 &FreeSansBold24pt7b + + #define FSSO9 &FreeSansOblique9pt7b + #define FSSO12 &FreeSansOblique12pt7b + #define FSSO18 &FreeSansOblique18pt7b + #define FSSO24 &FreeSansOblique24pt7b + + #define FSSBO9 &FreeSansBoldOblique9pt7b + #define FSSBO12 &FreeSansBoldOblique12pt7b + #define FSSBO18 &FreeSansBoldOblique18pt7b + #define FSSBO24 &FreeSansBoldOblique24pt7b + + #define FS9 &FreeSerif9pt7b + #define FS12 &FreeSerif12pt7b + #define FS18 &FreeSerif18pt7b + #define FS24 &FreeSerif24pt7b + + #define FSI9 &FreeSerifItalic9pt7b + #define FSI12 &FreeSerifItalic12pt7b + #define FSI19 &FreeSerifItalic18pt7b + #define FSI24 &FreeSerifItalic24pt7b + + #define FSB9 &FreeSerifBold9pt7b + #define FSB12 &FreeSerifBold12pt7b + #define FSB18 &FreeSerifBold18pt7b + #define FSB24 &FreeSerifBold24pt7b + + #define FSBI9 &FreeSerifBoldItalic9pt7b + #define FSBI12 &FreeSerifBoldItalic12pt7b + #define FSBI18 &FreeSerifBoldItalic18pt7b + #define FSBI24 &FreeSerifBoldItalic24pt7b + + #define FF0 NULL //ff0 reserved for GLCD + #define FF1 &FreeMono9pt7b + #define FF2 &FreeMono12pt7b + #define FF3 &FreeMono18pt7b + #define FF4 &FreeMono24pt7b + + #define FF5 &FreeMonoBold9pt7b + #define FF6 &FreeMonoBold12pt7b + #define FF7 &FreeMonoBold18pt7b + #define FF8 &FreeMonoBold24pt7b + + #define FF9 &FreeMonoOblique9pt7b + #define FF10 &FreeMonoOblique12pt7b + #define FF11 &FreeMonoOblique18pt7b + #define FF12 &FreeMonoOblique24pt7b + + #define FF13 &FreeMonoBoldOblique9pt7b + #define FF14 &FreeMonoBoldOblique12pt7b + #define FF15 &FreeMonoBoldOblique18pt7b + #define FF16 &FreeMonoBoldOblique24pt7b + + #define FF17 &FreeSans9pt7b + #define FF18 &FreeSans12pt7b + #define FF19 &FreeSans18pt7b + #define FF20 &FreeSans24pt7b + + #define FF21 &FreeSansBold9pt7b + #define FF22 &FreeSansBold12pt7b + #define FF23 &FreeSansBold18pt7b + #define FF24 &FreeSansBold24pt7b + + #define FF25 &FreeSansOblique9pt7b + #define FF26 &FreeSansOblique12pt7b + #define FF27 &FreeSansOblique18pt7b + #define FF28 &FreeSansOblique24pt7b + + #define FF29 &FreeSansBoldOblique9pt7b + #define FF30 &FreeSansBoldOblique12pt7b + #define FF31 &FreeSansBoldOblique18pt7b + #define FF32 &FreeSansBoldOblique24pt7b + + #define FF33 &FreeSerif9pt7b + #define FF34 &FreeSerif12pt7b + #define FF35 &FreeSerif18pt7b + #define FF36 &FreeSerif24pt7b + + #define FF37 &FreeSerifItalic9pt7b + #define FF38 &FreeSerifItalic12pt7b + #define FF39 &FreeSerifItalic18pt7b + #define FF40 &FreeSerifItalic24pt7b + + #define FF41 &FreeSerifBold9pt7b + #define FF42 &FreeSerifBold12pt7b + #define FF43 &FreeSerifBold18pt7b + #define FF44 &FreeSerifBold24pt7b + + #define FF45 &FreeSerifBoldItalic9pt7b + #define FF46 &FreeSerifBoldItalic12pt7b + #define FF47 &FreeSerifBoldItalic18pt7b + #define FF48 &FreeSerifBoldItalic24pt7b + + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // Now we define "s"tring versions for easy printing of the font name so: + // tft.println(sFF5); + // will print + // Mono bold 9 + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + #define sFF0 "GLCD" + #define sTT1 "Tom Thumb" + #define sFF1 "Mono 9" + #define sFF2 "Mono 12" + #define sFF3 "Mono 18" + #define sFF4 "Mono 24" + + #define sFF5 "Mono bold 9" + #define sFF6 "Mono bold 12" + #define sFF7 "Mono bold 18" + #define sFF8 "Mono bold 24" + + #define sFF9 "Mono oblique 9" + #define sFF10 "Mono oblique 12" + #define sFF11 "Mono oblique 18" + #define sFF12 "Mono oblique 24" + + #define sFF13 "Mono bold oblique 9" + #define sFF14 "Mono bold oblique 12" + #define sFF15 "Mono bold oblique 18" + #define sFF16 "Mono bold obl. 24" // Full text line is too big for 480 pixel wide screen + + #define sFF17 "Sans 9" + #define sFF18 "Sans 12" + #define sFF19 "Sans 18" + #define sFF20 "Sans 24" + + #define sFF21 "Sans bold 9" + #define sFF22 "Sans bold 12" + #define sFF23 "Sans bold 18" + #define sFF24 "Sans bold 24" + + #define sFF25 "Sans oblique 9" + #define sFF26 "Sans oblique 12" + #define sFF27 "Sans oblique 18" + #define sFF28 "Sans oblique 24" + + #define sFF29 "Sans bold oblique 9" + #define sFF30 "Sans bold oblique 12" + #define sFF31 "Sans bold oblique 18" + #define sFF32 "Sans bold oblique 24" + + #define sFF33 "Serif 9" + #define sFF34 "Serif 12" + #define sFF35 "Serif 18" + #define sFF36 "Serif 24" + + #define sFF37 "Serif italic 9" + #define sFF38 "Serif italic 12" + #define sFF39 "Serif italic 18" + #define sFF40 "Serif italic 24" + + #define sFF41 "Serif bold 9" + #define sFF42 "Serif bold 12" + #define sFF43 "Serif bold 18" + #define sFF44 "Serif bold 24" + + #define sFF45 "Serif bold italic 9" + #define sFF46 "Serif bold italic 12" + #define sFF47 "Serif bold italic 18" + #define sFF48 "Serif bold italic 24" + +#else // LOAD_GFXFF not defined so setup defaults to prevent error messages + + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + // Free fonts are not loaded in User_Setup.h so we must define all as font 1 + // to prevent compile error messages + // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + #define GFXFF 1 + #define GLCD 1 + #define FONT2 2 + #define FONT4 4 + #define FONT6 6 + #define FONT7 7 + #define FONT8 8 + + #define FF0 1 + #define FF1 1 + #define FF2 1 + #define FF3 1 + #define FF4 1 + #define FF5 1 + #define FF6 1 + #define FF7 1 + #define FF8 1 + #define FF9 1 + #define FF10 1 + #define FF11 1 + #define FF12 1 + #define FF13 1 + #define FF14 1 + #define FF15 1 + #define FF16 1 + #define FF17 1 + #define FF18 1 + #define FF19 1 + #define FF20 1 + #define FF21 1 + #define FF22 1 + #define FF23 1 + #define FF24 1 + #define FF25 1 + #define FF26 1 + #define FF27 1 + #define FF28 1 + #define FF29 1 + #define FF30 1 + #define FF31 1 + #define FF32 1 + #define FF33 1 + #define FF34 1 + #define FF35 1 + #define FF36 1 + #define FF37 1 + #define FF38 1 + #define FF39 1 + #define FF40 1 + #define FF41 1 + #define FF42 1 + #define FF43 1 + #define FF44 1 + #define FF45 1 + #define FF46 1 + #define FF47 1 + #define FF48 1 + + #define FM9 1 + #define FM12 1 + #define FM18 1 + #define FM24 1 + + #define FMB9 1 + #define FMB12 1 + #define FMB18 1 + #define FMB24 1 + + #define FMO9 1 + #define FMO12 1 + #define FMO18 1 + #define FMO24 1 + + #define FMBO9 1 + #define FMBO12 1 + #define FMBO18 1 + #define FMBO24 1 + + #define FSS9 1 + #define FSS12 1 + #define FSS18 1 + #define FSS24 1 + + #define FSSB9 1 + #define FSSB12 1 + #define FSSB18 1 + #define FSSB24 1 + + #define FSSO9 1 + #define FSSO12 1 + #define FSSO18 1 + #define FSSO24 1 + + #define FSSBO9 1 + #define FSSBO12 1 + #define FSSBO18 1 + #define FSSBO24 1 + + #define FS9 1 + #define FS12 1 + #define FS18 1 + #define FS24 1 + + #define FSI9 1 + #define FSI12 1 + #define FSI19 1 + #define FSI24 1 + + #define FSB9 1 + #define FSB12 1 + #define FSB18 1 + #define FSB24 1 + + #define FSBI9 1 + #define FSBI12 1 + #define FSBI18 1 + #define FSBI24 1 + +#endif // LOAD_GFXFF \ No newline at end of file diff --git a/WioHeweather/RawImage.h b/WioHeweather/RawImage.h new file mode 100644 index 0000000..fbac450 --- /dev/null +++ b/WioHeweather/RawImage.h @@ -0,0 +1,71 @@ + #pragma once +#include +#include + + +/* +USAGE: + + // when use 8bit color. + Raw8 * img8 = newImage("path to sd card image."); + + // when use 16bit color. + Raw16 * img16 = newImage("path to sd card image."); + + // do some drawing. + // img8->draw(); + + // remember release it + img8->release(); + img16->release(); + */ + +extern TFT_eSPI tft_lcd; + +template +struct RawImage{ + type * ptr(){ + return (type *)(this + 1); + } + type get(int16_t x, int16_t y){ + return this->ptr()[y * width() + x]; + } + void draw(size_t x = 0, size_t y = 0){ + tft_lcd.pushImage(x, y, width(), height(), ptr()); + } + void release(){ + delete [] this; + } + int16_t width(){ return _width; } + int16_t height(){ return _height; } +private: + int16_t _width; + int16_t _height; +}; + +typedef RawImage Raw8; +typedef RawImage Raw16; + +template +RawImage * newImage(const char * path){ + typedef RawImage raw; + File f = SD.open(path, FILE_READ); + if (!f){ + return nullptr; + } + int32_t size = f.size(); + raw * mem = (raw *)new uint8_t[size]; + if (mem == nullptr){ + return nullptr; + } + f.read(mem, size); + f.close(); + return mem; +} + +template +void drawImage(const char * path, size_t x = 0, size_t y = 0){ + auto img = newImage(path); + img->draw(x, y); + img->release(); +} diff --git a/WioHeweather/WioHeweather.cpp b/WioHeweather/WioHeweather.cpp new file mode 100644 index 0000000..3e4e0a9 --- /dev/null +++ b/WioHeweather/WioHeweather.cpp @@ -0,0 +1,369 @@ +#include +#include +#include + +bool OW_Weather::getForecast(OW_current *current, OW_forecast *forecast, String locationID, String units, String language, String api_key) +{ + this -> current = current; + this -> forecast = forecast; + + String cur_weather_url = "https://api.qweather.com/v7/weather/now?location=" + locationID + "&lang=" + language + "&key=" + api_key + "&gzip=n"; + bool result1 = parseRequest(cur_weather_url, cur_weather); + + String cur_pollution_url = "https://api.qweather.com/v7/air/now?location=" + locationID + "&lang=" + language + "&key=" + api_key + "&gzip=n"; + bool result2 = parseRequest(cur_pollution_url, cur_pollution); + + String fore_weather_url = "https://api.qweather.com/v7/weather/7d?location=" + locationID + "&lang=" + language + "&key=" + api_key + "&gzip=n"; + bool result3 = parseRequest(fore_weather_url, fore_weather); + + String fore_pollution_url = "https://api.qweather.com/v7/air/5d?location=" + locationID + "&lang=" + language + "&key=" + api_key + "&gzip=n"; + bool result4 = parseRequest(fore_pollution_url, fore_pollution); + + return result1 & result2 & result3 & result4; +} + +bool OW_Weather::parseRequest(String url, url_type type) +{ + uint32_t dt = millis(); + const char* host = "api.qweather.com"; + + if (!client.connect(host, 443)) + { + Serial.println("Connection failed!"); + return false; + } + uint32_t timeout = millis(); + + Serial.print("Sending GET request to "); Serial.print(host); Serial.println("..."); + client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); + + while (client.available() || client.connected()) + { + String line = client.readStringUntil('\n'); + if (line == "\r") + { + // Serial.println("Header end found."); + break; + } + + if ((millis() - timeout) > 5000UL) + { + Serial.println("HTTP header timeout!"); + client.stop(); + return false; + } + } + + while (client.available()) + { + stream_data += client.readStringUntil('\r'); + // Serial.println(stream_data); + break; + } + + bool result; + if (type == cur_weather) + { + result = parseCurWeatherData(stream_data); + } + else if (type == fore_weather) + { + result = parseForeWeatherData(stream_data); + } + else if (type == cur_pollution) + { + result = parseCurPollutionData(stream_data); + } + else if (type == fore_pollution) + { + result = parseForePollutionData(stream_data); + } + else + { + Serial.println("Type of data error!"); + return false; + } + + Serial.print("Done in "); Serial.print(millis()-dt); Serial.println(" ms"); + stream_data = ""; + client.stop(); + + return result; +} + +bool OW_Weather::parseCurWeatherData(String str) +{ + // String input; + StaticJsonDocument<128> filter; + filter["code"] = true; + filter["updateTime"] = true; + + JsonObject filter_now = filter.createNestedObject("now"); + filter_now["temp"] = true; + filter_now["icon"] = true; + filter_now["text"] = true; + filter_now["windScale"] = true; + filter_now["humidity"] = true; + + StaticJsonDocument<256> doc; + + DeserializationError error = deserializeJson(doc, str, DeserializationOption::Filter(filter)); + + if (error) + { + Serial.print("deserializeJson() failed: "); + Serial.println(error.c_str()); + return false; + } + + const char* code = doc["code"]; // "200" + const char* updateTime = doc["updateTime"]; // "2021-12-16T11:57+08:00" + + if (strcmp(code, "200") != 0) + { + Serial.println("Current weather request failed!"); + return false; + } + + JsonObject now = doc["now"]; + const char* now_temp = now["temp"]; // "3" + const char* now_icon = now["icon"]; // "100" + const char* now_text = now["text"]; // "Sunny" + const char* now_windScale = now["windScale"]; // "5" + const char* now_humidity = now["humidity"]; // "20" + + current -> wea_updateTime = updateTime; + current -> temp = now_temp; + current -> icon = now_icon; + current -> text = now_text; + current -> windscale = now_windScale; + current -> humidity = now_humidity; + return true; +} + +bool OW_Weather::parseForeWeatherData(String str) +{ + // String input; + StaticJsonDocument<176> filter; + filter["code"] = true; + filter["updateTime"] = true; + + JsonObject filter_daily_0 = filter["daily"].createNestedObject(); + filter_daily_0["fxDate"] = true; + filter_daily_0["tempMax"] = true; + filter_daily_0["tempMin"] = true; + filter_daily_0["iconDay"] = true; + filter_daily_0["textDay"] = true; + filter_daily_0["windScaleDay"] = true; + filter_daily_0["humidity"] = true; + + DynamicJsonDocument doc(1536); + + DeserializationError error = deserializeJson(doc, str, DeserializationOption::Filter(filter)); + + if (error) + { + Serial.print("deserializeJson() failed: "); + Serial.println(error.c_str()); + return false; + } + + const char* code = doc["code"]; // "200" + const char* updateTime = doc["updateTime"]; // "2021-12-18T10:35+08:00" + if (strcmp(code, "200") != 0) + { + Serial.println("Forecast weather request failed!"); + return false; + } + + forecast -> wea_updateTime = updateTime; + + int i = 0; + for (JsonObject daily_item : doc["daily"].as()) + { + + const char* daily_item_fxDate = daily_item["fxDate"]; // "2021-12-18", "2021-12-19", "2021-12-20", ... + const char* daily_item_tempMax = daily_item["tempMax"]; // "5", "7", "11", "10", "6", "5", "0" + const char* daily_item_tempMin = daily_item["tempMin"]; // "-7", "-5", "-4", "-5", "-4", "-5", "-7" + const char* daily_item_iconDay = daily_item["iconDay"]; // "100", "100", "100", "100", "100", "100", ... + const char* daily_item_textDay = daily_item["textDay"]; // "Sunny", "Sunny", "Sunny", "Sunny", "Sunny", ... + const char* daily_item_windScaleDay = daily_item["windScaleDay"]; // "1-2", "1-2", "1-2", "1-2", "1-2", ... + const char* daily_item_humidity = daily_item["humidity"]; // "28", "36", "36", "54", "80", "65", "63" + + if (i != 0) + { + forecast -> fxDate[i-1] = daily_item_fxDate; + forecast -> tempMax[i-1] = daily_item_tempMax; + forecast -> tempMin[i-1] = daily_item_tempMin; + forecast -> iconDay[i-1] = daily_item_iconDay; + forecast -> textDay[i-1] = daily_item_textDay; + forecast -> windscale[i-1] = daily_item_windScaleDay; + forecast -> humidity[i-1] = daily_item_humidity; + } + if (i == FORECAST_DAYS) + break; + else + i++; + } + + return true; +} + +bool OW_Weather::parseCurPollutionData(String str) +{ + // String input; + StaticJsonDocument<112> filter; + filter["code"] = true; + filter["updateTime"] = true; + + JsonObject filter_now = filter.createNestedObject("now"); + filter_now["level"] = true; + filter_now["category"] = true; + filter_now["pm10"] = true; + filter_now["pm2p5"] = true; + + StaticJsonDocument<256> doc; + + DeserializationError error = deserializeJson(doc, str, DeserializationOption::Filter(filter)); + + if (error) + { + Serial.print("deserializeJson() failed: "); + Serial.println(error.c_str()); + return false; + } + + const char* code = doc["code"]; // "200" + const char* updateTime = doc["updateTime"]; // "2021-12-15T21:59+08:00" + + if (strcmp(code, "200") != 0) + { + Serial.println("Current air pollution request failed!"); + return false; + } + + JsonObject now = doc["now"]; + const char* now_level = now["level"]; // "3" + const char* now_category = now["category"]; // "Lightly" + const char* now_pm10 = now["pm10"]; // "133" + const char* now_pm2p5 = now["pm2p5"]; // "114" + + current -> pol_updateTime = updateTime; + current -> level = now_level; + current -> category = now_category; + current -> pm10 = now_pm10; + current -> pm2p5 = now_pm2p5; + + return true; +} + +bool OW_Weather::parseForePollutionData(String str) +{ + // String input; + StaticJsonDocument<112> filter; + filter["code"] = true; + filter["updateTime"] = true; + + JsonObject filter_daily_0 = filter["daily"].createNestedObject(); + filter_daily_0["aqi"] = true; + filter_daily_0["level"] = true; + filter_daily_0["category"] = true; + + StaticJsonDocument<512> doc; + + DeserializationError error = deserializeJson(doc, str, DeserializationOption::Filter(filter)); + + if (error) + { + Serial.print("deserializeJson() failed: "); + Serial.println(error.c_str()); + return false; + } + + const char* code = doc["code"]; // "200" + const char* updateTime = doc["updateTime"]; // "2021-12-16T16:42+08:00" + + if (strcmp(code, "200") != 0) + { + Serial.println("Air pollution forecast request failed!"); + return false; + } + + forecast -> pol_updateTime = updateTime; + + int i = 0; + for (JsonObject daily_item : doc["daily"].as()) + { + const char* daily_item_aqi = daily_item["aqi"]; // "49", "50", "59", "79", "89" + const char* daily_item_level = daily_item["level"]; // "1", "1", "2", "2", "2" + const char* daily_item_category = daily_item["category"]; // "Excellent", "Excellent", "Good", "Good", ... + + if (i != 0) + { + forecast -> aqi[i-1] = daily_item_aqi; + forecast -> level[i-1] = daily_item_level; + forecast -> category[i-1] = daily_item_category; + } + if (i == FORECAST_DAYS) + break; + else + i++; + } + + return true; +} + +void OW_Weather::printCurrentWeather() +{ + Serial.println("############### Current Weather ###############"); + Serial.print("Update Time : "); Serial.println(this->current->wea_updateTime); + Serial.print("Text : "); Serial.println(this->current->text); + Serial.print("Temp : "); Serial.println(this->current->temp); + Serial.print("Humidity : "); Serial.println(this->current->humidity); + Serial.print("WindScale : "); Serial.println(this->current->windscale); + Serial.print("Icon : "); Serial.println(this->current->icon); + Serial.println("############ Current Air Pollution ############"); + Serial.print("Update Time : "); Serial.println(this->current->pol_updateTime); + Serial.print("Level : "); Serial.println(this->current->level); + Serial.print("Category : "); Serial.println(this->current->category); + Serial.print("PM2.5 : "); Serial.println(this->current->pm2p5); + Serial.print("PM10 : "); Serial.println(this->current->pm10); + Serial.println(); +} + +void OW_Weather::printForecastWeather() +{ + int i = 0; + + Serial.println("############### Forecast Weather ###############"); + Serial.print("Update Time : "); Serial.println(this->forecast->wea_updateTime); + for(i = 0; i < FORECAST_DAYS; i++) + { + Serial.print("Forecast Date : "); Serial.println(this->forecast->fxDate[i]); + Serial.print("Text : "); Serial.println(this->forecast->textDay[i]); + Serial.print("TempMax : "); Serial.println(this->forecast->tempMax[i]); + Serial.print("TempMin : "); Serial.println(this->forecast->tempMin[i]); + Serial.print("WindScale : "); Serial.println(this->forecast->windscale[i]); + Serial.print("Humidity : "); Serial.println(this->forecast->humidity[i]); + Serial.print("Icon : "); Serial.println(this->forecast->iconDay[i]); + Serial.println(); + } + Serial.println("############ Forecast Air Pollution ############"); + Serial.print("Update Time : "); Serial.println(this->forecast->pol_updateTime); + for(i = 0; i < FORECAST_DAYS; i++) + { + Serial.print("AQI : "); Serial.println(this->forecast->aqi[i]); + Serial.print("Level : "); Serial.println(this->forecast->level[i]); + Serial.print("Category : "); Serial.println(this->forecast->category[i]); + Serial.println(); + } +} + +/*************************************************************************************** +** Convert unix time to a time string +***************************************************************************************/ +String strTime(time_t unixTime) +{ + unixTime += TIME_OFFSET; + return ctime(&unixTime); +} \ No newline at end of file diff --git a/WioHeweather/WioHeweather.h b/WioHeweather/WioHeweather.h new file mode 100644 index 0000000..8d7a742 --- /dev/null +++ b/WioHeweather/WioHeweather.h @@ -0,0 +1,91 @@ +#ifndef __WIO_HEWEATHER_H__ +#define __WIO_HEWEATHER_H__ + +#include +#include + +#define FORECAST_DAYS 3 +#define TIME_OFFSET 8UL * 3600UL // UTC + 8 hour + +extern WiFiClientSecure client; +extern void InitializingDisplay(char cnt); +/*************************************************************************************** +** Description: Structure for current weather +***************************************************************************************/ +typedef struct OW_current +{ + String wea_updateTime; + String temp; + String icon; + String text; + String windscale; + String humidity; + + /* Air pollution */ + String pol_updateTime; + String level; + String category; + String pm10; + String pm2p5; + +} OW_current; + +/*************************************************************************************** +** Description: Structure for forecast weather +***************************************************************************************/ +typedef struct OW_forecast +{ + String wea_updateTime; + + String fxDate[FORECAST_DAYS]; + String tempMax[FORECAST_DAYS]; + String tempMin[FORECAST_DAYS]; + String iconDay[FORECAST_DAYS]; + String textDay[FORECAST_DAYS]; + String windscale[FORECAST_DAYS]; + String humidity[FORECAST_DAYS]; + + /* Air pollution */ + String pol_updateTime; + String aqi[FORECAST_DAYS]; + String level[FORECAST_DAYS]; + String category[FORECAST_DAYS]; + +} OW_forecast; + +typedef enum +{ + location_id = 0, + cur_weather = 1, + fore_weather = 2, + cur_pollution = 3, + fore_pollution = 4 +} url_type; + +String strTime(time_t unixTime); + +class OW_Weather +{ + public: + bool getForecast(OW_current *current, OW_forecast *forecast, String locationID, String units, String language, String api_key); + void printCurrentWeather(); + void printForecastWeather(); + + OW_current *current; // pointer provided by sketch to the OW_current struct + OW_forecast *forecast; // pointer provided by sketch to the OW_forecast struct + + private: // Streaming parser callback functions, allow tracking and decisions + bool parseRequest(String url, url_type type); + bool parseCurWeatherData(String str); + bool parseForeWeatherData(String str); + bool parseCurPollutionData(String str); + bool parseForePollutionData(String str); + + private: // Variables used internal to library + // The value storage structures are created and deleted by the sketch and + // a pointer passed via the library getForecast() call the value() function + // is then used to populate the structs with values + String stream_data; // Get the data of current weather or forecast weather int he next 5 days +}; + +#endif \ No newline at end of file diff --git a/WioHeweather/WioRealTime.cpp b/WioHeweather/WioRealTime.cpp new file mode 100644 index 0000000..80bf08a --- /dev/null +++ b/WioHeweather/WioRealTime.cpp @@ -0,0 +1,118 @@ +#include + +unsigned long RealTime_Clock::calibreTimeNow(bool needPrint) +{ + unsigned long new_devicetime = getNTPtime(); + + if (new_devicetime == 0) + { + Serial.println("Failed to get time from network time server."); + return 0; + } + + if (!rtc.begin()) + { + Serial.println("Couldn't find RTC"); + return 0; + } + + rtc.adjust(DateTime(new_devicetime)); + if (needPrint == true) + { + Serial.println("rtc time updated."); + // get and print the adjusted rtc time + now = rtc.now(); + + Serial.print("Adjusted RTC (boot) time is: "); + Serial.println(now.timestamp(DateTime::TIMESTAMP_FULL)); + } + return new_devicetime; +} + +unsigned long RealTime_Clock::getNTPtime(void) +{ + // module returns a unsigned long time valus as secs since Jan 1, 1970 + // unix time or 0 if a problem encounted + + //only send data when connected + if (WiFi.status() == WL_CONNECTED) + { + //initializes the UDP state + //This initializes the transfer buffer + udp.begin(WiFi.localIP(), localPort); + + sendNTPpacket(timeServer); // send an NTP packet to a time server + // wait to see if a reply is available + delay(100); + + if (udp.parsePacket()) + { + // Serial.println("udp packet received"); + // We've received a packet, read the data from it + udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer + + // the timestamp starts at byte 40 of the received packet and is four bytes, + // or two words, long. First, extract the two words: + + unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); + unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); + // combine the four bytes (two words) into a long integer + // this is NTP time (seconds since Jan 1 1900): + unsigned long secsSince1900 = highWord << 16 | lowWord; + // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: + const unsigned long seventyYears = 2208988800UL; + // subtract seventy years: + unsigned long epoch = secsSince1900 - seventyYears; + + // adjust time for timezone offset in secs +/- from UTC + // WA time offset from UTC is +8 hours (28,800 secs) + // + East of GMT + // - West of GMT + return epoch; + } + else + { + // were not able to parse the udp packet successfully + // clear down the udp connection + udp.stop(); + return 0; // zero indicates a failure + } + // not calling ntp time frequently, stop releases resources + udp.stop(); + } + else + { + // network not connected + Serial.println("WiFi is not connected!"); + return 0; + } +} + +// send an NTP request to the time server at the given address +unsigned long RealTime_Clock::sendNTPpacket(const char* address) +{ + // set all bytes in the buffer to 0 + for (int i = 0; i < NTP_PACKET_SIZE; ++i) + { + packetBuffer[i] = 0; + } + + // Initialize values needed to form NTP request + // (see URL above for details on the packets) + packetBuffer[0] = 0b11100011; // LI, Version, Mode + packetBuffer[1] = 0; // Stratum, or type of clock + packetBuffer[2] = 6; // Polling Interval + packetBuffer[3] = 0xEC; // Peer Clock Precision + + // 8 bytes of zero for Root Delay & Root Dispersion + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + // all NTP fields have been given values, now + // you can send a packet requesting a timestamp: + udp.beginPacket(address, 123); //NTP requests are to port 123 + udp.write(packetBuffer, NTP_PACKET_SIZE); + udp.endPacket(); +} diff --git a/WioHeweather/WioRealTime.h b/WioHeweather/WioRealTime.h new file mode 100644 index 0000000..aa0b911 --- /dev/null +++ b/WioHeweather/WioRealTime.h @@ -0,0 +1,33 @@ +#ifndef __WIO_REAL_TIME_H__ +#define __WIO_REAL_TIME_H__ + +#include +#include +#include +#include +#include + +const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message +class RealTime_Clock +{ + public: + unsigned long calibreTimeNow(bool needPrint=false); + DateTime now; + RTC_SAMD51 rtc; + + private: + unsigned long getNTPtime(void); + // send an NTP request to the time server at the given address + unsigned long sendNTPpacket(const char* address); + + // switch between local and remote time servers + // comment out to use remote server + const char *timeServer = "time.nist.gov"; // extenral NTP server e.g. time.nist.gov + unsigned int localPort = 2390; // local port to listen for UDP packets + //The udp library class + WiFiUDP udp; + byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets + millisDelay CalibreTimer; // the update delay object. used for ntp periodic update. +}; + +#endif \ No newline at end of file diff --git a/WioHeweather/WioTFTLCDDisplay.cpp b/WioHeweather/WioTFTLCDDisplay.cpp new file mode 100644 index 0000000..975acdb --- /dev/null +++ b/WioHeweather/WioTFTLCDDisplay.cpp @@ -0,0 +1,396 @@ +#include + +const char* icon_table[20][2] = +{ + {"100", "wi-day-sunny"}, + {"101", "wi-cloudy"}, + {"102", "wi-cloud"}, + {"103", "wi-day-cloudy"}, + {"104", "wi-cloud"}, + {"150", "wi-night-clear"}, + {"154", "wi-cloud"}, + {"305", "wi-rain"}, + {"306", "wi-rain"}, + {"307", "wi-rain"}, + {"399", "wi-rain"}, + {"400", "wi-snow"}, + {"401", "wi-snow"}, + {"402", "wi-snow"}, + {"404", "wi-sleet"}, + {"409", "wi-snow"}, + {"501", "wi-fog"}, + {"502", "wi-hail"}, + {"504", "wi-dust"}, + {"507", "wi-sandstorm"} +}; + +void LCD_Init(uint16_t background_color) +{ + tft_lcd.begin(); + tft_lcd.setRotation(1); + tft_lcd.fillScreen(background_color); + backLight.initialize(); + + drawImage("logo_128x128.bmp", 160-128/2, 120-128/2-20); + tft_lcd.setTextDatum(MC_DATUM); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.loadFont("CourierNewPS-ItalicMT-16"); + tft_lcd.drawString("By KafCoppelia", 160, 190); +} + +void InitializingDisplay(void) +{ + tft_lcd.loadFont("TimesNewRomanPSMT-24"); + tft_lcd.drawString("Initializing...", 160, 220); + tft_lcd.unloadFont(); +} + +bool RealTimeDisplay(unsigned long devicetime) +{ + tft_lcd.loadFont("TimesNewRomanPSMT-24"); + tft_lcd.setTextDatum(MC_DATUM); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString(strTime(devicetime), 150, 20); + tft_lcd.unloadFont(); + tft_lcd.setFreeFont(FS9); + tft_lcd.drawFastHLine(20, 40, 280, TFT_RED); +} + +bool CurrentDisplay(OW_current *current) +{ + if (!current) + { + Serial.println("Current weather data dosen't exist!"); + return false; + } + + tft_lcd.fillRect(0, 50, 320, 215, BACKGROUND_COLOR); + + int xpos, ypos; + uint16_t level_color; + xpos = 160; + ypos = 50; + + tft_lcd.setTextDatum(TC_DATUM); + tft_lcd.setFreeFont(FS9); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString(">>> Today's Weather <<<", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + tft_lcd.setFreeFont(FS9); + + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("Weather: ", xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + if (current->text != "") + tft_lcd.drawString(current->text, xpos, ypos, GFXFF); + else + tft_lcd.drawString("Cloudy", xpos, ypos, GFXFF); + + xpos = 160; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("Temp: ", xpos, ypos, GFXFF); + if ((current->temp).toInt() < 0) + tft_lcd.setTextColor(TFT_BLUE, BACKGROUND_COLOR); + else if ((current->temp).toInt() > 25) + tft_lcd.setTextColor(TFT_RED, BACKGROUND_COLOR); + else + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + + xpos += tft_lcd.drawString(current->temp, xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString(" degree", xpos, ypos, GFXFF); + + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("Humidity: ", xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(current->humidity, xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString(" %", xpos, ypos, GFXFF); + + xpos = 160; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("Wind Scale: ", xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + tft_lcd.drawString(current->windscale, xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 150; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Updated: " + (current->wea_updateTime).substring((current->wea_updateTime).length()-11, (current->wea_updateTime).length()-6), xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + tft_lcd.setFreeFont(FS9); + + ypos += tft_lcd.fontHeight(GFXFF)*1.5; + xpos = 160; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString(">>> Air Pollution <<<", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + tft_lcd.setFreeFont(FS9); + + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("Level: ", xpos, ypos, GFXFF); + + switch((current->level).toInt()) + { + case 1: level_color = TFT_GREEN;break; + case 2: level_color = TFT_YELLOW;break; + case 3: level_color = TFT_ORANGE;break; + case 4: level_color = TFT_RED;break; + case 5: level_color = TFT_PURPLE;break; + default:level_color = TFT_MAROON;break; + } + tft_lcd.setTextColor(level_color, BACKGROUND_COLOR); + tft_lcd.drawString(current->level, xpos, ypos, GFXFF); + + xpos = 160; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("Category: ", xpos, ypos, GFXFF); + tft_lcd.setTextColor(level_color, BACKGROUND_COLOR); + tft_lcd.drawString(current->category, xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 150; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Updated: " + (current->pol_updateTime).substring((current->pol_updateTime).length()-11, (current->pol_updateTime).length()-6), xpos, ypos, GFXFF); + + char* icon_pic_name = new char[40]; + int i = 0; + for (i = 0; i <= 19; i++) + { + if (strcmp(icon_table[i][0], (current->icon).c_str()) == 0) + break; + if (i == 19) + { + // Serial.println("No icon found!"); + // return false; + i = 2; // 没有图标匹配时显示云 + break; + } + } + icon_pic_name = strcpy(icon_pic_name, icon_table[i][1]); + icon_pic_name = strcat(icon_pic_name, ".bmp"); + + drawImage(icon_pic_name, 320-32, 240-32); + return true; +} + +bool ForecastDisplay(OW_forecast *forecast) +{ + if (!forecast) + { + Serial.println("Forcast info dosen't exist!"); + return false; + } + + tft_lcd.fillRect(0, 25, 320, 215, BACKGROUND_COLOR); + + int xpos, ypos; + int i; + uint16_t level_color[3]; + + xpos = 160; + ypos = 50; + tft_lcd.setTextDatum(TC_DATUM); + tft_lcd.setFreeFont(FS9); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString(">>> 3-day Forecast <<<", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Date: ", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + xpos = 100; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString((forecast->fxDate[0]).substring((forecast->fxDate[0]).length()-5, (forecast->fxDate[0]).length()), xpos, ypos, GFXFF); + xpos = 180; + tft_lcd.drawString((forecast->fxDate[1]).substring((forecast->fxDate[1]).length()-5, (forecast->fxDate[1]).length()), xpos, ypos, GFXFF); + xpos = 260; + tft_lcd.drawString((forecast->fxDate[2]).substring((forecast->fxDate[2]).length()-5, (forecast->fxDate[2]).length()), xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Main: ", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + xpos = 100; + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + tft_lcd.drawString(forecast->textDay[0], xpos, ypos, GFXFF); + xpos = 180; + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + tft_lcd.drawString(forecast->textDay[1], xpos, ypos, GFXFF); + xpos = 260; + tft_lcd.setTextColor(TFT_ORANGE, BACKGROUND_COLOR); + tft_lcd.drawString(forecast->textDay[2], xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Temp: ", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + xpos = 90; + tft_lcd.setTextColor(TFT_BLUE, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(forecast->tempMin[0], xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("~", xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_RED, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(forecast->tempMax[0], xpos, ypos, GFXFF); + + xpos = 170; + tft_lcd.setTextColor(TFT_BLUE, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(forecast->tempMin[1], xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("~", xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_RED, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(forecast->tempMax[1], xpos, ypos, GFXFF); + + xpos = 250; + tft_lcd.setTextColor(TFT_BLUE, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(forecast->tempMin[2], xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + xpos += tft_lcd.drawString("~", xpos, ypos, GFXFF); + tft_lcd.setTextColor(TFT_RED, BACKGROUND_COLOR); + xpos += tft_lcd.drawString(forecast->tempMax[2], xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 150; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Updated: " + (forecast->wea_updateTime).substring((forecast->wea_updateTime).length()-11, (forecast->pol_updateTime).length()-6), xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Level: ", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + xpos = 100; + switch((forecast->level[0]).toInt()) + { + case 1: level_color[0] = TFT_GREEN;break; + case 2: level_color[0] = TFT_YELLOW;break; + case 3: level_color[0] = TFT_ORANGE;break; + case 4: level_color[0]= TFT_RED;break; + case 5: level_color[0] = TFT_PURPLE;break; + default:level_color[0] = TFT_MAROON;break; + } + + tft_lcd.setTextColor(level_color[0], BACKGROUND_COLOR); + tft_lcd.drawString(forecast->level[0], xpos, ypos, GFXFF); + xpos = 180; + switch((forecast->level[1]).toInt()) + { + case 1: level_color[1] = TFT_GREEN;break; + case 2: level_color[1] = TFT_YELLOW;break; + case 3: level_color[1] = TFT_ORANGE;break; + case 4: level_color[1] = TFT_RED;break; + case 5: level_color[1] = TFT_PURPLE;break; + default:level_color[1] = TFT_MAROON;break; + } + + tft_lcd.setTextColor(level_color[1], BACKGROUND_COLOR); + tft_lcd.drawString(forecast->level[1], xpos, ypos, GFXFF); + xpos = 260; + switch((forecast->level[2]).toInt()) + { + case 1: level_color[2] = TFT_GREEN;break; + case 2: level_color[2] = TFT_YELLOW;break; + case 3: level_color[2] = TFT_ORANGE;break; + case 4: level_color[2] = TFT_RED;break; + case 5: level_color[2] = TFT_PURPLE;break; + default:level_color[2] = TFT_MAROON;break; + } + + tft_lcd.setTextColor(level_color[2], BACKGROUND_COLOR); + tft_lcd.drawString(forecast->level[2], xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TL_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 20; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Cate: ", xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + xpos = 100; + tft_lcd.setTextColor(level_color[0], BACKGROUND_COLOR); + tft_lcd.drawString(forecast->category[0], xpos, ypos, GFXFF); + xpos = 180; + tft_lcd.setTextColor(level_color[1], BACKGROUND_COLOR); + tft_lcd.drawString(forecast->category[1], xpos, ypos, GFXFF); + xpos = 260; + tft_lcd.setTextColor(level_color[2], BACKGROUND_COLOR); + tft_lcd.drawString(forecast->category[2], xpos, ypos, GFXFF); + + tft_lcd.setTextDatum(TC_DATUM); + ypos += tft_lcd.fontHeight(GFXFF); + xpos = 150; + tft_lcd.setTextColor(TFT_BLACK, BACKGROUND_COLOR); + tft_lcd.drawString("Updated: " + (forecast->pol_updateTime).substring((forecast->pol_updateTime).length()-11, (forecast->pol_updateTime).length()-6), xpos, ypos, GFXFF); + + return true; +} + +bool PageDisplay(int current_page) +{ + int xpos, ypos; + xpos = tft_lcd.width() / 2; + ypos = tft_lcd.height() - 15; + tft_lcd.setTextDatum(MC_DATUM); + + if (current_page == 1) + { + tft_lcd.fillCircle(xpos - 6, ypos, 4, TFT_BLACK); + tft_lcd.drawCircle(xpos + 6, ypos, 4, TFT_BLACK); + } + else if (current_page == 2) + { + tft_lcd.drawCircle(xpos - 6, ypos, 4, TFT_BLACK); + tft_lcd.fillCircle(xpos + 6, ypos, 4, TFT_BLACK); + } + else + return false; + + return true; +} + +uint8_t BacklightAdjust(int light_value) +{ + uint8_t cur_brightness; + + if (light_value <= 150) + { + cur_brightness = (uint8_t)15; + } + else if (light_value <= 300) + { + cur_brightness = (uint8_t)light_value / 10; + } + else if(light_value <= 600) + { + cur_brightness = (uint8_t)light_value / 10 + 10; + } + else + { + cur_brightness = backLight.getMaxBrightness(); + } + backLight.setBrightness(cur_brightness); + return cur_brightness; +} \ No newline at end of file diff --git a/WioHeweather/WioTFTLCDDisplay.h b/WioHeweather/WioTFTLCDDisplay.h new file mode 100644 index 0000000..d857321 --- /dev/null +++ b/WioHeweather/WioTFTLCDDisplay.h @@ -0,0 +1,26 @@ +#ifndef __WIO_TFT_LCD_DISPLAY_H__ +#define __WIO_TFT_LCD_DISPLAY_H__ + +#include +#include +#include +#include +#include "RawImage.h" +#include "lcd_backlight.hpp" +#include + +#define BACKGROUND_COLOR TFT_WHITE + +extern LCDBackLight backLight; +extern TFT_eSPI tft_lcd; +extern unsigned long devicetime; + +void LCD_Init(uint16_t background_color); +void InitializingDisplay(void); +bool RealTimeDisplay(unsigned long devicetime); +bool CurrentDisplay(OW_current *current); +bool ForecastDisplay(OW_forecast *forecast); +bool PageDisplay(int current_page); +uint8_t BacklightAdjust(int light_value); + +#endif \ No newline at end of file diff --git a/WioHeweather/keywords.txt b/WioHeweather/keywords.txt new file mode 100644 index 0000000..db50e92 --- /dev/null +++ b/WioHeweather/keywords.txt @@ -0,0 +1,15 @@ +WioHeweather KEYWORD1 +OW_Weather KEYWORD1 +OW_current KEYWORD2 +OW_forecast KEYWORD2 +getForecast KEYWORD2 + +WioRealTime KEYWORD1 +RealTime_Clock KEYWORD1 +calibreTimeNow KEYWORD2 +devicetime KEYWORD2 +rtc KEYWORD2 +now KEYWORD2 + +WioTFTLCDDisplay KEYWORD1 + diff --git a/WioHeweather/lcd_backlight.hpp b/WioHeweather/lcd_backlight.hpp new file mode 100644 index 0000000..d3eef4a --- /dev/null +++ b/WioHeweather/lcd_backlight.hpp @@ -0,0 +1,109 @@ +// Copyright 2020 Kenta IDA +// LICENSE: Boost Software License +/** + * @file lcd_backlight.hpp +*/ + +#ifndef LCD_BACKLIGHT_HPP__ +#define LCD_BACKLIGHT_HPP__ + +//#include +#include + +/** + * @brief Controls Wio Terminal LCD back light brightness + */ +class LCDBackLight +{ +private: + std::uint8_t currentBrightness = 100; + std::uint8_t maxBrightness = 100; +public: + /** + * @brief Gets current brightness + * @return current brightness. + */ + std::uint8_t getBrightness() const { return this->currentBrightness; } + /** + * @brief Gets maximum brightness + * @return maximum brightness. + */ + std::uint8_t getMaxBrightness() const { return this->maxBrightness; } + + /** + * @brief Sets brightness. + * @param [in] brightness new value of brightness. If the brightness value exceeds maximum brightness, the value will be clipped. + * + */ + void setBrightness(std::uint8_t brightness) + { + this->currentBrightness = brightness < this->maxBrightness ? brightness : this->maxBrightness; + TC0->COUNT8.CC[0].reg = this->currentBrightness; + while(TC0->COUNT8.SYNCBUSY.bit.CC0); + } + /** + * @brief Sets maximum brightness. + * @param [in] maxBrightness new value of maximum brightness. If the current brightness value exceeds maximum brightness, the current brightness will be clipped. + * + */ + void setMaxBrightness(std::uint8_t maxBrightness) + { + this->maxBrightness = maxBrightness; + if( this->currentBrightness > this->maxBrightness ) { + this->currentBrightness = this->maxBrightness; + } + TC0->COUNT8.PER.reg = this->maxBrightness; + while(TC0->COUNT8.SYNCBUSY.bit.PER); + TC0->COUNT8.CC[0].reg = this->currentBrightness; + while(TC0->COUNT8.SYNCBUSY.bit.CC0); + } + + /** + * @brief Initialize hardware/peripherals to control back light brightness. + * @remark This function must be called before using other LCDBackLight class member functions. + */ + void initialize() + { + /* Enable Peripheral Clocks */ + GCLK->PCHCTRL[9].reg = 0 | (1u<<6); // TC0, TC1 + while(!GCLK->PCHCTRL[9].bit.CHEN); + GCLK->PCHCTRL[11].reg = 0 | (1u<<6); // EVSYS[0] + while(!GCLK->PCHCTRL[11].bit.CHEN); + GCLK->PCHCTRL[33].reg = 0 | (1u<<6); // CCL + while(!GCLK->PCHCTRL[33].bit.CHEN); + /* Enable Peropheral APB Clocks */ + MCLK->APBAMASK.bit.TC0_ = 1; + MCLK->APBBMASK.bit.EVSYS_ = 1; + MCLK->APBCMASK.bit.CCL_ = 1; + + /* Configure PORT */ + PORT->Group[2].DIRSET.reg = (1<<5); + PORT->Group[2].EVCTRL.reg = 0x85; // PC05, OUT + /* Configure EVSYS */ + EVSYS->USER[1].reg = 0x01; // Channel0 -> PORT_EV0 + EVSYS->Channel[0].CHANNEL.reg = 0x74 | (0x02<<8) | (0x00<<10); // CCL_LUTOUT0, ASYNCHRONOUS, NO_EVT_OUTPUT + /* Configure CCL */ + CCL->CTRL.reg = (1<<0); // SWRST + CCL->SEQCTRL[0].reg = 0x0; // Disable SEQCTRL + CCL->LUTCTRL[0].reg = (0xaau << 24) | (1u<<22) | (0x6<<8) | (1<<1); // TRUTH=0xaa, LUTEO, INSEL0=0x06(TC), ENABLE + CCL->CTRL.reg = (1<<1); // ENABLE + + /* Configure TC0 */ + TC0->COUNT8.CTRLA.reg = (1u<<0); // SWRST; + while( TC0->COUNT8.SYNCBUSY.bit.SWRST ); + + TC0->COUNT8.CTRLA.reg = (0x01 << 2) | (0x01 << 4) | (0x04 << 8); // MODE=COUNT8, PRESCALER=DIV16, PRESCSYNC=PRESC + TC0->COUNT8.WAVE.reg = 0x02; // WAVEGEN=NPWM; + TC0->COUNT8.CTRLBSET.reg = (1u<<1); // LUPD + TC0->COUNT8.PER.reg = this->maxBrightness; + TC0->COUNT8.CC[0].reg = this->currentBrightness; + TC0->COUNT8.CC[1].reg = 0u; + TC0->COUNT8.DBGCTRL.bit.DBGRUN = 1; + TC0->COUNT8.INTFLAG.reg = 0x33; // Clear all flags + while( TC0->COUNT8.SYNCBUSY.reg ); + + TC0->COUNT8.CTRLA.bit.ENABLE = 1; // ENABLE + while( TC0->COUNT8.SYNCBUSY.bit.ENABLE ); + } +}; +#endif //LCD_BACKLIGHT_HPP__ \ No newline at end of file diff --git a/WioHeweatherDemo/WioHeweatherDemo.ino b/WioHeweatherDemo/WioHeweatherDemo.ino new file mode 100644 index 0000000..f5bd6e4 --- /dev/null +++ b/WioHeweatherDemo/WioHeweatherDemo.ino @@ -0,0 +1,162 @@ +#include +#include +#include +#include "Seeed_FS.h" +#include "RawImage.h" + +/* ---------- User Config ---------- */ +#define WIFI_SSID "闻香识女人" +#define WIFI_PASSWORD "jya404.2018" +// #define WIFI_SSID "juxuan" +// #define WIFI_PASSWORD "828901288" +String com_key = "16a9f947813447e7a557ed17287632f6"; +String locationID = "101010100"; +String language = "en"; +String units = "metric"; +/* ---------------------------------- */ + +WiFiClientSecure client; +OW_Weather ow; // Weather forecast library instance +RealTime_Clock wio_rtc; +LCDBackLight backLight; +TFT_eSPI tft_lcd = TFT_eSPI(); +int current_page = 1; +int blacklight_auto_adjust = 1; +uint8_t cur_brightness = 100; +unsigned long devicetime; +millisDelay updateDelay; +OW_current *current = new OW_current; +OW_forecast *forecast = new OW_forecast; + +void setup() +{ + // GPIO Initialize + pinMode(WIO_KEY_C, INPUT_PULLUP); // Key C/B/A + pinMode(WIO_KEY_B, INPUT_PULLUP); + pinMode(WIO_KEY_A, INPUT_PULLUP); + + pinMode(WIO_5S_LEFT, INPUT_PULLUP); + pinMode(WIO_5S_RIGHT, INPUT_PULLUP); + pinMode(WIO_5S_UP, INPUT_PULLUP); + pinMode(WIO_5S_DOWN, INPUT_PULLUP); + pinMode(WIO_LIGHT, INPUT); + + // SD Initialize + while(!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) + { + Serial.println("SD card error!\n"); + delay(500); + } + + // TFT_LCD Initialize + LCD_Init(BACKGROUND_COLOR); + + // Serial Initialize + Serial.begin(115200); // Fast to stop it holding up the stream + delay(100); + + // WiFi Initialize + Serial.print("Attempting to connect to SSID: "); + Serial.println(WIFI_SSID); + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + while (WiFi.status() != WL_CONNECTED) + { + Serial.print("."); + delay(500); + } + InitializingDisplay(); + + Serial.println("WiFi connected."); + Serial.print("SSID: "); Serial.println(WiFi.SSID()); + Serial.print("IP address: "); Serial.println(WiFi.localIP()); + + // RTC Initialize + while((devicetime = wio_rtc.calibreTimeNow()) == 0); + + // Weather Info Initialize + Serial.println("Requesting weather information from QWeather..."); + if (ow.getForecast(current, forecast, locationID, units, language, com_key) == true) + { + ow.printCurrentWeather(); + ow.printForecastWeather(); + } + + tft_lcd.fillRect(0, 0, 320, 240, BACKGROUND_COLOR); + RealTimeDisplay(devicetime); + CurrentDisplay(ow.current); + PageDisplay(current_page); + + // Set update delay for RTC + updateDelay.start(1 * 10 * 1000); +} + +void loop() +{ + unsigned long temp_devicetime; + + if (updateDelay.justFinished()) + { + updateDelay.repeat(); + if ((temp_devicetime = wio_rtc.calibreTimeNow()) != 0) + { + devicetime = temp_devicetime + 1; + } + } + if (digitalRead(WIO_KEY_C) == LOW) + { + ow.getForecast(current, forecast, locationID, units, language, com_key); + ow.printCurrentWeather(); + ow.printForecastWeather(); + } + if (digitalRead(WIO_KEY_B) == LOW) + { + blacklight_auto_adjust = (blacklight_auto_adjust == 1) ? 0 : 1; + } + if (digitalRead(WIO_KEY_A) == LOW) + { + if ((temp_devicetime = wio_rtc.calibreTimeNow()) != 0) + { + devicetime = temp_devicetime + 1; + } + } + if (digitalRead(WIO_5S_LEFT) == LOW) // <--- + { + if(current_page == 2) + { + current_page = 1; + CurrentDisplay(ow.current); + PageDisplay(current_page); + } + } + if (digitalRead(WIO_5S_RIGHT) == LOW) // ---> + { + if(current_page == 1) + { + current_page = 2; + ForecastDisplay(ow.forecast); + PageDisplay(current_page); + } + } + + if (blacklight_auto_adjust) + { + cur_brightness = BacklightAdjust(analogRead(WIO_LIGHT)); + } + else + { + if (digitalRead(WIO_5S_UP) == LOW) + { + cur_brightness = cur_brightness + 10; + } + if (digitalRead(WIO_5S_DOWN) == LOW) + { + cur_brightness = cur_brightness - 10; + } + backLight.setBrightness(cur_brightness); + } + // Serial.print("Current brightness: "); Serial.println(cur_brightness); + + RealTimeDisplay(devicetime); + devicetime++; + delay(1000); +} diff --git a/source/100.bmp b/source/100.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5107d01114fa002a81a80772451f20869b8878b GIT binary patch literal 2052 zcmb_cp^m~p5Jeymh>8=H;LngC;5W|E1VNAlL8=JBp)Le*L6HVQ0uphOq!^MSNNPxm zAn6Gtq5@HY;O3RiW=j#hayw$W)A#1>?9Of>Q^?$C_-lU+fBPZhLEj&rcjFNJGwib% zawX!+nz9gmSGUz|X;E4PVc-}md;WglVw#9gIDhI-^^ra@59UEmGk+s1&&xq9)G>Y2 zZ?#)(QS(3Wkso=LnKE-$&I)t*@%P=Fi8DdWy}H+2Bi8^Hb9toZOZx{+ukZD>vvyWb z>Z$oomT%^Z*hS&<^7~Ps1N}hMk_*^Q?+hG4{qD`z?wqN SdStvTuO9mz)|iZo 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 literal 0 HcmV?d00001 diff --git a/source/CourierNewPS-ItalicMT-24.vlw b/source/CourierNewPS-ItalicMT-24.vlw new file mode 100644 index 0000000000000000000000000000000000000000..521304b6c44a36d1e6993894e847dde6adce011f GIT binary patch literal 17018 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 z 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 literal 0 HcmV?d00001 diff --git a/source/TimesNewRomanPSMT-16.vlw b/source/TimesNewRomanPSMT-16.vlw new file mode 100644 index 0000000000000000000000000000000000000000..ae6c60dc0f48675bfe8c5e057c986a1dcaa80287 GIT binary patch literal 33512 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 literal 0 HcmV?d00001 diff --git a/source/TimesNewRomanPSMT-24.vlw b/source/TimesNewRomanPSMT-24.vlw new file mode 100644 index 0000000000000000000000000000000000000000..ddfb43b0db803ae5cee342a4d4e9b9d862cb5b10 GIT binary patch literal 64507 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

-_U)Ru@CrgJtcP5&$TwuKazD}x( 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 z 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 literal 0 HcmV?d00001 diff --git a/source/logo_128x128.bmp b/source/logo_128x128.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f67d7d93aea997f4d0357f5cca239404199860b GIT binary patch literal 32772 zcmcJYd2k%}b>}6!wrn|ZBw3UQ0w7~Msa-meY*ONZgP@&_cSAd|Er}O^0U#xn>{5;` zQwNX10Fac}iAhV0NQodYI9Q=<)ryp42?Vdf!778$CIUbm7#sxV_(Pas*1`-d5#0>} z)7|@dzwQCRO9W`Ae}$gzo}TXC_g%mD-tWNEH$8om{X5wrfk=^_(oUIE=A@NnPMSmN zZ^%6^GNlyqm*bX<(M_qr)P$MK{rOI@7oT}i&(tO@&+MWXt8X*)JU!E{vNA1??$bTG z$I939jZ!KfRezT4ln7^*(GZ#9b7r$<4*xTbjDo%sMwwP*PFYz}1U)s)bk4MZS!;SJ zP(aI}WSBXl)u{>4XP5!dWeGyv7x#r%YeO6h{$k5VaVQ~ITJ?Ip-Y75%1iLO*GOdvA ziTf3vsEgh*+Ko0jHY(3&%|iO0jK8_rwm~%v@+lX6zMiT0hAe19P+&;m2fLsj9~d7{ z_=`-xc1rHkChf(+W84)`nDZ6-G=BJ<^yw)Z^oDJp9xKp8JUvtQ*ryZc!Y9EQwIiUG zKg(zvD-q;I<=C2O3jC+yZ+^kHV>M<#WM9xKi5B_Hv+_j_G|`43q(29KQ^qGiFS4J3 z^cQJfbI8g}OvdvxuU4yQRtyaUyMy0n)gkl6aJ}9r18EdgQM<}+bDMl zd4eMW4*xmRCiRfu*ISZx@H%2d&<4@?_Si|ZLrDWvaf;nvB-qd9D3I2bP{$f0MOR*( z@0I3pWdEendeL)7ex17K3wrSLXP$z$)9B5N+5AUxYW3DwA^H$-@jJL>@5B1DNB$|= zkX~$L8|}$DWGZB2>%+zx=wK!Nc4H(LuBWj(Xst+wVHuJBLNHwgKhm)%DOCF{w!R6Y zN)MT}qT^!a97`^ob6YL2Q!+JLJ_mmqx#+(XxIUzL_4;u`%W!`!zYq$7n&;&4Sx#%< z!A1`0nR>{s;#wAMV2hQf=jtu?X+5Qv+f`!)(;6XYu?I$^4*@x!g&n*qe%q%0?Y{;5 z_MU3nPSnDUERlWW+`&s-XBX_Bw0-b@d_wWw#jY%1j_FNiCU&L_%{%>T`Mu&k_-XHj z3Sjn_li>I0rfXY#P^DNePPW($`XVD6ULp(AXrdfbB1MKB8RDC(ZjO#z^{Y8t>{*HR z^})YMDURKPhtzjAdS(BSe={dFF|K$H?_CN&kD^3|9v&ai7SamLP)(kpio)-M0&<3w z>G{+6#YYed3e`Og{sgr|95NAQKJ9qwUXA&zE~d zO7hTza@p&?z5_suDtIpcu>fnvO7Mkd=#oayXQce<*Js^w&BM;SY&%(u<;zTXk^Si! z&!R*=SH%m+(u%aA(Sh+3iu1yIhyR0U#Gqa>YNQ6G6+o+nRzuTI10CLx@R=uJQ8E)n z@V|v~2f5Gvbf}rar{Pm-vOfvib@J$yD4whkuvb_4u^qceP)%VYFKJ2zu~i3Go9mp+ccZf&3CIIqFlMmB(LJ zXo14-Je}{Si(C=Lpk56kNNF- z@VMjU$>P|#@J`;ihCd~JNQBfQ{ilwwkKWPk!@*hjMg9%&pBSCcGgD#}22uumM*{E& zu_nrs0Mkf6&!Q-q@|Z)RJM{`Qz`-e>X$r_2XG)#rJN!=b<1Qvg4&~F>|y( zM`9$LgB#f7S3TP!em&H;Dw#KJwW(!7Y?YLJ^_QhSsk>S9tKYajpWE)G2FFi=dWW8c z?VAw(Q^Xg_z!KmO;z!DJDni?=3O;FL2v67riHq25!OJ^A@4Q*wE`FPHmZhBXSorkdMod8C@_QHlekE| z@~Bs9Y<2gGeLLa-V~x>Zlt#+?7e)N&z;Ce`jgj)ciJn2C&nhJQR9Y6r15$K%>w&~# z54a-Se>b%QE(>n8SNKn+c4}VyK9T)FwRhxTQ2a!(go#t5#)v+RADm{OWw})^v81$> zJllDfLxCCm`D6y_jM8KaEoL!w;9R?yI0;Si-L~O|@kfe!j7Ua27wgiHOv}6QIbUhM z$ElODfpQfoz@BFWegwXg%G-qkX0GxAPmJ%-hQ?2fV+mBdAXGT1${_c6!I&|8RLPJJ zuP+N6J~QX&tyaY}{xo9nyE5p~LmNsePmtI^Jb-q1C4Y_ReXhihHv)gG@@!7$fMir6 z0g12m7GyNb<$+MbCwQg4)K+NDk=QNMKivF55L_qVYOc9xe9(;o21ie5MPmD)h9Ue{ zIT7wt?E$tRHPQ9BRYDu$i`DR%XH|@BXxR$>A!swHp0DtV6}$}pWMUAEmOiY!+jKi9 zu%l-)=8QgSM~%kwYa&yT;mGhqui^KZ{?YBAccfpmK#JU{Gy|elro)nu%3@YwJfy7DPE3F^L zpckE2_24K|JC~a1y*G6rbyDyu{ENm1phWKY32kU}6%mo>{!BpwXcte)mGSMt72qFA z&>Dcb)@*tDd~m(yCzcTYXQk1Kwk1xv)<<}qt~Z^xPk z(Ap_#J*?$`-)s8ECy@S48gd}*fod1QZZ1+;BEM<@Gg=yJipGiRjbipsEZM(t1&*Ml+gu*oKCLs#!Ph>NXdLpU$?hFZms>q6`t8c24R35IFszYT5!Xz8>Ini2PLs z9sV{wDiWi4LlPI}nBJCKdwYW`&2q7#Tql<-)&zMvfy@jga-c3=5x>SNm_wrj;8nQ6 z@1Pg_@@Mzw+z5KZ9;@sdh%8FfDoq2eYjHuZjxNU!HB9dZ58@9X{SI~L13-@PUviWA zBP(5A`o*3p3nx$Jsh~TTIuZDd;0W~#E}_z)*F)7KClr2>`wWpCIG+K2Z=z8AK{8AM zo-H&8DE_DM3vMY9RqTGR@(Singz&|_2`dcuMZ$#pip$e2&z1NqMmCOCOFl=?OGIx@ zQqw88>LijleCyQKZ7wTkY?xPorv_;_GOqAi342tIGZZs;mfeH&=J1H4HIdX~|N3WU-yADbE zCg^twxo8BD&+;kB2iH}wgV;Rv0sgz#{^^2mNSjuxdq!5lt0|!drKEcScqY{|g+los zj!nYXbDkr*6g=kQwUb4c z;1{c4&p!f;1f-_~4&|l&9*N1Rn`aumc)M6db%i>U*D*#`S|yicwX+n0Q?WwqpwLC4 z8sw?#sOeYFf&1`pXzy;G(u!3jzedzEdH5`SgI;XB2Q9A^{Q*B*R>dF7K&B?g$*0ho zc+DZ`;0^XE{$uTu#h2oj9>nu$U;a8gPk%j@CB5uMHhPZ?>k{#o#CD3cQfLJ;ajr`b zk6@xye4t5xp73+J2!3o-_cpV|l_a0l+C{4-cS-I{a;b0sa_=i6Mrd2pSa5%MwN-!U z9jjr)2yRzT0V!I5MZgOdAFvk5@H*N*P9!DNlQuS7Blzjtu`b7NxA*6cwWpEI?XyQY z(GIt1=_<&uEp+`&54BSGB^TfvDg4l5_yw`%ib~TIpbaFmadbHuGZiW5<(8-G0VN~y z6vjYkh5!09?W7eZhfzc1H+b~^Lq9zHPSbBf$E|waCHf*%=1VwU#P=S4<%9$P0JNN~Rt-1SMZ`uQOp&olp$;!!b)q6By3fn(R>=QDt1Y~G z#Mt#=_%8Q3NTIYr@S3QI45`QjzBM*PBmpn8J#yLW-V z<2Ip${1$4|AKluuFR{~V4R6NJsI$U{5=2eIv4z+^$pAQ-v;dpHQ{@QUXqNKA zvs!NlCs@gG&ft$a*X(E{cRqcdof|s(}F^@u^vsq1O{6&=e( zs$Kp&cPji=$&v3-PY1Ivc;9$6e5S4AX$?ni!`AJw+N}ES4N3-{Apco_YmVk-skXL z>Prz{fKRfx@K3H3t2|)2IrOWKtP-SsNPVyFl{#|XcIa-fDUMsMhwtIY2mT5xd}Nt9 zdGt2?s`}tDuC~Nhb-YjeF&r{t3y}#A*PN1;yetR3Qv-QA-@}W*SV($+;MrKVT^cXP z4vM@Beu_~UDUu!`u3UFB+9l7=y_Vgm7kA&G)#(09q|mJod26rK4+*9(kXn?RIpnVJ z+}v6@_hspDDt0dL4roPAT05G0k3tKNL=XPg$#xot#}cPvtKoWUVrSO{tVDM3xU~lE zmrSFVXNl~|vxux*3M=#+L)SyUr?Ow*Pfo?lY40w<&o%#8$=ozRWzR+SZL6jG3!nj? z@&QB>r4CX&aDS6y4|QKc7@|K)hi0ZO%K@yM_CB-!t#o;jB1~pRsHcik~I;tH>!MwK9jFpa;V@ zt8S{^<`g<~tm6T^I&586FGuxgd)wi6M*F)r?D}x;Zhz0AvF;VLd?i*%Xuxcx)n5}7 z?t2ua9rPk+w4>4|p!(jj`J>EK&>>#zQp3{nO*Z zJ^_E*O6SX@ANdnLr_tjB(f*)maut7L732Oq9Qj8F$i(LB#hSPGcB%7a_>ovWE3{4V zzamx`+BiCpICtbnh5uOik2yCjy=mDOmws{SHfPi(kyRY3Y}~_-9LRUV4-NHF#egI-vYb!3}Dc z21G{UNs{$J`?xCl;5)R(GF#p-hdLf$Y#^xP8S!!*zg3Qf^A7(djzI?6)%8!!IFWrS~)F@lr(>=!Gm6?vvjs0&Dj8f!-I4#j$fOk6HOCjurkH-IO}=tL{6@Deh<+ z>2G@N;lFwM%$84W`NcD@ymagCXV-o6ktB!p2A8vW(r&grpG5a(%Z;20wSJ`U-5p_84;1^%E zKjXUiqY8g%;2qjlA9bH8`6}y$6oB71YK(8<{goY$A9;gz_Ox-@K6qs7_?^S!Rz3c_ z;8*qIo;;}LA<{`vzpp?1GBW-@{mGhVcg>-xc$NGDCibo2vUq5<$+@OaL>?-c6KRjj^g!Z?*@4vfSV&AsDO?D*M ztXgl8dzb%sbL7Lw<3XWM+VFZJw%v5rJZEIv1;RO(0;1F45bsA?yU~r;d-93qg zDO$eRUHg6j?+f&br1Z_V+H18TYU9(+VV$y^JJlYWmB_Uk_x}5qzcuT%`b4H#p?MNM zt8CxcmS1d*Kl7PqmTvt?WYO;KhkxSzcgqe|@7iVMB7JH6a6VBZR?ez_z^9s*wkDbEblOB5`Q47vO+V@k_vafzYtG>d@PWac|Ova)u zk#DB-HZ0X?+b;SG?|*w{-QGuPch^1wC0>5!GrR9bGAg?lgzubn-Y^9k6WcyR?GYNYOUQHlI4AOD(!c9ucG00(SD;rd3D!@Z=ca3i+X$Y zI_WWm{|7&&1W3`EZRTY2WW_==Me_d4|B5%0=&$s;DF2TR6_FK;^edaT}mNu`@v&m~nOY7m+l5MX`&|-o< zf8==A1JdIuUI00$O}+c@mC%3CuL&KGokCuH;ms}Y;RUuUxp!oMY=E?V@H6$vJs?Kq z(T~HMwNvSSvT2VG#A=MDyq7nRoST;)x60y@I6ZH8mS-FsPK;;{#%9qk-d*>>1_J_t$%AQ(ev@7>k~V}3l*p9L&t)& z9SQmaMhCC}(*7WAi35Sxi74-&r*z87##h*Hg)Lv`STfXdD`R4L__X#jC&bBoM{@g# ziLSl1j@xD3FWLp}9T9zzl6?>n(Skw{@$RhgP2&ergC8{aYz9js@?W1M>mwt=T9zT3 zGkI_Bm)~ipLYwS|>bC0j_ES*oG;L56YiYM_dia|U|9ICfDDcRxpWgpRA3pHdKa**l z46hC@7}=QEIWj;*u;Rn1t-)=0nX$TIf8%E3U{v%3aK$%4tBV&`+CQ%26U>?Sj;Sr(;yf0 zr)~RZdp zpQR*UXn_6dJ!-GTGcV)m@`nT{e+m2_EKhAdbkE*h9m`TX{`K#%CpLN^cglTGjIvlq zyNCp<6NMwyT@Uo`!@5?6Rz3aJ*3K=Rv>k7^JSL-XNBV=uV)O@(PQ({U-?yTGaMH%| zw^Qth_uAUetQpIWI#HkChi*uNi$8xvqCAk`|J9FfNB0@2Kp$vE>Oe;?Z=$Bs{zHQ> z_RlBUINkmU1$@01xW_@|AZvsMQRIK$`@c!8O6`!55P^4ITE??ZBPVjN?4<|=q{wku zjF?xXA+(@rPs_(G@2~su7jItnrJZm6YnS-d!4d$e`<=Um2(I|4#bAmY)&<)PpMg`tqB#l2NzKDar;=>?O?@7~7er9TX)9?$)kgDBN z$!p@*^MV_}Tc%`SE&BpF;++M3gRgXf|A6TUyb;M$ymwHSDZI|{>^<|pEK{%0hE3CY zs(WDFr=R)$vM(?F($=>|j)k_Ndj;lHP;>Kk7V&=@&unMxXNAm(yY~1W$11*hucC_R z4fyc^Y&}=>pO{1Cc*Krdo)2F%i$)Kqc3=&Xu%qJwziOnuPsKB>HpTzUOZe|eY>pM8 z)8NOlQLqB)Q*ZnE`o|vG`M>tw^7Q|GWDDhk0|`K zGcJBSKW*5Ne~yMe7^jcb$$EI`gWhpLJJZK|giB@Ni=zKzVrR?0FZ85df!$jx*s&C* z9+o|HSPNC6_Q9T-BX7oPkdUXQQC|bUe9x0ad+f*m@{!LJ{*Op;_keddd4rqqLbA=N zc;=b=lA`@lMnAMeQ!-)1!$V`0*Yy0{K0%}4%!@95WjhlW(f@MzUyMhar95%?pV&Ei zC*zWG&~~v1S))5rC!2mmos`YCO!7KD`hzaPkM@hyr}2luFMp=JL`j2Cfui(Ys3@h( z{Y;vq5TjZgjc|HeNr3Dd0E!19 z0dhju*c`ct`+E+k8)!B7l-?s|S&7vrvqxq}9WnlD^iJ%XU!ljcF{){EYR3^Qmy+G5 z$Uq5xi4?{1N$~|2DBV~1?InU;4<|kL;$*$Zfs%y9+##jPp`$vQjd}L*X=KKJr~O7bM4YStz)TN ziIj6sR1UyTVXlGCpsz~h)+C0-6DJp)IU@Ln6f$JP@-Sv?NAK;72#zAZr?Ei_Kbey> zeh*RkLAWm(01ZU`DXo^tyw+An7nCd%%t9@cxK=rhrJlI|)4M+4& zvQJrS%yMENwz$`B-~&GP4PY(WJ6DQMUwunwgyVIL5Uo`Ahy`G@82z0oS^yt82c(@N z8S9x(&TnW|>*gU7upJ$E4*8{BCu0Za)hI=eO94;!ep)pL{aW~MIuZaKS~>FJwJRA= z6#69GX?mQt?cJ|F{1ecBWf%Mpd}mAC{=D1=+=`EV zFt$@@r0}QtpC8@~WgPhy2@nb>#KL=r|JVW5CaSyAIIs12+Gu>{kuCouUh|fJdi$N9 zzTCXtddlCk?q>UR=PGb4BKmcunDMF&@p5K*S+nLt3)tCPyE8k4%#hu)Nqs@Q2nB3? zO1Q5p{Eq#@7S?n$nG$hKqf-=^96vC=@>l?V1RpY zzkMt#In}uxFCa2KhIck{_n7DadiB$4FrQa`E0QBVFi#WjJ!DLyCHop%*wv(bU9pI1 zDtN{Zd>AAus7cj!^%A)R()h6%h2({tmQBzJPN9Hco+$rkWrAV~OmnGVju!JCmO9=EKini5agz+eiK5{=O4qYsM<^f7-7C+`YsT+U*W)i&0Uh4A534(*@6h&3{PRg$yR?8vNJLrzp@k}y$zhpaEIu$6z&DL&VbklE;jdsk>s^d=Eg>(m zvxz?Z8UE8-vD)SS3{TT?AXG>fxmIqccfz-WL^-0%(3vjjyBoL&=VjULt=?#Pfp3 zpkyicSIFqu-QV}W-M2isGS(ct5L-YljP{QV+wqRQ3P0HO%;1XgRiJn5gNKN?rs=zh z8Z{EY(SQ0WY5lH`=~{P)oRrSei%N1kl~A-XUWdLk^36fc?AH5&&gcv*RL_p?CncH$ zxdnb`5Wz-Xe;dm_b07M;vu{(Z=IGaUf7V`YpRlX#P4;&Cq;Vj*NsaTU2yJ5&OdHW} zAhdD#==i1tx!SaCU^H*duigzl$>@j4^tDj`RpkF#Xs^6p#>yw+9jCuRX236!Q-4I{CDgknY6s}rS>4WH`y!s+hngY zb{KKIkLi>lH4~%WWz%=aPn7gARl-@)A;vK*FBA4KA+&1 zwO^*6q3}b2Qe`>I;J@8=XY8C^b_Ue6Rd->X!rDdg`(6G=CG#~G^v*qF+2M(ozH4s= z^+pQVDJ$&|-=^7vN8Z)K$CXf?cMY4*#*zGIGw-w@M@*pGP!6 zC}3YZ^LHg#=soUr@hjOE2{1M)8ceS61th?(d)~5)wF>_oV3+(fg&trw7r#(|e(x)BUh7KdeqDFv zUS!`b#!7Tz=%q2927bGq2(v*^qRqBn_$uR}&&iv|x2Fz_E(na7lbneJ)c4*S+E3oz z{GC&v6#pdEd>^v4SZ}kx&WN#ArG-RnDw7cv{O+1q^P2h4c89&gn8xkm7hM4V5rtn- zz`;*!VX)c^nE~;Td}IS^x*qT9RsL@l^{MzEc=#TCqio`w`Sbaceo=;(bD!iCi6YzV zwF zWK1#M!HSOC8RKuzTbky7(5$UJVpZx{aH{clN&~xfy^I>OEKBe=iRDB7kvT@XurdA( z8zs_jTg-f_x*X@V&LjTF0w}P0ngU`4g!|``#;cEAg1^z2>Q)X!*5SD|7a`=iq6u1ryY>kOL`$GGIDQ<(Mv1b z9FdRlFkBrT5Bw4<&^8ANXhc$_hxk&wm!4HhJlpyr=w&lmA1~~*e}Z4KAZ(5CVeV=d z{01Z9u9f{(_g=P(`&-|%r<4|K2K#1?>TEN9pn0oUf3bYiMcRUJq?U1tWP=%lK4qq) zH#&4&tz#hkA6H}6OS&HKeVlK?*Q0=e7uwZ?249;3^qmO4Gsoy9l}yqSy)B-}*hwEc zSFDFRCI4gFYm!s+=}GHH8C&D@0IP52u#5XU7Z{7|Av>VTl%49k&-=fjWW8OHwtfx` zxMDRwF1%Ohg#ysPoa(+qJVUFZYoFjZr=Y~quH||bS(;0EdC3_beY;%{Uxdfkc+L9+ zz0G`nl{;QLj^p+UdHe``Y-tLkmyD454@{QT@#l} z2}J`UoNH1bN`#huMibpv`DE4xJhNZ5xRR%A?b$)k*WzRgqxT)|+hg^N{GFo*=tRx* z7Y5?~_)vI)ITP6(j}0$R9jM(ceJHBU7u1gZ2Yn<5%tP8#LS`toDE!0b@Caj?rTrrx zhCLJyQ7B*r4nLa6xgG`h-obyV3{(>LDBc^)D})?XtLs zm?r`wh5wQBCHOybcKt1CR7J|;jMOSg5reudHsYKG=A$x_wV0TWQ6D zzuB|zmtFhtg2)a97a$YEno~GxS$_1kBez-BWqn?k*a0OWv$-#{P+Q*wEBt`mDKa`h zFR`BrZiN5Dpmu5N7wA#kERm7386_h5bHu;Nj#6y(CqIu`r<=B>PO=(Dy;k!!BW$hA zV1F{V@6Moh=7pB`M)o7|zSqpg(w7TfuRLDa-qvqL*N#=G-yeMGqceBt_~gC&u!m>_ zG{80<-Dj7bFJ-LgGBtYU%G}uHbZC^32vQj`@}V;ug8g=tl>$BO9yDC5XZ4+YwK=$r z{1bf?I{epD^e{U=zz1S1M8vk3`8tPwZCZ=82qFc2n-R!j`mtMC zN#dOUb;gfG6|XNx?VPtemBtzshc9;C#h7+-=V{(68no4YO+j<&;E$^N8tt-VX5hQ2i)6O3;~o1_JFE))x(c`-BFDlEJW4q;+H=Fc zvth+`FdI*eRYjMawb~nAuWGDnKFK(lQ?a4iSDDRH)_2mW0s2|ccMd$z$ynU_By$$4 zlo=^ALRj+~{nfELC zcW~HmWz2onYceD;6I(ldC}kawjjm**4_-Ci%LVW^F!IWD@dr$4@5*H^J~MHPJN<7} z9>)$eF0L-vv!wd#jb)9V>Y|r3!nt}$GBi5b^v02|swYRKhLPfUUC$s*~AI zd^}(KG?9`;f7u%Pep{QqBXf&YOywKdI6jCLtibk$pa8SsWzH?75d6jHL2v|ng|BnTzE%vowX zUa|k(*S{V8uKkhyhW)(#uKiK>QQZ?MJht5adf#0<+uiz$dTO9{9kbK~`Rr0fZbv-3 zaMBmg1g~hoVk~{A`GubCJqJ2BwKjJjmoZgG6#rT4gxowUq@QkfMzGkd(Zx#1tl?A1 z%cAKw&h4}L1$~(HG^Z@H>;2v))+HHI_!;M5mRs$iyOZD3w^@x=iZu;DPw}c!j0}{s zqUZKsbc6kU`#t+jWADIM-+H$3PoDj^5Ir(K{%qqtmdQAY=`HT-yh}3pBVFr+&WNHi^oJMUYTCK78iM4mH|=mSm8=DW6@H9^ctKKDIb* z`=(zvr-SBky^c9p9y>c$)77Lc)N+;fV*$WF%sNzutsf*lv|6yo^~}PTQY7VJ)@4vVPzCoW2?jXk~P6j-vyj1!kUB zcSL0L7 z!SKbg#YAjmbcqhd2AoD}ox;eGcuTUi=T5TCDF;7$DJgQ#J6^!1Vyp6Gw3@6^A=|N) z?4oiszpa0fj1o6WLrXO!woA573egCYM`Z)!w#h;C~CN@8m)QR;W>W zP~5lSC!cBf_OX9yd*ih|&#l{YOZ6?!{m1Knf41lR_w0|1+gLyDh3NNw(bc{2%3A5P zcW1Po&3!w1HsO2c^)Kq1=o<`QjO4}hl0IW`#MgS%w&1x!Zd~M3q`->Tb!$JrH`#)Q zn*BviFVESc82b-^FF7$9 zn;+ytB`fTvtWcsh*cWao@h zS{}G%%_do&CJ$?vH-2$Mi@k4br5&I&KR=fB@}IQ*vM=M3SI?Y8XAUnvQt^w(zbgT7 zKV{?BlXciGB*3As=4{gBmJG{sG(aL)z z1{ggSS|8dMd?2(e)XYdHM(}}L{y#;?GKp_HzvVHgKho6Wi z>yEwmi=Q#pbKaZG3sBY{`-kjbg!^G~aclZk#k}+{kqzowrMJvA$8q`VK`(Z+67+Ci z53wrw>XGA&WRr+m3hOk}qgfx?VLoI&W&NQQ0k1{gsRggQ#R@@(Hui05O{!ca0Sdip z8H%{G?dN-+d*$WtKltbN>0{5wHede!>z{)kZYv5*rdvRIKG8zvR8-mY+qT}37`p!K zwyV9Vb5k-8%{$1d`hvbrZ|NqNs51Cz{GQPh*n*1CfLUgiYL(14s>1>b<`xQV0c+FN zbFDtHP%MJ8&YwsCtMU{Eb{B?BSS z&zR%Y#F>Mvi61)hv1Jm!&3B8+YPm*bVoJO^koc^S;8*!u#{Q_{8DR|;=Bw9e4Q7>j zS|k1ez1)wsFpja_`7P)9NIt84%3f)J(4dG}J1Ki@+w%Rtu6X$${zD&%U7RO+FvZKA zdAS@$p#s}W?}Gjmo}zswh^JK6d|&KhJX5}z&(^t;6=K`#Y>EaiP)xr5`+A;Pgga2`JTzn(f3KTIiy{(VvF?r|tNB^-a zcyG@p$Fk3-p2|~ryt7(z+A^OFUnS3e2BCTcB{GQsp9*?XY+m)-a z1~rz<*SA`{X=(ZOVnqS$AG11H`9}DxXKQU{yJjls7t|pnUlr+nLKZ^Il!WVQ?LJ2a zh>(f@+lX7sU;lh^u%oH#{#S1&&YG_dC}6~g6VBR(;d54m9w1gF#0C=|>lH^nwinOO z_e-XT$s%@vvQ(@#$7mK)au$-Sm3(^I{)IMzzfinh)~9GQ8<2uD1w`+OJ<&jsgAi?q zPh=n7(*_V5s-oo*pDZDEKMCC$x^C+Z_6@Xr?2OZ!AHQbq?$3^NHOn$kY%!`~QkcvZ7+=#(pPPF^@W@Zw;RdpCj`%Xb~Us zx7c3NR};yc-^%W1WCm-gie8FLR-818;IzjbzmtayWFY~?R+i*_7|E6G;$3VuVg>4n z(1(!-=6;D>@LkHG0I>no1iP$k=oK392L5;!62#1IR=$#PB){Dj^P=qq$xJny2K^^D zP9O!PJ`|~xPMV_tFcgvB^Msg6q%UomaM~u7APHM zmDSM+R-9GqSb%>gxRC<~zcv)yme`4%bNH+9g1*$OG(#X451^hHwN2>iIt|7600mOx-yC(# zL0=C>Mgc1ys92%r*~%7piK8m;S<1RDbbNe8h30nQbiA%_$C*AX-CDN@{sPI2#?Hm@ zE$6z?*KttUs$3)={IW7L(g|YmepTKxU(V>wKSir3sA=PrwXcW64R`{LTB%;r|7L&k zt$XYp{r8`}CpoC30sQnC@t?0;-uoT&$XbR*4+=J`>Y2~phzBs19a+?KSNDDN?-r|E ziC~wq)?O0N)Xg|~k$G%u$!1p2?n(RC5?YDR<3R&FvZ@!zr7)@~xIsHbyXCZUCdgeK zuuAcU8zKt^{vdk$*&oK=O9salM4pfDv!;*$u?EZ#RJKoA0k7*3;}_6RZ!%(WgELO& zI<<|enc3XL9KM0($NL5&{y6<2_=AgRyVK|e|Kh%rs_*fgBcPd^F0)(``WC!e8Qn|`uv)HFaOuBL2eq$R&9r@Z}-#;elmfJab zPk79gUo}cCu~c5d6{xU}^9*nNQChp`d=*f2O&zhF4yRwry7z z+p+X%{2~Xm14b49?;>*LPp);vC{SFgXXbvJWsVq{{7(yI|3^=V_NVc){>FY;*94sw z{H+SVNPv=p$cDBfXP-U0r*rh|qitPnKf_CE;12n&j;sh)kerCvzg$NWL>DBRLVLjz%_F5oAj6D;dy=1i#V* zuV?}VS)d;i{7w(foGUD|Ory@-m*GbO_|CE;P8M`-Ph|cjd5hRNr~odBdqnC5{|No* zF84XtCcECJ=Ebb`H%S{PG;r|CQCRo)FYEvATX(5wKc`SvSnBrdQr&R3?4!U;4?*+yu@_dtMLWO#4tJ6p7aNps7E*SjddqR_4~rB+|jd2{x88_-}H{k^(z{%=DKKs!+B?4&pde#zF?Ks zrtqg+3ZNTMp_N=|7W8xczcdA~hGs3gld0yg&AG-iH%9!lpbqyP`G1JMLks!$&)jpp zBSvv(+B?>FtgY5}La)u@xCi_~2d7jVy$$W3kzxA0k(k*OApfDI$O=?iOB4mt`Y#c2 zSTD4^8XE6X069`e$P&+ByxR3@dG+s!p9`*ve;)j|s$%z8d$dvWh;?^pAEVXMh&`(B zCw*4Y^c(o^HFvuHth8U}l!U`w_fsOiHYA|b5}(SPp^jdyCG^j0@0driA7c9*{L&iI zqhf{J(YjX$`3YB<;gi<G$Z5>RS`v4>ezce}$~|0X?!P75oP~ zKQ_#XXN!nz8TCOf)Isl1V3@N4Bw($K%uwIdV?pbzhFG`td)iX{9<2+BFLWuOv|xM! z3v0^%lDv^Ek^$+{xDZPdCuxXWZ@;tc;si1%Imw1&gI)SQe~ z$}kryP4)=|_+II^D*-9up>WF57t{JFn+SIs^v!0E_Nv*Xb<=D3ppt+h)e=aLvDlFt z#?MHCgO}oWGQabg>y`Mb^?Qk*X}hgI4gJi@#v@5fyl1o@Ult-Uoee72MzGD OViZ}N8`*vr`2Rm*b5TzK literal 0 HcmV?d00001 diff --git a/source/logo_64x64.bmp b/source/logo_64x64.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6c6e683586a280590f7408dbd12ca77f331033fd GIT binary patch literal 8196 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 literal 0 HcmV?d00001 diff --git a/source/wi-cloud.bmp b/source/wi-cloud.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8f09f08ea46b1f2dcc2b6bfe4e82f3036e03cba4 GIT binary patch literal 1804 zcmeHFA!q_o82*D{!LYD!VTcEoYcmQf3kGcy3>%olAYu}eSjI4nVHyi#tZhNC3|ts^ zWw0_>)G+V`gYkuh3kLW9|9kK5JoR8j`h3c z#UN;S*UIxPP9JuGJq;7ssR9+yWrC@E&}DehcQa((kN1*LnjOdkR5@s3swO zeadG?xLU<1c@5hD9T~o*_h4uCFZ9X6r%xDkY?Xf*NF)7D!xDZ7ja zy{e3NT^!m806S4EgmuIkPfLSh0lTQ5Emz3ZT2-M#u?}##&!~^BxrmPBxsek2IUl1 z+h!J_x+g0D*`DSpoSVK2@0=Q>X<9l2W_ngMiPAt;s76GrW!%Wh`3C_0p(cbWJXdz9 z2Vl*!J*Q@8?2MCl^4Xrs^!;ec=&dxo>aT?+o;z%xe`KGmIr3{xo>X>%9LT9y$5~Pc jf2B%2ra~YZ#@};;|3Z62snNY)K&|H7DCd9wXA}4ViQhvZ literal 0 HcmV?d00001 diff --git a/source/wi-cloudy.bmp b/source/wi-cloudy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bc385ecf3aae376c99f3f68a781730cd2418e9af GIT binary patch literal 1804 zcmeHFFK8QK6n|pkM8%1S6QNw8Vh0h8OJOF3m_o(kb`TMciV`MDmu)01`aU$Xq6DKOZz4v|ht#`R@jhfm!?*04y-tWFYw+Wjd*E3v? zma)ogl;vJg@+G{;UawkL)9_3*>MyU_Fm=@P+82>>Rb>6GD$nYUnn|Pk$8g7A_73KE zs;#=3u$a^;4M4o97<(})}6M29eWehbi_Ny+Nj z7r2e=GD9gvXYVz*pv<}c_T6X(HLDpr1-6;WVj9&??a|~ay^wM-sDA-BZfIzpYQ@mb zs920?G&uuUyvw?@ChyQYq>6arWHFfE^$x(DoIT;3={>~G*7k0q5L8}HuE1?yj^8HL zjD!0}&O>g;N;i$#9|7#q`A?eSNo1c?y_VMku)4H!Wz!0PnkCfOPykFTYKmG~+2|+L zJ2mkrrj-C%>`^CnKLW@smGLK|QxeshpB(E*oMt8%V$hMcDt^;7@G zUjp>rQ;FHb5ScyVyZ?hB;h+1nAD`$?pxer|2zNg1bzWbiamG$ literal 0 HcmV?d00001 diff --git a/source/wi-day-cloudy.bmp b/source/wi-day-cloudy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eaaabe013a7d1cdedf9541e1943b407ea37b4170 GIT binary patch literal 1804 zcmeHHA&47M5FK%1Ma7DUh;VEm;ug*XDlYN@5f`YqgNPoS2qB^z6(K5wm~cdtP*F-n zSymjZDJ1SH4icG&LQWJCQOJmhh!ZO!Rzz%P=KtMIldG)jEIa@GH*aS5&;Pr}a17z0 zVN3}MTs@C?9wSU}&yeTAm>dRUv)desR@gnn!o-lF ztDear&aIs$%5^5LOUgq7%P#RMm8$Je(xgGwc`1PQ6XUo7(}`i*2bjIp&q50DP4@5w z!0ax6soCGM{f^SFGyTT(^PM?b@Z8zhrTHTv!YZz+#2!bB{$+FMZ2TK9WmG|1(TJWW zO4Ryjq*{}-T@taSQqrqIWx1WTZr=b<55@->L@4&*J5WyhX>vAeIh$+_;OZNzIofYf z#MikpNRE1c+70s_tXV6G7f%4Zl*};<&HKWXS2;Nw1*1j$4pQ0K0Q4{8OsW{TMm67y zn4)1+Ia961*+jhGxqZ)l@o$8|h%dimWntZKglLztN6dSve&h2e+6gvXZqqBU(knVY z$}sAHm%92;G|VnQzGs~4)w?1h4I8hEDl0=hQcXeR1Gjd{&tGSvniSzE&cD)W|3N4+ z6tL?l+pdG9t3^5*xkuh>0!qCT(NOs2P|hh+GG`Es>GYh(U5j~+iJ=-Kx7GYun9^5* zl24KOBX^P%TBWpq`oPWRjB4QCnerX&1ZgL%+N)rk?DtL(!_dDeUqq*BP@#P!PK-vs zQZj&Qtl6&2OpygIwz+ fLrwCCatWco1jZLo+ zObk-ji9llpCsQ%FioiV)5qUBq;`ZM6zCV{6-MRGwxjDz@Uv1UPDPs23}vmEsrFqmxpF~H=+D8-v~7(Y4i$5Az-)0!OI+;-Bt zAIvOTUTu20TWKTIh&{FY$5I*CLI^AMcqHpk_sbB>60TSr(@{i z92$P`Y5-o%yW%^hoj8t4p0aq>IH&c}eC_?y^{a2~7reh@+Z^b977JxH)YFUaK`3vM zL}-Lj6`-`|z7mrch1?X~qud-twYQYGSw|2qMSSLcx&fYhay7t)V8 zJlZ#L@wuQpVr|ymSJ+6}5Ia`MbJ0RR?K}_(<8@zA8mY;>7B`Hy&J8A>fufC7lh$Bt zZ@N9VFR0Dz&0suu$7OGLG&>|Mc|x8nxtcF%GKAhM;V$ICD%`OVYll4Cr5^>R=II^I zCNGoc}P`|q`aPc?+vq4Z4eD0cj?pu!Gnl^Kcq?HUE!>RigM)UZY9z`Bx z!ipOx*+|ed6C%x|X9%?+r+}kRbtk(er1o5L3_{|v?%pxZc#4G*zGUe3UDGw4x;Js^ zaU;!U2O(w$^ttAC4Oy2!g<$QtAw)1;-1?SpCD3PF_N~R^z9~tNk;BP``(W3>s`PaH zC&+fKG<);gT~)m_3#LMNOSkVWy~*srqhJd91YQ?Gr7Q~VSG%@!-np&)x}J_h?+{WF e6nI4)0V@Y8EhSM^+DR%+{_huS0PTvun!q=27fMY4 literal 0 HcmV?d00001 diff --git a/source/wi-fog.bmp b/source/wi-fog.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5a8e84c6874ad6f7671b0bf67ae1766d779ea1d GIT binary patch literal 1804 zcmb7DF=*RB6ulwC4H-Oi&=h3I;A}N?h#`vw9U|yZjon1)U_z$QshbHIOzBWe24gw| z;vvuufpjR?OTig46x5;M8$4*}m_b8^>;M1$N%C2W)Bn-k|L?v3@9Tti#E#IeDHou; z8m*MpfSWofT~=U>$SMlpqoy3z8$}PrJ#by-w3Uz2Er*QL< z9*pl#zI}W>{hfWORYOPajS{-gZ1&+!#)56{<$Ryc1tp(PDwOA@Y>zj8g=p?xK1)W^ z?BtW|$}UucS$-u}kl{n@_?Pg*UVeg}X2Nf7v4T_uhc#q8N&8H8=>)~NK7B64_#QGu z@L4yd_09J{3K3o9Bw$)E9`My0{Xm-8i6sUi-iM!sFGL`}z9-DGz#qMOyB)Nkfj_)n zeQ#5pjD+x(>4EJ8XmLB#C;0)l?=K#ZDXX-;d=XtGBf=CjR6$Bwvf12=1~8R_1G$c1 z1)}(%snS~H5W$y>8yAhf;}CHJ6 ztxjZTVydLTP*vtC89~Q0@X6jg+A(G)2Ic`~5)DdkuS~bO*W3l)s&jAYEs+l-pRM`d zGPB@n9|$W<5yq!+T#{w8qvP<<@m|mhdw~pl;UPv4x1zz~50oh`HM_$9V1viN$8(SB xiYc((^dO>USyxbp^1oeEi7-@KCG3##i5UH#DU{n@8%jY-O4!+o$RbbJ{{aL)>M{TT literal 0 HcmV?d00001 diff --git a/source/wi-hail.bmp b/source/wi-hail.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6e59bc17c82682ca1a4a4090d19fa5f7db1ce28b GIT binary patch literal 1804 zcmbVLJ!m396n^CvDYi(lMF@LvMHa3|AVmV#C|E?Wh;YRPEDo^>yUGQ=VQ=8@+NlNC*bcpcwL*Z5h~+1nLXWxQ1W4~4E(IraSJx}OO;F9pNSE4tmi z{d>@6=PzDm&+}A0yfI>6yQy|<^w`|p`2mnT#`|KdnA6dHsZ3Z;V0ZTzOUR=hK;@K& z>_fho_DBJ%b`8KAU^g-`8`hJQ$iQA?-Dhk11#e&$jadI2xnx3lnf-uo0Zy*8?H5!h z?1yvI@H6k;16X&-W2H^=5YxU+m*ZPzk@(|}(Y1r`h(b%3!B)HFlD*!Spwb%vq|2+sQI^I6u`TDcU zEDq~ZI=TEWDNCl4;7RoxK)Xh{-ZQ2m=z#4cbjM8r^v{QN0OIa^H5{d*%eny?Og zW_SZ5mj3BysORLYJ1HuMw90q`;HW31U&yWjxTz^qgc+TLppyV7ZEJMg06XY3cLAE~ zC6n$rZr}|wM>9hKDO;b8dL^^}*@(5y{DSc%Zb(_Z0`N1QAK$wCqkuE6&M0z@3GKXV z(H^j%z6hfXzXqi3Ldz3qf2m#1arB zm;*w^t7?nSeRY{6jy@=TL8FuNyM$$s^pk^1Zet-Q0P0JU!ypf*d;pCodHzdiAiH{ zFHTNvDN*y1e4!68|JY>Q6hP^kg`(=cI-x*-%QNy~@SsO0HmB4!$1AS3&ZqRQVbB98 z^aY5NkTr^E{#_qBuK-5Pl0{6iU;>a{s#xk##56c{jr=~Ndf6gkpk}fVvZZsqvibH% z-1<#qQQw&2yC;A_!={OG%-uq^y51;*Np($s#i%xxYy$PK9IsU#cgCGo+3`g0ujq#y zR3qnpE&k70dLK70UQ6J|8VkF#=CnTiyja~FtC2huv+9+4AzG_Q1_vgL^5k_KLI3Wr GJMar2VRf+p literal 0 HcmV?d00001 diff --git a/source/wi-rain.bmp b/source/wi-rain.bmp new file mode 100644 index 0000000000000000000000000000000000000000..775f9e3e5336923a3fe976453c7d4eeda39a34b0 GIT binary patch literal 1804 zcmbVKKWG|J82^S2H{R$_!U-7^Iw*8Vz~v4yRLG#`r*l7pY4cZGN}$+x%qM_ea`AfR&bp4Ujx(cxrOC z5yyO9Ie7wL_OfSsH;OZwISI#z-2uc87a7VHXai>cJ6QD}${+MYERE}Jfc&*&Q18LF zcn#nr$gd_MRbUK($lxRZ=Iadx#`>24ot4a~PU35m{LeoD`j^V7qoWyE&6Mz>Z!|OP z=`H8!E1ZHi&14lL=3t+`>@oI;^-@@6i0{mzP`<0H&d+(u=)kx#myU>XWs$ftMQyfXCio#tu;6eVR83e zVtZxWyw%G2u2FFeF|A;z9SJ5Xo|sWdf8)G%4lunL7ikKlFii`Qc7>o{7#D+man_l5 z~qQP_?WmQKi(BQ%9&MrJ|IG zKq~8M3W+JKOkL`3M8t}S6%`{Y=HAcjW_ldlEyuZg%lqcN@BPg0uERQ*pG7f2C>Fba z467PdvK}k-v}DcuWzpQEB_%uK0)c6G5!uDi}B$af`@A? z5DpDT6yJdxLq@oChphPxp)uVh_b_R_c{DquUZ>CAm+E!hUPX2`*w;huqoje0bOuRF53|r~H!4L0=gq>TMc?eu zqK_6U;Y25``3-0IgMEPQw5Ua+c?2s7Rwe}ay_dji;|_37RFCU4<60C)asMLPvnpQP z+lo;8_sCKd+0$(P=+4S}BtkLkA`=M0{n9)5h9^khC`Yf2_6YBUbvvaS$ij{{(Rl+I z^|ZIvsQ3&2$zL=ojY@Td;|BS}l8;*s(w!{)csF^mua4GYSK~0$kXTVd^YsG&-Zo`B zEC$4<_k=vXqQpnm%IqYHXD7WifUC=#<9c$GXyOCV8%*n+O?h3nul;*t2FH9wfxpN? z&a^Y3ZADM@a9k_?dWE#=ZS8)haa`*zqd2YGR2dWxg2Koua+^kFwTKkwk~5T%i$a4m SM>L##4p>mG^WXk=C-4K7VGDTx literal 0 HcmV?d00001 diff --git a/source/wi-sleet.bmp b/source/wi-sleet.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eebf4e75d619d16a58eeb34eae6a31e768d26855 GIT binary patch literal 1804 zcmcIjA!u7s6uqJ%qT-8*FGk6Shy`W}6$#XAFcX+qU?PEvQYu2J3KgNmlrRy-)R-6{ zB9MteD+Z|uq$cnq0>2`Vh(WHXh?w|d;){y6d+&em=O@1_OJNu8yYHTR&VBE{_x=v- zfck%i8@1kyoosFNCMFqwLpE1D-07)(o~T|!%^Ups3ip`)cRaDBW zK{|El9~id5V>v1mJ~|oe!mr0G)Gghb$eu8UuT6Vj3Kf9zINBF=RBEwL-wyWh^$R!0 z0_n1*{P>Q)EkEk+NkMcWr93WFvd7$^HCYj1$n;78&epWA*VJgVQ_9_(eFq?G$NI9m z_#MD2@hsXEN)j7f8{lYrrMu!R`^Fv$noz{VXb*|Cw2&*PIRz6V5_5!?I&?C6T~j2y z{7b(9;Usn-Xz!Z#{Bli8J-kxtmDLGvAyTqJR2&BZomE;h2oS@t-kR_&IGLb5m^Cb= zreE_TI(Kz)>XrPulc5`=H=-3!LOB>-MnNbnR6M zWu#g)dL4wdeitfA&F{S$RVf$a$Zp1E6!7wl-%rqPSc`q7@*}GgF;NKN5T8fzU}klu z{b?Vdcdb;RQf!)1;_gggEzW<=?`d~PF#9G(|Kjd95g?81Y$)SngD~v7led~A`9J7P WZzL{j$fK{+IiZhO#Ex??iT(kvtvjRu literal 0 HcmV?d00001 diff --git a/source/wi-snow.bmp b/source/wi-snow.bmp new file mode 100644 index 0000000000000000000000000000000000000000..967cf934e707b752b636164abc15f67d6b12b622 GIT binary patch literal 1804 zcmbVLEodV_6n^5w%7_yYrR=!|DlQPwKui`+T;W6(PF$ekC>2NLQnj2Zr6Pog5>6Z? zE++!5I7mbxk*PSih=ZK#6BR2eR#dF0n0s&L&34mnXmTISyqWKP@0*{U-Goh0>j7Vs zzpTi&Fm>FU5e?P^8htYPzq)i?Oh>C4$;zwBb9L)_kba!B8)4jk9o6K_%RM-gW`BPw z{{R;Z+~6|z#%zT|($HxBo$G?mw0QGy@v(FO;J1hu=cK2e!)CE~>(r+^M!;_V0HAxe zP++xL5|z3*0yud~WSUPVh2uA`lrp<|_pb%63|yYXbl zCQp)huk;R}c50P&u!5tSN_0M74ah7@fR%FMfG0K<``Y#jfk+CO@R!r5p~ zMRdCX?zBigCMPlJ0eFtA#u;kE(ePVVl}xJF0MQ0z7lDT#0QR@juYgKbqw*<XQ!I@t5W^S?iZ!_j-C4Md-i@>sr}XYy+7brHam=U9{&NAvB-!MZb literal 0 HcmV?d00001