From 0d9f958762fcc84038f6db53101858d91e6d0382 Mon Sep 17 00:00:00 2001 From: Christopher Mancilla <148826389+chmancilla@users.noreply.github.com> Date: Tue, 26 Dec 2023 13:34:26 -0300 Subject: [PATCH 1/4] Add files via upload --- autorun.sh | 12 ++++ testapi_full.py | 150 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 autorun.sh create mode 100644 testapi_full.py diff --git a/autorun.sh b/autorun.sh new file mode 100644 index 0000000..c0f0ee6 --- /dev/null +++ b/autorun.sh @@ -0,0 +1,12 @@ +#!/bin/bash + + +sudo python3 testapi_full.py +cd pantallas-led/GenPoster +#docker build -t bus_poster . +./run_container.sh +cd example +sleep 4 +feh poster.png + + diff --git a/testapi_full.py b/testapi_full.py new file mode 100644 index 0000000..3d4a439 --- /dev/null +++ b/testapi_full.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 + +import requests +import json +from datetime import datetime, timedelta + +# URL de la API para "autentificación" +url_auth = 'https://transporte.hz.kursor.cl/api/auth/' + +# Datos para autentificar +auth = '''{ + "username": "usuario1", + "password": "usuario1" +}''' + +# Request +token = requests.post(url_auth, data=auth) + +# Estado de la respuesta +if token.status_code == 200: + # solicitud exitosa + print('Respuesta de token exitosa!') +else: + # Error en la solicitud + print('Error en la solicitud del token:', token.status_code, token.text) + +token = token.json()['token'] + +print('-----------------------------------------------------') +print('Token Obtenido: ' + token) +print('-----------------------------------------------------') + +#-------------------------------------------------------- + +# URL de la API para info del paradero +url_whoami = 'https://transporte.hz.kursor.cl/api/dispositivos/whoami/' + +# Datos de la solicitud +data_whoami = { + "whoami": { + "idDispositivo": "pled30-gtr", #Aquí dejaron esta id por defecto.... + "KeyAuthorizacion": "token" #Autentificacion de mentira sisisi (la real está comenta después de esta variable + } +} + +#Aquí se ingresa el token obtenido anteriormente +headers_whoami = { + 'Authorization': f'Bearer {token}', + 'Content-Type': 'application/json' +} + +# Request +response_whoami = requests.post(url_whoami, json=data_whoami, headers=headers_whoami) + +# Estado de la respuesta +if response_whoami.status_code == 200: + # Solicitud exitosa + print('Respuesta API "whoami" exitosa') +else: + # Error en la solicitud + print('Error en la solicitud de API "whoami": ', response_whoami.status_code, response_whoami.text) + + +Paradero = response_whoami.json() +#print(json.dumps(Paradero, indent=4, ensure_ascii=False, sort_keys=True)) + +print('-----------------------------------------------------') + + +# URL de la API para obtener los datos de los recorridos +url_getinfodevice = 'https://transporte.hz.kursor.cl/api/dispositivos/getInfoDevice/' + +# Datos para la solicitud +data_getinfodevice = { + "GetInfoDevice": { + "idDispositivo": "00000000160f3b42b8:27:eb:0f:3b:42", #Para esta solicitud, pusieron la id del equipo que les dimos + "KeyAuthorizacion": "tokenSinUso" #Autentificacion de mentira sisisi + } +} + +#Aquí se ingresa el token obtenido anteriormente +headers_getinfodevice = { + 'Authorization': f'Bearer {token}', + 'Content-Type': 'application/json' +} + +# Request +response_getinfodevice = requests.post(url_getinfodevice, json=data_getinfodevice, headers=headers_getinfodevice) + +# Estado de la respuesta +if response_getinfodevice.status_code == 200: + # Solicitud exitosa + print('Respuesta API "GetInfoDevice" exitosa') +else: + # Error en la solicitud + print('Error en la solicitud de API "GetInfoDevice": ', response_getinfodevice.status_code, response_getinfodevice.text) + +info = response_getinfodevice.json() +#print(json.dumps(info, indent=4, ensure_ascii=False, sort_keys=True)) + +print("----------------------------------------------------------") +print("Cantidad de buses con llegada registrada en este paradero:", len(info["GetInfoDeviceResponse"]["DetalleLineas"])) +print("----------------------------------------------------------") + +#Haciendo una lista de todos los buses de este paradero + +data_main = [] +hora_actual = datetime.now().time() + +for i in range(len(info["GetInfoDeviceResponse"]["DetalleLineas"])): + + data = info["GetInfoDeviceResponse"]["DetalleLineas"][i] + + bus_info = {} + bus_info["distance"] = data["Llegadas"][0]["DistanciaGPS"] if data["Llegadas"][0]["DistanciaGPS"] is not None else "-" + bus_info["timeLabel"] = data["Llegadas"][0]["EstimadaGPS"] if data["Llegadas"][0]["EstimadaGPS"] is not None else "-" + bus_info["route"] = data["Descripcion"][:-1] if data["Descripcion"] is not None else "-" + bus_info["direction"] = data["Descripcion"][-1] if data["Descripcion"] is not None else "-" + bus_info["number_background_color"] = data["colorFondo"] + bus_info["letter_background_color"] = data["colorTexto"] + bus_info["patente"] = data["Llegadas"][0]["patente"] + diff = timedelta(hours = datetime.strptime(bus_info["timeLabel"], "%H:%M:%S").time().hour - hora_actual.hour,minutes = datetime.strptime(bus_info["timeLabel"], "%H:%M:%S").time().minute - hora_actual.minute,seconds = datetime.strptime(bus_info["timeLabel"], "%H:%M:%S").time().second - hora_actual.second) + bus_info["timeRemaining"] = int(abs(diff.total_seconds() // 60)) + data_main.append(bus_info) + +#Cálculo del tiempo estimado de llegada para cada bus + +data_time = sorted(data_main, key=lambda x: x['timeRemaining']) +#data_time = data_main + +print("Buses ordenados según hora de llegada:\n") +print("Hora Actual (CL): ", datetime.now().strftime("%H:%M:%S")) +print("Paradero N°", Paradero["WhoamiResponse"]["NroParadero"], Paradero["WhoamiResponse"]["NombreParadero"],"\n") + +for n in data_time: + #print(n) + print("Recorrido:",n["route"],n["direction"],"| Patente:",n["patente"],"| Tiempo restante de llegada:", n["timeRemaining"],"minutos.") + +print("--------------------------------------------------------------") + +#Exportando datos + +#def export_data(): +# data_x = (data_time[0],data_time[1]) +# return data_x + +#data_x = (data_time[0],data_time[1]) +#print(data_x) + + From 8d77225beef5131fa0e626cad41d088a994f04ca Mon Sep 17 00:00:00 2001 From: Christopher Mancilla <148826389+chmancilla@users.noreply.github.com> Date: Tue, 26 Dec 2023 13:40:39 -0300 Subject: [PATCH 2/4] Add files via upload --- .../__pycache__/import_data.cpython-310.pyc | Bin 0 -> 2542 bytes .../__pycache__/import_data.cpython-38.pyc | Bin 0 -> 2435 bytes GenPoster/app.py | 46 ++++---- GenPoster/example/poster.png | Bin 944 -> 13857 bytes GenPoster/example/poster_40_160.png | Bin 3954 -> 3061 bytes GenPoster/import_data.py | 98 ++++++++++++++++++ .../__pycache__/BusPoster.cpython-310.pyc | Bin 0 -> 2225 bytes .../__pycache__/BusPoster.cpython-38.pyc | Bin 0 -> 2185 bytes .../Poster/__pycache__/MyDraw.cpython-310.pyc | Bin 0 -> 3791 bytes .../Poster/__pycache__/MyDraw.cpython-38.pyc | Bin 0 -> 3762 bytes .../TimeAnnouncement.cpython-310.pyc | Bin 0 -> 2376 bytes .../TimeAnnouncement.cpython-38.pyc | Bin 0 -> 2336 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 160 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 122 bytes 14 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 GenPoster/__pycache__/import_data.cpython-310.pyc create mode 100644 GenPoster/__pycache__/import_data.cpython-38.pyc create mode 100644 GenPoster/import_data.py create mode 100644 GenPoster/scripts/Poster/__pycache__/BusPoster.cpython-310.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/BusPoster.cpython-38.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/MyDraw.cpython-310.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/MyDraw.cpython-38.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/TimeAnnouncement.cpython-310.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/TimeAnnouncement.cpython-38.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/__init__.cpython-310.pyc create mode 100644 GenPoster/scripts/Poster/__pycache__/__init__.cpython-38.pyc diff --git a/GenPoster/__pycache__/import_data.cpython-310.pyc b/GenPoster/__pycache__/import_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34bbb7860debe9ea697dea55bb4cd0e2181fe6b3 GIT binary patch literal 2542 zcmb7FUvCpf5Z}GK*cbl^&OeBOl#7W8fg}zI0%S$Blu(LF5h9d_ld5R#o!FP0@66tr zB-g@A;E_*IDkbVurGA9I^sV2Z(!Ta7AEAAK&YmxSjG$`Q+V$+rZ)av_XXgBTK0|Q4 zn0*1)3WWTrHphpFo6m3tziNbV!l_H_?mx9D?lo6yX|~qVZJiRX+Xgr6J|OEUFrbh3 zz1HkBq}NTJ+R#K9`gwYXQsS9NnTn4yvx6rgy-W89?=KQN%`~cB zK>7#rqsCA0!W+%b$NIC7gFGL6t=j`IkXU$vdWQ}z3@bj)u7v?*!9Kx9>;fO1G(VgKDJ`3g!iEUxYB%jOI2vBJjmr-L0^;Q(>L3S&6FOWh@+}P5{DVEhtqL-C@G< zuasuGvNj8XO<(XHS?2jPl?Ga8`@f?v(V0gOv^x-l%;I2${swp!Y&oGHu!+dJBZMz3 zWVy@=eAlTvVTU8o?INqPFFq07_%EJw2k#U(q4UfSDw|E8wVaAfb%`j`c7ZR>&o)AV z;mJFE`3NlwU%~b*ytgl$h}9k6i_)J16CkXpz}ju}i-pLotOvfQP9I_wH_F}iy%4-` z_VIQbP;4leOgDjX5JB|GQ3P&1yl0iV4wVj~5KVn72-b0U)rvm--$7_Vc+Xq&m*JUH zhl8P_wd!K6dUZi&Da)dQVj?IoiWfHheDtnO}yGxh~vyJYaz|@4L`o9H|_>T*$n-!|py@k#rVwy~_ZZ zy%S)zBT7l)#J|sK;L7YW1a;xG)zj|3!y)^G-wClexFevhUQuT1zUzxGe2@F`l-Ft1 zK&;kSeWQU$kFUnk1oRlTLIk-Gh93f@+gN*;5s_K`vReMST3(sfWna_BGLz|+{V1Eg#MCMhIK7tl=JjZL)sVd`SC>p;@5&zJFz5&~HBoBvjOvf2JHiASLJBBN^-8JnwI*Lx}4}=2ls|B_6D^siL zwzx^fn`54fDMZOEY#n;FiHyL&r9cfTW|fjl(iHGiwUj_)ks*|yLU|(1j&N611CvH~ z#eNWqloDkzXTnZ^@5n*+wT0t_(g^V(Wkwz97NyL_9wnQBq=FBGCq$B)2MqHe6RO62 zIjD3ru;F60@wnRLP^_w#H+rD4mwob3aWCIc>XMMD)R4O8Z=%<#t!J@Wu~k+NJIuvw zW?loN?t&+&BUHSkS;O1L3QUYaJ3eHnB$TOc4$4$F1+iN@Yim+h5z$#Kz-06>Syqz- zl_~6i;Bkbj4+a;PRk+nl9A#XWiXYEhYWck5!cFzyfrpE!nG|17H}rv2M$c#kJ*OFc ynxRpR8gGqvX1_*LZwracMBGPZnqlPVm{vf*44t8q)S@~3jnF4_4F3y8&iDs*fA6*c literal 0 HcmV?d00001 diff --git a/GenPoster/__pycache__/import_data.cpython-38.pyc b/GenPoster/__pycache__/import_data.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..788ef28082d22b586a7e0a1f1d40ba3d2d779a16 GIT binary patch literal 2435 zcmb7G&2QT_6elTJmMuGR)6WzrkQFU34^5nYpzRE!`)IaqSQivcI~2kOgBBS_i7dG! z-8P;C3`lqEu=Cad$#K_R_h0O&>rOfEw!^wd+D_uOhm8g)^1UD5<0IdPA6Bbn1nvFb zzvJ)DAoQnR9Bl*^A3~Qc7#LzWLjLHBeGF?7ksk3$&+;vdn8obp$hTR6Iq)s8B6H#E zFuaE9rG1cqR_i2p8C6_`J)W2J$ath^pqZ0ag-HSWZRqkR7#Pk#RfZMX#3@QKvtE#l zq-2-uA!g5`jIcsxF$Wad%za5hoY}0DlAqBpgq4~1l4J$5*GlcQz$!1S%t;-+J1eqk z=CT5$*2Qa()to8lXGR>!#w zmq_!1O15}By!l^Fz(P2i3|06fk&UMt3GIaq-x*DY<$lE3)#b&m5_RHNL$-2=_G@48 z?T_I6i3o=@2$OhN{Fqb0#lo;g`~4^kr~+zZQzkLIZ}kAHsl&?cBvw3Dix0N@9N4yo z<;4w785eT+!T&ycm#fd?^<;%V2?O5nt9OpBhwm(p+vV%a>sLG1u5@lTuiR+zPIGy^ zd9~BLcE$J1t*wReLz&dA+!g%sfJ-HF8!kwRB6wWAn!5uLwe_>*wjPD{NWZL!qdW6G z{RET6%-EjEdRB0_?pX2(!M#U?wm9*RX&GQd2u3htgg<9QP18S(H{!Oj5d{o|$uy3kF`J_k-0>3H46d&oo!QI@h(h~#;Q9KTOlc*pk7P$C%#$W9H2J z9!@mIRHiV0j4|E;ziRk1^9Xd$nt9F4kD2-8%yWh|*Fp;N&aOUZ3A7&HGZ|~Mn3B!n z8T1y83mo^Y9LQ#yr89_~(78*Ml?VB&0@?56S#y`5;S`(z?^e^o9>(bLg;Xcq)2sf; zJ4eIg{@5%1>Izphium0y=2ZIb-H3N7qf+Qc^(zqmipD`m@7!C<@gn5x5rO;OClazY zKsCoC@Vm6bBi~!$G7w>3=ZF1Q(DH&v1`3iq3k45!D)7re5+&l(BxXr|Iv(^oT(mnh z*y;i@W^KbAgC6i_3P2H8>TRH6A8H7sm7#m_v*yJwn-|w0kP90LIO!e@XZ76B7z z;G}6)2UYbNEEL*78B$PDcQC{%fx3zrd2Y%$cp21J9eXf3^JtwwoLb;f#nq{>*WRM< zaSgiE@jnV?0FqU44%WsFs8{&e>t?yFi1s>+-f9EvFX(7^jz2rhSgj}tXe4hfO>hsO zcvxF}J1+|U1WE@tzPhiEP`6A*GDgGm=n~B8c8(v3_kin<9>Bb$W8UJ8!+1wDe+^rt z`CEh??BY36!{UZkQWPclnEGIx$9T!1Vgov2rOw2{yrA3aC2SD!TiUIRXcq+6h}&}K F{{_gJl1cyo literal 0 HcmV?d00001 diff --git a/GenPoster/app.py b/GenPoster/app.py index 752231c..7b4b2d8 100644 --- a/GenPoster/app.py +++ b/GenPoster/app.py @@ -3,6 +3,7 @@ from scripts.Poster.BusPoster import BusPoster from scripts.Poster.TimeAnnouncement import TimeAnnouncement import numpy as np from datetime import datetime, timedelta +from import_data import export_data from PIL import Image def reescalar_imagen(input_path, output_path, nuevo_ancho, nuevo_alto): @@ -47,7 +48,7 @@ def approx_km(data): return approx_km def calc_remaining_time(data): - arrival_time = data["timeLabel"] + arrival_time = data["timeLabel"][:-3] target_time = datetime.strptime(arrival_time, "%H:%M").time() current_time = datetime.now().time() @@ -87,18 +88,25 @@ def obtain_min_max_time(remaining_time): def main(): # Carga los datos - data = load_data() + #data = load_data() + data = export_data() + data1 = data[0] + data2 = data[1] + + print(data) # Calcula el tiempo restante a la llegada - remaining_time = calc_remaining_time(data) + remaining_time1 = calc_remaining_time(data1) + remaining_time2 = calc_remaining_time(data2) # Obtiene valores máximos y mínimo de rangos para desplegar en pantalla - min_time, max_time = obtain_min_max_time(remaining_time) + min_time1, max_time1 = obtain_min_max_time(remaining_time1) + min_time2, max_time2 = obtain_min_max_time(remaining_time2) # Selecciona el tema - theme = 'day' + theme = 'night' # Alto y ancho de la imagen en pixeles - # height, width = 40, 160 + #height, width = 40, 160 height, width = 200, 800 # Inicia el dibujo y setea el tema @@ -112,7 +120,7 @@ def main(): time_anmc1.start_draw() # time_anmc1.set_background() # time_anmc1.set_base_text() - time_anmc1.set_min_max_text(min_time=min_time, max_time=max_time) + time_anmc1.set_min_max_text(min_time=min_time1, max_time=max_time1) # Agrega el anuncio de los minutos restante al arribo time_anmc2 = TimeAnnouncement(aprox((2/5)*height), aprox((1/3)*width)) @@ -120,8 +128,8 @@ def main(): time_anmc2.start_draw() # time_anmc2.set_background() # time_anmc2.set_base_text() - time_anmc2.set_min_max_text(min_time=3, max_time=5) - + time_anmc2.set_min_max_text(min_time=min_time2, max_time=max_time2) + # Genera la imagen de la linea del bus poster1 = BusPoster(aprox(1.1*(1/3)*height), aprox(1.1*(1/3)*width)) poster1.set_theme(theme) @@ -140,9 +148,10 @@ def main(): poster1.set_params(bus_announcement_1) poster1.load_barlow() poster1.set_colors() + # Se setea la ruta y la direccion en la que va - poster1.set_bus_number(bus_number=data["route"]) - poster1.set_bus_letter(bus_letter=data["direction"]) + poster1.set_bus_number(bus_number=data1["route"]) + poster1.set_bus_letter(bus_letter=data1["direction"]) # Genera la imagen de la linea del bus poster2 = BusPoster(aprox(1.1*(1/3)*height), aprox(1.1*(1/3)*width)) @@ -163,27 +172,24 @@ def main(): poster2.load_barlow() poster2.set_colors() # Se setea la ruta y la direccion en la que va - poster2.set_bus_number(bus_number="16") - poster2.set_bus_letter(bus_letter="H") + poster2.set_bus_number(bus_number=data2["route"]) + poster2.set_bus_letter(bus_letter=data2["direction"]) # Se agregan todas las imagenes al canvas full_panel.add_image(time_anmc1, (aprox((0.6)*width), aprox(0.05*height))) full_panel.add_image(time_anmc2, (aprox((0.6)*width), aprox(0.45*height))) full_panel.add_image(poster1, (aprox((0.05)*width), aprox((0.1)*height))) full_panel.add_image(poster2, (aprox((0.05)*width), aprox((0.5)*height))) - # full_panel.add_image(bm, (aprox(0.02*width),aprox((1/6)*height))) + #full_panel.add_image(bm, (aprox(0.02*width),aprox((1/6)*height))) full_panel.get_image() - input_path = f'/app/example/poster_{height}_{width}.png' - full_panel.save_image(input_path) - # Ejemplo de uso: + full_panel.save_image('/app/example/poster.png') nuevo_alto = 40 # Reemplaza con el alto deseado en píxeles nuevo_ancho = 160 # Reemplaza con el ancho deseado en píxeles - + input_path = f'/app/example/poster.png' output_path = f'/app/example/poster_{nuevo_alto}_{nuevo_ancho}.png' reescalar_imagen(input_path, output_path, nuevo_ancho, nuevo_alto) - if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/GenPoster/example/poster.png b/GenPoster/example/poster.png index 80be3c15f6afb2610310f70725452340e063d3a4..d14433ef94e86ea7f3b2089cce231ad7ecd85401 100644 GIT binary patch literal 13857 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

