@@ -8,7 +8,7 @@
{
"Celsius": false, // Enabled fahrenheit (Optional)
"Location": "Berlin", // C ity Berlin
"Location": "Berlin", // c ity Berlin
"Token": "19ffa14b3dc0e238175829461d1788b8", // OpenWeatherMap token
"Lang": "ru", // Language (Optional)
"AutoUpdate": 5 // In minutes. 0 - disabled (Optional)
@@ -21,12 +21,11 @@
# include <time.h>
# include <stdbool.h>
# include "json/json.h"
# include <kos32 sys1 .h>
# include <kolibrisys.h>
# include <sys/k sys.h>
# include <clayer/http.h>
# include <clayer/libimg.h>
# define VERSION "Weather 1.5 "
# define VERSION "Weather 1.6e "
enum BUTTONS {
BTN_QUIT = 1 ,
@@ -48,7 +47,7 @@ Image *blend=NULL;
const char * config_name = " /sys/Settings/weather.json " ;
unsigned char char_size = 1 ;
uint64_t A utoU pdateT ime = 0 ;
uint64_t a uto_u pdate_t ime = 0 ;
char * wind_speed_str , * pressure_str , * visibility_str , * humidity_str , * update_str , * wind_deg_str ;
@@ -59,13 +58,13 @@ char full_url_image[256];
char temp_char = ' K ' ;
struct kolibri_system_colors sys_color_table ;
ksys_colors_table_t sys_color_table ;
pos_t win_pos ;
ksys_ pos_t win_pos ;
# pragma pack(push,1)
struct open_weather_data {
char C ity[ 100 ] ;
char c ity[ 100 ] ;
int wind_speed ;
int wind_deg ;
int pressure ;
@@ -78,9 +77,8 @@ struct open_weather_data{
} myw ;
# pragma pack(pop)
void notify_show ( char * text )
{
start_app ( " /sys/@notify " , text ) ;
void notify_show ( char * text ) {
_ksys_exec ( " /sys/@notify " , text ) ;
}
void * safe_malloc ( size_t size )
@@ -94,14 +92,14 @@ void* safe_malloc(size_t size)
}
}
void draw_format_text_sys ( int x , int y , color_t color , const char * format_str , . . . ) // Форматированный вывод в окно
void draw_format_text_sys ( int x , int y , ksys_ color_t color , const char * format_str , . . . ) // Форматированный вывод в окно
{
char tmp_buff [ 100 ] ;
va_list ap ;
va_start ( ap , format_str ) ;
vsnprintf ( tmp_buff , sizeof tmp_buff , format_str , ap ) ;
va_end ( ap ) ;
draw_text_sys ( tmp_buff , x , y , 0 , color ) ;
_ksys_ draw_text( tmp_buff , x , y , 0 , color ) ;
}
void find_and_set ( json_value * value , struct open_weather_data * weather ) // Ищем значения в json и заполняем структуру "myw"
@@ -119,9 +117,9 @@ void find_and_set(json_value *value, struct open_weather_data* weather) // Ищ
}
if ( ! strcmp ( JSON_OBJ ( i ) . name , " name " ) ) {
if ( ! strcmp ( & JSON_OBJ ( i ) . value - > u . string . ptr [ JSON_OBJ ( i ) . value - > u . string . length - 3 ] , " ’ " ) ) {
strncpy ( weather - > C ity, JSON_OBJ ( i ) . value - > u . string . ptr , JSON_OBJ ( i ) . value - > u . string . length - 3 ) ;
strncpy ( weather - > c ity, JSON_OBJ ( i ) . value - > u . string . ptr , JSON_OBJ ( i ) . value - > u . string . length - 3 ) ;
} else {
strcpy ( weather - > C ity, JSON_OBJ ( i ) . value - > u . string . ptr ) ;
strcpy ( weather - > c ity, JSON_OBJ ( i ) . value - > u . string . ptr ) ;
}
}
if ( ! strcmp ( JSON_OBJ ( i ) . name , " weather " ) ) {
@@ -152,9 +150,9 @@ void find_and_set(json_value *value, struct open_weather_data* weather) // Ищ
}
}
http_msg * get_json ( char * C ity, char * Token , char * Units )
http_msg * get_json ( char * c ity, char * Token , char * Units )
{
sprintf ( full_url , API , C ity, Token , Units , lang ) ;
sprintf ( full_url , API , c ity, Token , Units , lang ) ;
http_msg * h = http_get ( full_url , 0 , HTTP_FLAG_BLOCK , " " ) ;
http_long_receive ( h ) ;
if ( h - > status = = OK | | h - > status = = 404 ) {
@@ -194,19 +192,19 @@ void get_image() // Функция загрузки изображения
}
}
void R edrawGUI ( ) // Перересовываем интерфейс
void r edraw_gui ( ) // Перересовываем интерфейс
{
begin _draw( ) ; // Начинам прорисовку
_ksys_start _draw( ) ; // Начинам прорисовку
int new_win_w = ( strlen ( myw . C ity) / char_size + 10 ) * ( UTF8_W + char_size - 1 ) ; // Если название города не влезает в окно
int new_win_w = ( strlen ( myw . c ity) / char_size + 12 ) * ( UTF8_W + char_size - 1 ) ; // Если название города не влезает в окно
if ( new_win_w < WINDOW_W ) {
new_win_w = WINDOW_W ;
}
// Рисуем окно
sys_create_window ( win_pos . x , win_pos . y , new_win_w , START_YPOS + 220 , VERSION , sys_color_table . work_area , 0x14 ) ;
_k sys_create_window( win_pos . x , win_pos . y , new_win_w , START_YPOS + 220 , VERSION , sys_color_table . work_area , 0x14 ) ;
// Выводим жирным шрифтом название локации и временной зоны
draw_format_text_sys ( 20 , START_YPOS , 0xB0000000 | sys_color_table . work_text , " %s (UTC%+d) " , myw . C ity, myw . timezone ) ;
draw_format_text_sys ( 21 , START_YPOS , 0xB0000000 | sys_color_table . work_text , " %s (UTC%+d) " , myw . C ity, myw . timezone ) ;
draw_format_text_sys ( 20 , START_YPOS , 0xB0000000 | sys_color_table . work_text , " %s (UTC%+d) " , myw . c ity, myw . timezone ) ;
draw_format_text_sys ( 21 , START_YPOS , 0xB0000000 | sys_color_table . work_text , " %s (UTC%+d) " , myw . c ity, myw . timezone ) ;
// Выводим изображение
img_draw ( blend , 10 , START_YPOS + 30 , 64 , 64 , 0 , 0 ) ;
// Выводим жирным шрифтом название локации и временной зоны
@@ -222,38 +220,33 @@ void RedrawGUI() // Перересовываем интерфейс
draw_format_text_sys ( 20 , START_YPOS + 140 , 0xb0000000 | sys_color_table . work_text , wind_deg_str , myw . wind_deg ) ;
draw_format_text_sys ( 20 , START_YPOS + 160 , 0xb0000000 | sys_color_table . work_text , visibility_str , myw . visibility ) ;
// Определяем кнопку
define_button ( X_W ( new_win_w / 2 - 60 , 120 ) , Y_H ( START_YPOS + 180 , 30) , BTN_UPDATE , sys_color_table . work_button ) ;
draw_text_sys ( update_str , ( new_win_w / 2 ) - ( UTF8_W * strlen ( update_str ) / 2 / char_size ) , START_YPOS + 190 , 0 , 0xb0000000 | sys_color_table . work_button_text ) ;
end_draw ( ) ;
_ksys_ define_button( new_win_w / 2 - 60 , START_YPOS + 180 , 120 , 30 , BTN_UPDATE , sys_color_table . work_button ) ;
_ksys_ draw_text( update_str , ( new_win_w / 2 ) - ( UTF8_W * strlen ( update_str ) / 2 / char_size ) , START_YPOS + 190 , 0 , 0xb0000000 | sys_color_table . work_button_text ) ;
_ksys_ end_draw( ) ;
}
void get_config ( char * * C ity, char * * T oken, char * * U nits) // Загружаем конфиг
void get_config ( char * * c ity, char * * t oken, char * * u nits) // Загружаем конфиг
{
FILE * config_j = fopen ( config_name , " rb " );
if ( config_j = = NULL ) {
ksys_ufile_t config_j = _ksys_load_file ( config_name ) ;
if ( ! config_j . size ) {
notify_show ( " 'Configuration file not found!' -E " ) ;
exit ( 0 ) ;
}
size_t size = _ksys_get_filesize ( ( char * ) config_name ) ; // Получаем размер файла
char * config_buff = safe_malloc ( size + 1 ) ;
if ( size ! = fread ( config_buff , sizeof ( char ) , size , config_j ) ) {
notify_show ( " 'The configuration file was not fully read!' -E " ) ;
exit ( 0 ) ;
}
json_value * value = json_parse ( config_buff , size ) ; // Парсим конфиг
json_value * value = json_parse ( config_j . data , config_j . size ) ; // Парсим конфиг
for ( int i = 0 ; i < value - > u . object . length ; i + + ) {
if ( ! strcmp ( JSON_OBJ ( i ) . name , " Location " ) & & JSON_OBJ ( i ) . value - > type = = json_string ) {
* C ity = JSON_OBJ ( i ) . value - > u . string . ptr ; // Получаем название города
* c ity = JSON_OBJ ( i ) . value - > u . string . ptr ; // Получаем название города
}
else if ( ! strcmp ( JSON_OBJ ( i ) . name , " Token " ) & & JSON_OBJ ( i ) . value - > type = = json_string ) {
* T oken = JSON_OBJ ( i ) . value - > u . string . ptr ; // Получаем токен
* t oken = JSON_OBJ ( i ) . value - > u . string . ptr ; // Получаем токен
}
else if ( ! strcmp ( JSON_OBJ ( i ) . name , " Celsius " ) & & JSON_OBJ ( i ) . value - > type = = json_boolean ) {
if ( JSON_OBJ ( i ) . value - > u . boolean ) {
* U nits = " metric " ;
* u nits = " metric " ;
temp_char = ' C ' ;
} else {
* U nits = " imperial " ;
* u nits = " imperial " ;
temp_char = ' F ' ;
}
}
@@ -261,25 +254,24 @@ void get_config(char **City, char **Token, char **Units) // Загружаем
strncpy ( lang , JSON_OBJ ( i ) . value - > u . string . ptr , 2 ) ; // Получаем язык
}
else if ( ! strcmp ( JSON_OBJ ( i ) . name , " AutoUpdate " ) & & JSON_OBJ ( i ) . value - > type = = json_integer ) {
A utoU pdateT ime = JSON_OBJ ( i ) . value - > u . integer ; // Получаем время автообновлений данных
a uto_u pdate_t ime = JSON_OBJ ( i ) . value - > u . integer ; // Получаем время автообновлений данных
}
}
if ( * C ity= = NULL | | * T oken = = NULL ) {
if ( * c ity= = NULL | | * t oken = = NULL ) {
notify_show ( " 'Invalid config!' -E " ) ;
exit ( 0 ) ;
}
free ( config_buff ) ;
fclose ( config_j ) ;
free ( config_j . data ) ;
}
void U pdate( char * city , char * token , char * units ) // Обновление данных
void u pdate( char * city , char * token , char * units ) // Обновление данных
{
if ( blend ! = NULL ) {
img_destroy ( blend ) ; // Уничтожение картинику с прозрачностью
blend = NULL ;
}
memset ( & myw , 0 , sizeof myw ) ; // Обнуляем структуру
strcpy ( myw . C ity, " None " ) ;
strcpy ( myw . c ity, " None " ) ;
strcpy ( myw . weath_desc , " unknown " ) ;
http_msg * json_file = get_json ( city , token , units ) ; // Получаем данные о погоде в формате json
if ( json_file ! = NULL ) {
@@ -325,42 +317,42 @@ void set_lang()
int main ( )
{
win_pos = get_mouse_pos ( 0 ) ; // Получаем позицию курсора
win_pos = _ksys_ get_mouse_pos( KSYS_MOUSE_SCREEN_POS ) ; // Получаем позицию курсора
if ( ! kolibri_libimg_init ( ) ) { // Загружаем libimg.obj
notify_show ( " Libimg.obj not loaded!' -E " ) ;
exit ( 0 ) ;
}
get_system_colors ( & sys_color_table ) ; // Получаем таблица цветов
_ksys_ get_system_colors( & sys_color_table ) ; // Получаем таблица цветов
char * C ity= NULL , * T oken= NULL , * U nits= NULL ; // Указатели на токен, название города, систему мер
char * c ity= NULL , * t oken= NULL , * u nits= NULL ; // Указатели на токен, название города, систему мер
get_config ( & C ity, & T oken, & U nits) ; // Загружаем конфиг
get_config ( & c ity, & t oken, & u nits) ; // Загружаем конфиг
set_lang ( ) ; // Установить язык приложения
U pdate( C ity, T oken, U nits) ;
u pdate( c ity, t oken, u nits) ;
uint32_t ( * event ) ( ) ;
if ( A utoU pdateT ime< = 0 ) {
event = get_os _event ;
if ( a uto_u pdate_t ime< = 0 ) {
event = _ksys_ get_event;
} else {
event = wait_for _event ;
event = _ksys_ wait_event;
}
while ( 1 ) {
switch ( event ( 6000 * A utoU pdateT ime) ) { // Получаем системное событие
case KOLIBRI _EVENT_NONE : // Нет события
U pdate( C ity, T oken, U nits) ;
switch ( event ( 6000 * a uto_u pdate_t ime) ) { // Получаем системное событие
case KSYS _EVENT_NONE : // Нет события
u pdate( c ity, t oken, u nits) ;
debug_printf ( " Weather: Update \n " ) ;
break ;
case KOLIBRI _EVENT_REDRAW : // Событие перерисовки
R edrawGUI ( ) ;
case KSYS _EVENT_REDRAW : // Событие перерисовки
r edraw_gui ( ) ;
break ;
case KOLIBRI _EVENT_BUTTON : // Событие кнопок
switch ( get_os _button ( ) ) {
case KSYS _EVENT_BUTTON : // Событие кнопок
switch ( _ksys_ get_button( ) ) {
case BTN_UPDATE :
U pdate( C ity, T oken, U nits) ;
R edrawGUI ( ) ;
u pdate( c ity, t oken, u nits) ;
r edraw_gui ( ) ;
break ;
case BTN_QUIT : // Кнопка выхода
exit ( 0 ) ;