;%Z 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 diff --git a/GenPoster/import_data.py b/GenPoster/import_data.py new file mode 100644 index 0000000..89a6b8c --- /dev/null +++ b/GenPoster/import_data.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 + +import requests +import json +from datetime import datetime, timedelta + +def api_request(): + # URL de la API para "autentificación" + url_auth = 'https://transporte.hz.kursor.cl/api/auth/' + + # Datos para autentificar + auth = '''{ + "username": "usuario1", + "password": "usuario1" + }''' + + # Request + token = requests.post(url_auth, data=auth) + token = token.json()['token'] + + # URL de la API para info del paradero + url_whoami = 'https://transporte.hz.kursor.cl/api/dispositivos/whoami/' + + # Datos de la solicitud + data_whoami = { + "whoami": { + "idDispositivo": "pled30-gtr", + "KeyAuthorizacion": "token" + } + } + + #Aquí se ingresa el token obtenido anteriormente + headers_whoami = { + 'Authorization': f'Bearer {token}', + 'Content-Type': 'application/json' + } + + response_whoami = requests.post(url_whoami, json=data_whoami, headers=headers_whoami) #Request + Paradero = response_whoami.json() + + url_getinfodevice = 'https://transporte.hz.kursor.cl/api/dispositivos/getInfoDevice/' # URL de la API para obtener los datos de los recorridos + + # Datos para la solicitud + data_getinfodevice = { + "GetInfoDevice": { + "idDispositivo": "00000000160f3b42b8:27:eb:0f:3b:42", + "KeyAuthorizacion": "tokenSinUso" + } + } + + #Aquí se ingresa el token obtenido anteriormente + headers_getinfodevice = { + 'Authorization': f'Bearer {token}', + 'Content-Type': 'application/json' + } + + # Request + response_getinfodevice = requests.post(url_getinfodevice, json=data_getinfodevice, headers=headers_getinfodevice) + info = response_getinfodevice.json() + + return info + +#-------------------------------------------------------------------------------------------------------------------------- + +#Haciendo una lista de todos los buses de este paradero + +def lista_buses(info): + data_main = [] + hora_actual = datetime.now().time() + + for i in range(len(info["GetInfoDeviceResponse"]["DetalleLineas"])): + + data = info["GetInfoDeviceResponse"]["DetalleLineas"][i] + + bus_info = {} + bus_info["distance"] = data["Llegadas"][0]["DistanciaGPS"] if data["Llegadas"][0]["DistanciaGPS"] is not None else "-" + bus_info["timeLabel"] = data["Llegadas"][0]["EstimadaGPS"] if data["Llegadas"][0]["EstimadaGPS"] is not None else "-" + bus_info["route"] = data["Descripcion"][:-1] if data["Descripcion"] is not None else "-" + bus_info["direction"] = data["Descripcion"][-1] if data["Descripcion"] is not None else "-" + bus_info["number_background_color"] = data["colorFondo"] + bus_info["letter_background_color"] = data["colorTexto"] + bus_info["patente"] = data["Llegadas"][0]["patente"] + diff = timedelta(hours = datetime.strptime(bus_info["timeLabel"], "%H:%M:%S").time().hour - hora_actual.hour,minutes = datetime.strptime(bus_info["timeLabel"], "%H:%M:%S").time().minute - hora_actual.minute,seconds=datetime.strptime(bus_info["timeLabel"], "%H:%M:%S").time().second - hora_actual.second) + bus_info["timeRemaining"] = int(abs(diff.total_seconds() // 60)) + data_main.append(bus_info) + + return data_main + +#-------------------------------------------------------------------------------------------------------------------------------- + +#Exportando datos +def export_data(): + X = api_request() + data_main = lista_buses(X) + data_time = sorted(data_main, key=lambda x: x['timeRemaining'],reverse=True) + + data_x = (data_time[0],data_time[1]) + return data_x diff --git a/GenPoster/scripts/Poster/__pycache__/BusPoster.cpython-310.pyc b/GenPoster/scripts/Poster/__pycache__/BusPoster.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e091fc52dc6053a752ab9f2032278e0ca945bbb GIT binary patch literal 2225 zcmai#&2Jnv6u@nd=QER#L{XczT&SQhQX!OYAw*FrRFNR9!~tn8quI6hBh2hvQM_d9XA_tFVsp*v-=_ z$ybCgf-0@kJf-9g5uu0;AYf_m?ISeqLT{;|AvXO92ubiSTHZF>8Rcc)n$Ke;!;n?V%dH2+_cgBwt`jDbC=v6`=Z=KDaxv=yXd@u~*`4U(C3}Q<5 zAq*~&8Fd;1jXBK&&2t(Dje|z_8Q}Fn^QLqgS8{y!_!R8`{3SA_i2Nx8%z{1c=WW5< z(i+_H+!}!w8SmNj!BCh%(P@;x+Z?NA+$b|_M)qPQ4NxgMW%q}^Y9=F5bepPC_Tp$# zcm88SAv3!%b})--IFjvx6TFCwTi%1qw_!6eIA?u#vJF%zh7+9ymXB4fEk~4g!yPC^ zp=8&TqkbjTHtrq_9NUfoj6R)6Y zqNQmqHTLy25D9I6fp>v28o|S8@OKbiUg+^)DFjY8vFyf;F2=~q2DO0%@VGGe2^2x+ z*f9VQCw;~YU_PKn6yS3K;Q$gs0U&bWyB+}FCXCJeSz!1x3=GJ4m?8TC;P$qmhFl>> z)Xn*=zD;J~6hfrOW)awh`_VL-(kX@r74cJ!l>~wy*|UD90?6+EPSABn@&r>)q37;S zPoBSc@#2`N3ormEp=cb(>N3v0g(G2Knog&AXgzI|Wuvk69YTjqU2%(yd}y-Rv9d{L zqKh_=Y=RRl1LuQ{-GJLJ!IO$MR92k+G6I@j57D(#t8N8^-VkH=JmWPqJUj3W@J6HS z95}DDtModJSl}o#%4zTq4 zVvqnBK)3nnBUA@En1v1|?lMPwL`CGr0>KgX7P&}fk%*_!77+B)w^hR z1I2qN-be8PiVsnoOTAMp?KU5SiGCFXCLgEk^eVkZQ~Lj4+T|HlS79-{aHA};QBjOa zC=!KDilT1Bq(VI{iu;qYYG+(kSFeG+`Uu6RAnfY=5j26jNys!33{Z*1dVgAv+bXoy_61=2mX)WnS%PzLh=5K^Cm6@hYsNEVlc+ zO0qTKi=ayDG)p=AiiuD}2TVj|`q0hR1;5RD@i9EJ-5xjLjr+P(H^1#UCcar0qw;fE z+&y8xY$m$r8sDx<7bhfze#}8|H2CH|DGwm63{s?_J_0EjeNyH;VnZ&ta1Nr(6|V3O zSmuc}5s2`BXTC^9ED~_RBj&LzM2PDqzA;s|8l_7)Adk-n@eU@rQFPIoJ!DV#A;TfQ zi|_E&v@NAclrE&s1wuryo+_*15jSz352`|`JU?Q8UEVI*c3TbPxYcUA^R<2I^;&yh zlKqq%kw?ZKY%X>e=2yb=p%-F)hN*rAnX!F9e1Xlm&CoRW( zS=6fM%QbAuvqUyPvXoqP-t%fjn#ePxWywq6kQ}A%G!@C}DhT6A_qYK+#~mJFI)4XY zz%MSOU?l}kjTmQVXJB)L3}K+|S%7KN;3qJGpTJHDKydOWjt0yR`5_1RotJ3W5-?Afy;N1nq1phQDBisePxr5iKh zsMP&_bI-U+OXEyh<68(VZ1R#lq|1A{7h9}M(x0llOC*!fMu&lo!NhjKnoG!2-lfW# z<)3FjGaM3h-PXE2fz%sQ?!Jie8B$z0d;`%a3Y~F}C(c=Zg}?1YJRp?uc>e_9gRQ0V zUO8;|7c1~mUpR&L7YG&_s`9S3Ey%*{s(J}%f94a!pa2*^clGHLs21p89$GNT$_d1W zTts#)5FUZO$6qGPlWzcX8q*HFeuSO@};1u{Yz>RG6Ess6)};My3x7hWxLutV;zH@{x|HYGJgvr!kitr|4LKK?Jnnc(E@wv{$MsssO>x1cNOH)72%MYCvO(Z}7_ UeL@XbQ5THRvQpgNCMY=PUncSb6aWAK literal 0 HcmV?d00001 diff --git a/GenPoster/scripts/Poster/__pycache__/MyDraw.cpython-310.pyc b/GenPoster/scripts/Poster/__pycache__/MyDraw.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1b6e571e30fdb64c5454f616c44acc9543c96ec GIT binary patch literal 3791 zcma)9OK%*<5uTpc&Mub}Nl}($IrjLGNSjz>9zfyt0`FYR_?A*sZ?1d{h zmNoLI*R*t&wR#&591)1{nIpodZm%uaW2e*jH|}z}9cCK$PqnNb{=Vay=EIyH$&VC2 znS#G9M!Msfz~UA0seBB5+PnPBC3ps`bcpMoE0}PfIXzE!!pGMaZ;4Pep0QpaBGCjU z6fLoVZ$q@jCccr_5|{98idgK3U94=0%VH0h4RJ-hhHo2ZTou%eS@8{!Ro zFNwFs_r#l^Y>NQ$y<@^pPDzqJ@iu!1cJclOZ?%nK!X{4QOk9lM`LXkYb)koFDAS{% zHo-|M^biX0E13;cgbk{R;f13%@cH)M!LZ2XL4TO@Q9sQxeo*p}<^ZbOnG^>Pl10Hke>RO4Gm_63|^ zD!SSwBAISQYR#2SXxU{@D$-HJTI`y;wIcg`)rv=vj_9?bzX@Q%o;w%Lxi|6DCIo}n z6K~>P*yx?v#WT$#scTIuV%P*Fho5x(+CpA&cx9xmwF2uY6oRjdKD95)hy~daPJZR9SmnPN#<&M$^VE8YXq`i9oCCLV8$<1UdaXwmb;-B|>iEkVDjA37E~`j@wl~z&b?f zR#iI}KTYyNNV8qfN0fvtX2!Tr+IpYSK5}e z`%}E%5U;N5GM7dF@q@D~vpln+j{k#URG1}(gRXj?t|oOD|48vub(`itrXi+b)$r;T zaCZp*6AWipSGZUhVa41YR?bu2&oL3~97)Zlyf(_zPVsDkL9#o0 z_kfq>0k2@8>R^D1TOHizDl1NIevh&1vcU+Lak^J zm7BtdBi5A zM(ER~XP*>r{Jtv6PEhCQhAzsaKh~yoSZH131TU4LRSz>Q+FGaS&v5Qkgx8k~%wolg z6qL~C5&D;PDZu*;=RAPpG1S}FCXk4}8jkmr{Rz@x&eY8*{^o?8huVY8!42mrJ8z7x zOm}`@S1|PfsO}`#BWgHtvBIZ41X+#wlW@`)z{)l|P$TJ${|rsF;^}kmc#Px~%PiJB z=l}Ry5epe-Jhmll6z8cNX~nA;9g_x3v??y4oI>?c>twY*KWYx#Q%BXE`HU{Ir^UBE zefVhqAvHMl*truwn%~4@h3LuUsKT*aEsmxA$S+h$Yvl#u{ zu!vEHrB0ua43*@fc;z8=ulVvQV1;LTtoZsdeD#>QV4q8@9<52bCgQS$%kqh(L%U~p zKaz)XS*=`wml(<@s(3u&wN0vct{*I($+`~*w>{K{@HNx=f@fp-u~O86K~E-B(k7v( zj)L~GCe7w_R;y$Y4W`YjQucMCI2sz$M8{U^-n0muE?*0oc70PFG+$8Ayn&(Jj@Y(K zFZDRv$N{L(fOqkpU7lux<(;!eqb{}GZfA#jZfbv%#IzDBuj7p1c9MKG=2=Zq_?_mc z9U89DK%JeUZpZc|>iYyyN>NnGZ2eHbAm~>#P)b$5qhTSEg(%G`>a^%bL`7#tXx5^j z~#<;s;sX3Gd`wmsz2+^bkKS t2r^;)RllS?!DyW0Cx<&K?ZL0&&O~=>g?vcq&;CRr7TeJD9>xfI{vUEmUM&Cs literal 0 HcmV?d00001 diff --git a/GenPoster/scripts/Poster/__pycache__/MyDraw.cpython-38.pyc b/GenPoster/scripts/Poster/__pycache__/MyDraw.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..015a20421c578c97680cf8802d1bb65a267ad7fe GIT binary patch literal 3762 zcmb7HNpBp-74GV7dWJ)aq!w$j?6#Ce<2WP`jj#kut*H63h@o$%EVCn<(U_AunH#y87kQ@dqVGrk${0&K zSrBy%pQXKM;|oi8!hd54|Fs?U1$$u)I{(C3)^Nb;&eKyZt7l&g?7I6bh#Yf^jaT}aXaYx+6$dbgTj_P+c_dEVY5pzwYnzvfQsmDk*if|8-GmsrH*=_sY{ch~p$rbR3iU zD<6%;eEiO?wR2|t5n-A=L=(;hM(fym%ckstkwsrvssk=idI?!8ax4By4s1n-)WJAO zWzI8c05(mZ7(JR5n-$m4ugHuR>$9_+7R!P^yadO?Tm$C`h$$5HGEloyz!L0^b4;t<`UfDU?5%ZSojX%U-GyKfd+JQ>3lo_$yEt|CQ0hk0iU3Dm$>A6S zx3Q2@92`eMSyYKmiahEYlf=4+xe)8{yBKSBx`&M_@;?jcUBbTI+HF2%#E9KKMAK`a zlji~M+;y0`fsuF209rpYAoQfLk1(e)j=6By8Sno&%NXqrHd{MM-NM)pmJXRoG*{mx zKb(gy*|7=TML@9HEmc;v?hyH{A6@bYh}W=wOlOmQDJmCnFz45f;HUo`L*o#Fy|gJ7 z$T66e2cQ^H#@p?ox{vJv-NVd>l&iEj`RSKZB$I4U>v7#BMqDLllrYG0QJ~dC>eEsx zN&=Bf69!HbyFa3lW=YBQ(YoJkqy-o8fjQ(Urnd6C@S9sUa>#Bg|I)Ne#vt)c79njL z!5}P^BG8U7MG2I<47cFI&oev(y3#YvM1UH*MipgO?1>dD6}pzqL&KNdUBzqO~U>SHk^xacadHeGghRa zkei_YYa&{QvMpHGh`NMNB%L(Mb( zx4#sjkYUP0Q_S)(OJuGUufmMy8Z_~$u!M37HA2;s)!uxoIq|7FtRByMbdcFCeDw9R z=X=lSs?)TC$Kmt&Njy}DolNExw&iNEEv-kEp;}@tap9vR*Pnz%N$2wvn|z*zJRcnu zAquk8$t#kfl3Wy5ZqnQcFYf{`_2as@0Qlu=aSBo7Bc|U>4tD7JO*i2a{{wJAKOz7C literal 0 HcmV?d00001 diff --git a/GenPoster/scripts/Poster/__pycache__/TimeAnnouncement.cpython-310.pyc b/GenPoster/scripts/Poster/__pycache__/TimeAnnouncement.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3792d0ff1add8164fc586e379b27d759270b2d01 GIT binary patch literal 2376 zcmbVNOOG5i5VqaV>FL?bl11zi6ebA>21q7Bhzn78Dp3S1k;thpt=_h0wm1ElxIIdC z=s6`)F60*=q}^k#T=^$HA#s|&kX)$p%+5Xn7rNEeRW7?+{`|RIbvglo=g;C7@kfi0 zztK4P*kF7GU#&oJ!f8&T#h*qLY?jl4MT}ybm0N`!*@Y81# z(Neu#m8x%P$FxfeMo3J3PC>v>_s4zgoPu@g!H)RUpMekrmlUyQWJo#X?5Q7F+~W3A z64{t0{GCODk^79;B=Rsl-Mya`;_I@kCS@uLQK}RtJ$g`Q@Zn7L1_(u-kOO*100P>O zm~jG8*tT@RhbyQjV@P-G|%RJZM-j$4I!qA=mj*O(+jV4 zJ5KGjm3lDhTO589L__w-9wG_r++&=9v^K~lw%f!y)_D#UZxCQ8$S1y?M~l)9i>wv zPa)+)gcVZ1g2CwwF@oc?MP`T-MNFPkideA&tD%Q10^1-IIZ$Z&Ji&r;1JGRTxU};M{=93nj^){zRVraw41_N0NPseJeoER(N2BDiN}ddidwhxD&YXM%&SN8eeCXygxcAG*;zT(jzRx;&*WPsBIeciWd{uT z35s{HxnUG5ZNU`vMG!U| zju76+i| zoEpOis7=5Jhad65oq5V`*b~bA2UK3=t(jG>LkoqL;DIAQ=WS^58~PjJVZ%Unez(oM z|7SLT)>6)aVIH!}un%p2#lB$aZ=LdcD}TEQnl=wM2{1H-KEYnQ2^*`y^)tT4&#f5R z-If;sGPB+D+o<7&$Q}wT8uAhfET~iOX75I?$jUhuwyA%scjG#mQ>&NsrZ%eb3U+=E zL_d@tp#C8WB%$ns&{kF|`4O5QqgWLViBvF5H00}d3=y>tF=GW+0%*x&qaBk|Ud4## zb`qe$32t_e8H_&mWRCST2IJcP_FLWaroF$WeJLJJM6GJgvPxq0(bm1Y zKOEor(o~=IB2nYKf@@(1?lsi3yZl?@912l6Dd4^{`-*4Jgg=pwLD$>?{>{buZXvbm RH%wAKz}Tf5AW_?3{{T9&El~gf literal 0 HcmV?d00001 diff --git a/GenPoster/scripts/Poster/__pycache__/TimeAnnouncement.cpython-38.pyc b/GenPoster/scripts/Poster/__pycache__/TimeAnnouncement.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd2cb8d646600c638f0332f7e56a67a8eb2a2c00 GIT binary patch literal 2336 zcmbVNOK%%D5GJ`#tyYeVxTxI}u9CD!)kho`J@gQyPoxOYx&fMA_Oe)sl)Uyn6fT9> z>gtpLxir6^C}1CR?X~}ervg3cFQk{wP_kq@?WMce*%=NwB)|DM{HfIn2t0q}Ka1ZR zg#3lZ`Nsz13-~Gpf)h?N63zcKqF}R(<}6|q+pNsW?a0oZ$T7AJwi~$@+GytGe$+62 zngvmlJKW8}Jd8q0z9rn_{xiaT5k9q|7NBlf5q0-dD#;R1bdWGTnHPCqwa# zOr9*%`(>fJmUc|Lv|xn9rOzk`80vn1jGg;nU3jn~KGmln1i>vu>^T`wPC0w#M;5oZ z{ftC5E))LFe1VbsoY*AtaCy4@D9y!}MNy86zQ{$P`Z(#?gF1r`XR0VU3!Bucx}r5cHPN4ucLHfWrIxkNtPdlf!PMLsG!$w-z*I#A+B#r-lX&vUKA zaxlQu&Rs1tVpLYCO3UIh2U>FuR3gT1TQEhn4T3=G0~*46gLSCSTtkNiA-u`M6TsPbv2g zsf>7IY85x2g+fbk=*WyWp`~5ZUkMLu2D0^=ZRY(yv-#78a!w5MkX?p-X!}d{1q*-U zg5O*En{`k(d9X=>U($a71gt z*M)Z%9hXW~8)=Gjn^}RWcp@r{L)eO`Arvn7SeucK-i`mAVFjQ0JLfz2mk;8 literal 0 HcmV?d00001 diff --git a/GenPoster/scripts/Poster/__pycache__/__init__.cpython-310.pyc b/GenPoster/scripts/Poster/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a7e55c3dd661cd650868a7569f75ae2920cffa2 GIT binary patch literal 160 zcmd1j<>g`kg59~*sUZ3>h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vRKO;XkRX;f+ zH!&|cGbblezaTNMBoW9c*3C&x(RWYH3&<}nNiEVZPAg`kg59~*sUZ3>h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2B=Ke3=dzc{%l rv!J9{KOn!jB(+FCK0Y%qvm`!Vub}c4hfQvNN@-529Z2J6AZ7pnp>P=n literal 0 HcmV?d00001 From 5309589a5c310434d785041d744abcaca8c976e2 Mon Sep 17 00:00:00 2001 From: Christopher Mancilla <148826389+chmancilla@users.noreply.github.com> Date: Tue, 26 Dec 2023 13:41:28 -0300 Subject: [PATCH 3/4] Update autorun.sh --- autorun.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autorun.sh b/autorun.sh index c0f0ee6..7f48ae5 100644 --- a/autorun.sh +++ b/autorun.sh @@ -1,7 +1,7 @@ #!/bin/bash -sudo python3 testapi_full.py +#sudo python3 testapi_full.py cd pantallas-led/GenPoster #docker build -t bus_poster . ./run_container.sh