mirror of
https://github.com/adrigongv23/G26---Telemetry-Software.git
synced 2026-08-25 19:43:16 +02:00
Compare commits
3 commits
4b58b1ec97
...
27026caf57
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27026caf57 | ||
|
|
f0db3a8aeb | ||
|
|
5f81e54793 |
301 changed files with 94618 additions and 3709 deletions
107
Pantalla/G26_v3.ino
Normal file
107
Pantalla/G26_v3.ino
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
#include "include/data_processor.hpp"
|
||||||
|
#include "include/can.hpp"
|
||||||
|
#include "include/g24_wheel_buttons.hpp"
|
||||||
|
#include "include/led_strip.hpp"
|
||||||
|
#include "include/crowpanel_controller.hpp"
|
||||||
|
#include "include/ajustes.hpp"
|
||||||
|
#include "include/guardado.hpp"
|
||||||
|
#include "lv_conf.h"
|
||||||
|
|
||||||
|
#include <LittleFS.h>
|
||||||
|
#include <freertos/FreeRTOS.h>
|
||||||
|
#include <freertos/task.h>
|
||||||
|
|
||||||
|
DataProcessor dataProcessor;
|
||||||
|
CAN canController;
|
||||||
|
G24WheelButtons wheelButtons;
|
||||||
|
LedStrip ledStrip;
|
||||||
|
CrowPanelController crowPanelController;
|
||||||
|
data datos;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("Starting setup...");
|
||||||
|
|
||||||
|
canController.set_data_proccessor(&dataProcessor);
|
||||||
|
canController.start();
|
||||||
|
|
||||||
|
set_data(&datos);
|
||||||
|
|
||||||
|
if(!LittleFS.begin(false)){
|
||||||
|
Serial.println("LittleFS corrupto o sin formato. Formateando...");
|
||||||
|
|
||||||
|
if(LittleFS.format()){
|
||||||
|
Serial.println("LittleFS formateado correctamente");
|
||||||
|
|
||||||
|
if(!LittleFS.begin(false)){
|
||||||
|
Serial.println("Error montando LittleFS despues de formatear");
|
||||||
|
} else {
|
||||||
|
Serial.println("LittleFS iniciado correctamente");
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("Error formateando LittleFS");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial.println("LittleFS iniciado correctamente");
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
|
||||||
|
crowPanelController.begin();
|
||||||
|
|
||||||
|
dataProcessor.set_led_strip(&ledStrip);
|
||||||
|
dataProcessor.set_crow_panel_controller(&crowPanelController);
|
||||||
|
//wheelButtons.set_can(&canController);
|
||||||
|
//wheelButtons.begin();
|
||||||
|
//ledStrip.begin();
|
||||||
|
// wheelButtons.set_led_strip(&ledStrip);
|
||||||
|
// wheelButtons.set_can_controller(&canController);
|
||||||
|
// wheelButtons.set_data_processor(&dataProcessor);
|
||||||
|
// ledStrip.set_mutex(canController.get_mutex());
|
||||||
|
|
||||||
|
//wheelButtons.ejecucion();
|
||||||
|
|
||||||
|
// wheelButtons.begin();
|
||||||
|
|
||||||
|
// xTaskCreate(wheelButtons.updateTask, "updateTask", 4096, &wheelButtons, 1, NULL);
|
||||||
|
|
||||||
|
// Initialize with screen 1
|
||||||
|
|
||||||
|
if(get_modo_oscuro()==true){
|
||||||
|
ui_theme_set(1);
|
||||||
|
} else {
|
||||||
|
ui_theme_set(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataProcessor::set_dataprocessor();
|
||||||
|
CrowPanelController::create_rpm_bar((get_rpm()/1000)*1000, get_desplazamiento());
|
||||||
|
|
||||||
|
lv_obj_add_flag(ui_barcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_tiraledsrpmcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
if(get_rpm_display()==0){
|
||||||
|
lv_obj_clear_flag(ui_barcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
} else {
|
||||||
|
lv_obj_clear_flag(ui_tiraledsrpmcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
int recepcion_datos=get_recepcion_datos();
|
||||||
|
lv_dropdown_set_selected(ui_recepciondatosdrop, recepcion_datos);
|
||||||
|
|
||||||
|
if(recepcion_datos==1){
|
||||||
|
canController.start_iracing_task();
|
||||||
|
} else {
|
||||||
|
canController.clear_rx_queue();
|
||||||
|
canController.start_listening_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
lv_timer_handler();
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
|
||||||
|
vTaskDelay(5);
|
||||||
|
}
|
||||||
231
Pantalla/PCA9557.cpp
Normal file
231
Pantalla/PCA9557.cpp
Normal file
|
|
@ -0,0 +1,231 @@
|
||||||
|
/*==============================================================================================================*
|
||||||
|
@file PCA9557.cpp
|
||||||
|
@author Patryk Wagner
|
||||||
|
@license MIT (c) 2016 Nadav Matalon
|
||||||
|
PCA9557 Driver (8-Channel GPIO I2C Expander) based on Madav Matalon PCA9536 driver
|
||||||
|
Ver. 1.0.0 - First release (24.10.16)
|
||||||
|
|
||||||
|
*===============================================================================================================*
|
||||||
|
LICENSE
|
||||||
|
*===============================================================================================================*
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2016 Nadav Matalon
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||||
|
documentation files (the "Software"), to deal in the Software without restriction, including without
|
||||||
|
limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||||
|
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
*==============================================================================================================*/
|
||||||
|
#include "PCA9557.h"
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
CONSTRUCTOR
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
PCA9557::PCA9557() {
|
||||||
|
// _comBuffer = ping();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
DESTRUCTOR
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
PCA9557::~PCA9557() {}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
PING (0 = SUCCESS / 1, 2... = ERROR CODE)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
// For meaning of I2C Error Codes see README
|
||||||
|
|
||||||
|
byte PCA9557::ping() {
|
||||||
|
Wire.beginTransmission(DEV_ADDR);
|
||||||
|
return Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
GET MODE (0 = OUTPUT / 1 = INPUT)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
byte PCA9557::getMode(pin_t pin) {
|
||||||
|
return getPin(pin, REG_CONFIG);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
GET STATE (0 = LOW / 1 = HIGH)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
/*
|
||||||
|
byte PCA9557::getState(pin_t pin) {
|
||||||
|
return getPin(pin, getMode(pin) ? IO_LOW : IO_HIGH);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
GET POLARITY: INPUT PINS ONLY (0 = NON-INVERTED / 1 = INVERTED)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
byte PCA9557::getPolarity(pin_t pin) {
|
||||||
|
return getPin(pin, REG_POLARITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET MODE
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setMode(pin_t pin, mode_tt newMode) { // PARAMS: IO0 / IO1 / IO2 / IO3
|
||||||
|
setPin(pin, REG_CONFIG, newMode); // IO_INPUT / IO_OUTPUT
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET MODE : ALL PINS
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setMode(mode_tt newMode) { // PARAMS: IO_INPUT / IO_OUTPUT
|
||||||
|
setReg(REG_CONFIG, newMode ? ALL_INPUT : ALL_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET STATE (OUTPUT PINS ONLY)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setState(pin_t pin, state_t newState) { // PARAMS: IO0 / IO1 / IO2 / IO3
|
||||||
|
setPin(pin, REG_OUTPUT, newState); // IO_LOW / IO_HIGH
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET STATE : ALL PINS (OUTPUT PINS ONLY)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setState(state_t newState) { // PARAMS: IO_LOW / IO_HIGH
|
||||||
|
setReg(REG_OUTPUT, newState ? ALL_HIGH : ALL_LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
TOGGLE STATE (OUTPUT PINS ONLY)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::toggleState(pin_t pin) {
|
||||||
|
setReg(REG_OUTPUT, getReg(REG_OUTPUT) ^ (1 << pin));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
TOGGLE STATE : ALL PINS (OUTPUT PINS ONLY)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::toggleState() {
|
||||||
|
setReg(REG_OUTPUT, ~getReg(REG_OUTPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET POLARITY (INPUT PINS ONLY)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setPolarity(pin_t pin, polarity_t newPolarity) { // PARAMS: IO0 / IO1 / IO2 / IO3
|
||||||
|
setPin(pin, REG_POLARITY, newPolarity); // IO_NON_INVERTED / IO_INVERTED
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET POLARITY : ALL PINS (INPUT PINS ONLY)
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setPolarity(polarity_t newPolarity) { // PARAMS: IO_NON_INVERTED / IO_INVERTED
|
||||||
|
byte polarityVals, polarityMask, polarityNew;
|
||||||
|
polarityVals = getReg(REG_POLARITY);
|
||||||
|
polarityMask = getReg(REG_CONFIG);
|
||||||
|
polarityNew = newPolarity ? ALL_INVERTED : ALL_NON_INVERTED;
|
||||||
|
setReg(REG_POLARITY, (polarityVals & ~polarityMask) | (polarityNew & polarityMask));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
RESET
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::reset() {
|
||||||
|
setMode(IO_INPUT);
|
||||||
|
setState(IO_HIGH);
|
||||||
|
setPolarity(IO_NON_INVERTED);
|
||||||
|
initCall(REG_INPUT);
|
||||||
|
endCall();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
GET REGISTER DATA
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
byte PCA9557::getReg(reg_ptr_t regPtr) {
|
||||||
|
byte regData = 0;
|
||||||
|
initCall(regPtr);
|
||||||
|
endCall();
|
||||||
|
if (_comBuffer == COM_SUCCESS) {
|
||||||
|
Wire.requestFrom(DEV_ADDR, NUM_BYTES);
|
||||||
|
if (Wire.available() == NUM_BYTES) regData = Wire.read();
|
||||||
|
else {
|
||||||
|
while (Wire.available()) Wire.read();
|
||||||
|
_comBuffer = ping();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return regData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
GET PIN DATA
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
byte PCA9557::getPin(pin_t pin, reg_ptr_t regPtr) {
|
||||||
|
return bitRead(getReg(regPtr), pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET REGISTER DATA
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setReg(reg_ptr_t regPtr, byte newSetting) {
|
||||||
|
if (regPtr > 0) {
|
||||||
|
initCall(regPtr);
|
||||||
|
Wire.write(newSetting);
|
||||||
|
endCall();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
SET PIN DATA
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::setPin(pin_t pin, reg_ptr_t regPtr, byte newSetting) {
|
||||||
|
byte newReg = getReg(regPtr);
|
||||||
|
bitWrite(newReg, pin, newSetting);
|
||||||
|
setReg(regPtr, newReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
INITIATE I2C COMMUNICATION
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::initCall(reg_ptr_t regPtr) {
|
||||||
|
Wire.beginTransmission(DEV_ADDR);
|
||||||
|
Wire.write(regPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
END I2C COMMUNICATION
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
void PCA9557::endCall() {
|
||||||
|
_comBuffer = Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================================================*
|
||||||
|
GET COMMUNICATION RESULT
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
byte PCA9557::getComResult() {
|
||||||
|
return _comBuffer;
|
||||||
|
}
|
||||||
193
Pantalla/PCA9557.h
Normal file
193
Pantalla/PCA9557.h
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
/*==============================================================================================================*
|
||||||
|
|
||||||
|
@file PCA9557.h
|
||||||
|
@author Patryk Wagner
|
||||||
|
@license MIT (c) 2016 Nadav Matalon
|
||||||
|
PCA9557 Driver (8-Channel GPIO I2C Expander) based on Madav Matalon PCA9536 driver
|
||||||
|
Ver. 1.0.0 - First release (16.05.18)
|
||||||
|
*===============================================================================================================*
|
||||||
|
INTRODUCTION
|
||||||
|
*===============================================================================================================*
|
||||||
|
|
||||||
|
The PCA9557 is a 8-Channel GPIO Expander with a hardware I2C interface.
|
||||||
|
|
||||||
|
The PCA9557's 8 channels (or IO pins) can be controlled as a single unit or individually in terms of their
|
||||||
|
Mode (INPUT /OUTPUT) and Polarity (NON-INVERTED INPUT / INVERTED INPUT). The pins' states (LOW / HIGH) can
|
||||||
|
be read (in INPUT mode) or written (in OUTPUT mode).
|
||||||
|
|
||||||
|
This library contains a complete driver for the PCA9557 exposing all the above functionality.
|
||||||
|
*===============================================================================================================*
|
||||||
|
I2C ADDRESS
|
||||||
|
*===============================================================================================================*
|
||||||
|
The PCA9557 has a single I2C address (factory hardwired):
|
||||||
|
|
||||||
|
PART DEVICE I2C ADDRESS PART
|
||||||
|
NUMBER (BIN) (HEX) (DEC) MARKING
|
||||||
|
PCA9557D 01000001 0x41 65 PCA9557
|
||||||
|
*===============================================================================================================*
|
||||||
|
REGISTER POINTERS
|
||||||
|
*===============================================================================================================*
|
||||||
|
REG_INPUT 0x00 // Input Port Register (R) B00000000 (Default)
|
||||||
|
REG_OUTPUT 0x01 // Output Port Register (R/W) B00000001
|
||||||
|
REG_POLARITY 0x02 // Polarity Inversion Register (R/W) B00000010
|
||||||
|
REG_CONFIG 0x03 // Configuration Register (R/W) B00000011
|
||||||
|
*===============================================================================================================*
|
||||||
|
REGISTER 0: INPUT REGIASTER - READ ONLY (0 = LOW / 1 = HIGH)
|
||||||
|
*===============================================================================================================*
|
||||||
|
DEFAULT (WITH NO EXTENRAL INPUT SIGNAL CONNECTED): 'HIGH' (ALL IO PINS HAVE WEAK PULL-UP RESISTORS)
|
||||||
|
|
||||||
|
DEFAULT
|
||||||
|
PIN_IO0 BIT 0 1
|
||||||
|
PIN_IO1 BIT 1 1
|
||||||
|
PIN_IO2 BIT 2 1
|
||||||
|
PIN_IO3 BIT 3 1
|
||||||
|
PIN_IO4 BIT 4 1
|
||||||
|
PIN_IO5 BIT 5 1
|
||||||
|
PIN_IO6 BIT 6 1
|
||||||
|
PIN_IO7 BIT 7 1
|
||||||
|
*===============================================================================================================*
|
||||||
|
REGISTER 1: OUTPUT REGIASTER - READ / WRITE (0 = LOW / 1 = HIGH)
|
||||||
|
*===============================================================================================================*
|
||||||
|
DEFAULT
|
||||||
|
IO0 BIT 0 1
|
||||||
|
IO1 BIT 1 1
|
||||||
|
IO2 BIT 2 1
|
||||||
|
IO3 BIT 3 1
|
||||||
|
IO4 BIT 4 1
|
||||||
|
IO5 BIT 5 1
|
||||||
|
IO6 BIT 6 1
|
||||||
|
IO7 BIT 7 1
|
||||||
|
*===============================================================================================================*
|
||||||
|
REGISTER 2: POLARITY REGIASTER - READ / WRITE (0 = NON-INVERTED / 1 = INVERTED)
|
||||||
|
*===============================================================================================================*
|
||||||
|
DEFAULT
|
||||||
|
PIN_IO0 BIT 0 0
|
||||||
|
PIN_IO1 BIT 1 0
|
||||||
|
PIN_IO2 BIT 2 0
|
||||||
|
PIN_IO3 BIT 3 0
|
||||||
|
PIN_IO4 BIT 4 0
|
||||||
|
PIN_IO5 BIT 5 0
|
||||||
|
PIN_IO6 BIT 6 0
|
||||||
|
PIN_IO7 BIT 7 0
|
||||||
|
|
||||||
|
|
||||||
|
*===============================================================================================================*
|
||||||
|
REGISTER 3: CONFIGURATION - READ / WRITE (0 = OUTPUT / 1 = INPUT)
|
||||||
|
*===============================================================================================================*
|
||||||
|
POWER-UP DEFAULT: ALL PINS ARE SET AS 'INPUT' (1)
|
||||||
|
|
||||||
|
DEFAULT
|
||||||
|
PIN_IO0 BIT 0 1
|
||||||
|
PIN_IO1 BIT 1 1
|
||||||
|
PIN_IO2 BIT 2 1
|
||||||
|
PIN_IO3 BIT 3 1
|
||||||
|
PIN_IO4 BIT 4 1
|
||||||
|
PIN_IO5 BIT 5 1
|
||||||
|
PIN_IO6 BIT 6 1
|
||||||
|
PIN_IO7 BIT 7 1
|
||||||
|
|
||||||
|
|
||||||
|
*===============================================================================================================*
|
||||||
|
LICENSE
|
||||||
|
*===============================================================================================================*
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2016 Nadav Matalon
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||||
|
documentation files (the "Software"), to deal in the Software without restriction, including without
|
||||||
|
limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||||
|
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*==============================================================================================================*/
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
const byte DEV_ADDR = 0x18;//0b0011010R/W
|
||||||
|
const byte NUM_BYTES = 0x01;
|
||||||
|
const byte ALL_INPUT = 0xFF;
|
||||||
|
const byte ALL_OUTPUT = 0x00;
|
||||||
|
const byte ALL_LOW = 0x00;
|
||||||
|
const byte ALL_NON_INVERTED = 0x00;
|
||||||
|
const byte ALL_HIGH = 0xFF;
|
||||||
|
const byte ALL_INVERTED = 0xFF;
|
||||||
|
const byte COM_SUCCESS = 0x00;
|
||||||
|
|
||||||
|
typedef enum:
|
||||||
|
byte
|
||||||
|
{
|
||||||
|
REG_INPUT = 0, // default
|
||||||
|
REG_OUTPUT = 1,
|
||||||
|
REG_POLARITY = 2,
|
||||||
|
REG_CONFIG = 3
|
||||||
|
} reg_ptr_t;
|
||||||
|
|
||||||
|
typedef enum:
|
||||||
|
byte
|
||||||
|
{
|
||||||
|
IO0 = 0,
|
||||||
|
IO1 = 1,
|
||||||
|
IO2 = 2,
|
||||||
|
IO3 = 3,
|
||||||
|
IO4 = 4,
|
||||||
|
IO5 = 5,
|
||||||
|
IO6 = 6,
|
||||||
|
IO7 = 7
|
||||||
|
} pin_t;
|
||||||
|
|
||||||
|
typedef enum:
|
||||||
|
byte
|
||||||
|
{
|
||||||
|
IO_OUTPUT = 0,
|
||||||
|
IO_INPUT = 1
|
||||||
|
} mode_tt;
|
||||||
|
|
||||||
|
typedef enum:
|
||||||
|
byte
|
||||||
|
{
|
||||||
|
IO_LOW = 0,
|
||||||
|
IO_HIGH = 1
|
||||||
|
} state_t;
|
||||||
|
|
||||||
|
typedef enum:
|
||||||
|
byte
|
||||||
|
{
|
||||||
|
IO_NON_INVERTED = 0,
|
||||||
|
IO_INVERTED = 1
|
||||||
|
} polarity_t;
|
||||||
|
|
||||||
|
class PCA9557
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PCA9557();
|
||||||
|
~PCA9557();
|
||||||
|
byte ping();
|
||||||
|
byte getMode(pin_t pin);
|
||||||
|
byte getState(pin_t pin);
|
||||||
|
byte getPolarity(pin_t pin);
|
||||||
|
void setMode(pin_t pin, mode_tt newMode);
|
||||||
|
void setMode(mode_tt newMode);
|
||||||
|
void setState(pin_t pin, state_t newState);
|
||||||
|
void setState(state_t newState);
|
||||||
|
void toggleState(pin_t pin);
|
||||||
|
void toggleState();
|
||||||
|
void setPolarity(pin_t pin, polarity_t newPolarity);
|
||||||
|
void setPolarity(polarity_t newPolarity);
|
||||||
|
void reset();
|
||||||
|
byte getComResult();
|
||||||
|
private:
|
||||||
|
byte _comBuffer;
|
||||||
|
byte getReg(reg_ptr_t regPtr);
|
||||||
|
byte getPin(pin_t pin, reg_ptr_t regPtr);
|
||||||
|
void setReg(reg_ptr_t ptr, byte newSetting);
|
||||||
|
void setPin(pin_t pin, reg_ptr_t regPtr, byte newSetting);
|
||||||
|
void initCall(reg_ptr_t regPtr);
|
||||||
|
void endCall();
|
||||||
|
};
|
||||||
68
Pantalla/include/ajustes.hpp
Normal file
68
Pantalla/include/ajustes.hpp
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
#ifndef AJUSTES_HPP
|
||||||
|
#define AJUSTES_HPP
|
||||||
|
|
||||||
|
#include "../include/guardado.hpp"
|
||||||
|
|
||||||
|
void set_data(data *datos);
|
||||||
|
|
||||||
|
int get_rpm();
|
||||||
|
int get_desplazamiento();
|
||||||
|
bool get_modo_oscuro();
|
||||||
|
|
||||||
|
int get_pantalla();
|
||||||
|
int get_rpm_display();
|
||||||
|
int get_diff_rpm();
|
||||||
|
int get_recepcion_datos();
|
||||||
|
|
||||||
|
float get_vbatt_too_high();
|
||||||
|
float get_vbatt_high();
|
||||||
|
float get_vbatt_low();
|
||||||
|
|
||||||
|
int get_water_hot();
|
||||||
|
int get_water_mild();
|
||||||
|
int get_water_cold();
|
||||||
|
|
||||||
|
int get_oil_hot();
|
||||||
|
int get_oil_mild();
|
||||||
|
int get_oil_cold();
|
||||||
|
|
||||||
|
float get_oil_pressure_too_high();
|
||||||
|
float get_oil_pressure_high();
|
||||||
|
float get_oil_pressure_low();
|
||||||
|
|
||||||
|
float get_fuel_pressure_too_high();
|
||||||
|
float get_fuel_pressure_high();
|
||||||
|
float get_fuel_pressure_low();
|
||||||
|
|
||||||
|
void save();
|
||||||
|
void load();
|
||||||
|
|
||||||
|
void update(
|
||||||
|
int rpm_max,
|
||||||
|
int desplazamiento,
|
||||||
|
bool modo_oscuro,
|
||||||
|
int pantalla,
|
||||||
|
int rpm_display,
|
||||||
|
int diff_rpm,
|
||||||
|
int recepcion_datos,
|
||||||
|
float vbatt_too_high,
|
||||||
|
float vbatt_high,
|
||||||
|
float vbatt_low,
|
||||||
|
int water_hot,
|
||||||
|
int water_mild,
|
||||||
|
int water_cold,
|
||||||
|
int oil_hot,
|
||||||
|
int oil_mild,
|
||||||
|
int oil_cold,
|
||||||
|
float oil_pressure_too_high,
|
||||||
|
float oil_pressure_high,
|
||||||
|
float oil_pressure_low,
|
||||||
|
float fuel_pressure_too_high,
|
||||||
|
float fuel_pressure_high,
|
||||||
|
float fuel_pressure_low
|
||||||
|
);
|
||||||
|
|
||||||
|
int modify_value(int value, int modifier);
|
||||||
|
float modify_value(float value, float modifier);
|
||||||
|
|
||||||
|
#endif
|
||||||
63
Pantalla/include/can.hpp
Normal file
63
Pantalla/include/can.hpp
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
#ifndef CAN_HPP
|
||||||
|
#define CAN_HPP
|
||||||
|
|
||||||
|
#define RX_PIN 13
|
||||||
|
#define TX_PIN 38
|
||||||
|
#define POLLING_RATE_MS 1000
|
||||||
|
#define TRANSMIT_RATE_MS 1000
|
||||||
|
#define ID_BOTONES 5
|
||||||
|
|
||||||
|
#include "driver/twai.h"
|
||||||
|
#include "common/common_libraries.hpp"
|
||||||
|
#include "data_processor.hpp"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/semphr.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
class CAN {
|
||||||
|
public:
|
||||||
|
CAN(): _mutex(xSemaphoreCreateMutex()), _listen_task_handle(NULL), _iracing_task_handle(NULL), _should_stop_listening(false), _should_stop_iracing(false) {}
|
||||||
|
~CAN();
|
||||||
|
static void listenTask(void *arg);
|
||||||
|
static void iracingTask(void *arg);
|
||||||
|
void start();
|
||||||
|
void listen();
|
||||||
|
void start_listening_task();
|
||||||
|
void stop_listening_task();
|
||||||
|
void start_iracing_task();
|
||||||
|
void stop_iracing_task();
|
||||||
|
void send_frame(twai_message_t message);
|
||||||
|
|
||||||
|
void clear_rx_queue();
|
||||||
|
|
||||||
|
twai_message_t createBoolMessage(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7);
|
||||||
|
twai_message_t mensaje_botonera(uint8_t B1, uint8_t B2, uint8_t B3, uint8_t B4, uint8_t levaizq, uint8_t levader);
|
||||||
|
|
||||||
|
void set_data_proccessor(DataProcessor *data_processor) {
|
||||||
|
_data_processor = data_processor;
|
||||||
|
}
|
||||||
|
|
||||||
|
SemaphoreHandle_t get_mutex() {
|
||||||
|
return _mutex;
|
||||||
|
}
|
||||||
|
|
||||||
|
void listen_id();
|
||||||
|
void listen_id2();
|
||||||
|
void data_update();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
twai_message_t _rx_message;
|
||||||
|
DataProcessor *_data_processor;
|
||||||
|
SemaphoreHandle_t _mutex;
|
||||||
|
TaskHandle_t _listen_task_handle;
|
||||||
|
TaskHandle_t _iracing_task_handle;
|
||||||
|
volatile bool _should_stop_listening=0;
|
||||||
|
volatile bool _should_stop_iracing=0;
|
||||||
|
uint8_t _serial_protocol=0;
|
||||||
|
uint8_t _serial_index=0;
|
||||||
|
uint8_t _serial_buffer[21]={0};
|
||||||
|
int test = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
9
Pantalla/include/common/common_libraries.hpp
Normal file
9
Pantalla/include/common/common_libraries.hpp
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef COMMON_LIBRARIES_HPP
|
||||||
|
#define COMMON_LIBRARIES_HPP
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "time.h"
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#endif
|
||||||
98
Pantalla/include/common/crowpanel_pins.h
Normal file
98
Pantalla/include/common/crowpanel_pins.h
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
#ifndef CROWPANEL_PINS_H
|
||||||
|
#define CROWPANEL_PINS_H
|
||||||
|
|
||||||
|
// =============================================================================
|
||||||
|
// CrowPanel 5.0" ESP32-S3 Pin Definitions
|
||||||
|
// =============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
// Display Interface (RGB Parallel) - Reserved, do not use
|
||||||
|
#define TFT_DE_PIN 40
|
||||||
|
#define TFT_VSYNC_PIN 41
|
||||||
|
#define TFT_HSYNC_PIN 39
|
||||||
|
#define TFT_PCLK_PIN 0
|
||||||
|
// RGB Data pins (R0-R4, G0-G5, B0-B4) - pins 1,3,4,5,6,7,8,9,14,15,16,21,45,46,47,48
|
||||||
|
|
||||||
|
// Touch Interface (I2C) - Reserved, do not use
|
||||||
|
#define TOUCH_SDA_PIN 19 // GT911 I2C SDA
|
||||||
|
#define TOUCH_SCL_PIN 20 // GT911 I2C SCL
|
||||||
|
#define TOUCH_INT_PIN -1 // Touch interrupt (if used)
|
||||||
|
#define TOUCH_RST_PIN -1 // Touch reset (if used)
|
||||||
|
|
||||||
|
// Backlight Control
|
||||||
|
#define TFT_BL_PIN 2 // PWM backlight control
|
||||||
|
|
||||||
|
// Available GPIO pins for external connections
|
||||||
|
// These pins are available on the CrowPanel expansion connectors
|
||||||
|
|
||||||
|
// Primary GPIO expansion (high priority usage)
|
||||||
|
#define GPIO_AVAILABLE_1 1 // Available for LED strip or buttons
|
||||||
|
#define GPIO_AVAILABLE_2 3 // Available for LED strip or buttons
|
||||||
|
#define GPIO_AVAILABLE_3 8 // Available for buttons
|
||||||
|
#define GPIO_AVAILABLE_4 9 // Available for buttons
|
||||||
|
#define GPIO_AVAILABLE_5 10 // Available for buttons
|
||||||
|
// #define GPIO_AVAILABLE_6 11 // Available for
|
||||||
|
#define GPIO_AVAILABLE_7 12 // Available for buttons
|
||||||
|
#define GPIO_AVAILABLE_8 13 // Available for buttons
|
||||||
|
|
||||||
|
// Secondary GPIO expansion (if more pins needed)
|
||||||
|
#define GPIO_AVAILABLE_9 17 // Alternative GPIO
|
||||||
|
#define GPIO_AVAILABLE_10 18 // Alternative GPIO
|
||||||
|
#define GPIO_AVAILABLE_11 33 // Alternative GPIO
|
||||||
|
#define GPIO_AVAILABLE_12 34 // Alternative GPIO
|
||||||
|
#define GPIO_AVAILABLE_13 35 // Alternative GPIO
|
||||||
|
#define GPIO_AVAILABLE_14 36 // Alternative GPIO
|
||||||
|
#define GPIO_AVAILABLE_15 37 // Alternative GPIO
|
||||||
|
// #define GPIO_AVAILABLE_16 38 // Alternative GPIO
|
||||||
|
|
||||||
|
// Power pins
|
||||||
|
#define POWER_3V3 3.3 // 3.3V supply
|
||||||
|
#define POWER_5V 5.0 // 5V supply
|
||||||
|
#define POWER_GND 0 // Ground
|
||||||
|
|
||||||
|
// =============================================================================
|
||||||
|
// Application-Specific Pin Assignments
|
||||||
|
// =============================================================================
|
||||||
|
|
||||||
|
// LED Strip (WS2812B)
|
||||||
|
#define LED_STRIP_PIN GPIO_AVAILABLE_1 // GPIO 1
|
||||||
|
|
||||||
|
// Wheel Buttons - Main buttons
|
||||||
|
#define WHEEL_B1_PIN GPIO_AVAILABLE_2 // GPIO 3
|
||||||
|
#define WHEEL_B2_PIN GPIO_AVAILABLE_3 // GPIO 8
|
||||||
|
#define WHEEL_B3_PIN GPIO_AVAILABLE_4 // GPIO 9
|
||||||
|
#define WHEEL_B4_PIN GPIO_AVAILABLE_5 // GPIO 10
|
||||||
|
|
||||||
|
// Wheel Button LEDs
|
||||||
|
#define WHEEL_B1_LED_PIN GPIO_AVAILABLE_6 // GPIO 11
|
||||||
|
#define WHEEL_B2_LED_PIN GPIO_AVAILABLE_7 // GPIO 12
|
||||||
|
#define WHEEL_B3_LED_PIN GPIO_AVAILABLE_8 // GPIO 13
|
||||||
|
#define WHEEL_B4_LED_PIN GPIO_AVAILABLE_9 // GPIO 17
|
||||||
|
|
||||||
|
// Paddle Shifters
|
||||||
|
#define PADDLE_LEFT_PIN GPIO_AVAILABLE_10 // GPIO 18
|
||||||
|
#define PADDLE_RIGHT_PIN GPIO_AVAILABLE_11 // GPIO 33
|
||||||
|
|
||||||
|
// Rotary Encoders
|
||||||
|
#define ENCODER1_A_PIN GPIO_AVAILABLE_12 // GPIO 34
|
||||||
|
#define ENCODER1_B_PIN GPIO_AVAILABLE_13 // GPIO 35
|
||||||
|
#define ENCODER1_BTN_PIN GPIO_AVAILABLE_14 // GPIO 36
|
||||||
|
|
||||||
|
#define ENCODER2_A_PIN GPIO_AVAILABLE_15 // GPIO 37
|
||||||
|
#define ENCODER2_B_PIN GPIO_AVAILABLE_16 // GPIO 38
|
||||||
|
#define ENCODER2_BTN_PIN GPIO_AVAILABLE_1 // Reuse if needed
|
||||||
|
|
||||||
|
// =============================================================================
|
||||||
|
// Hardware Validation
|
||||||
|
// =============================================================================
|
||||||
|
|
||||||
|
// Ensure critical pins are not conflicting
|
||||||
|
#if LED_STRIP_PIN == CAN_TX_PIN || LED_STRIP_PIN == CAN_RX_PIN
|
||||||
|
#error "LED Strip pin conflicts with CAN interface"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TOUCH_SDA_PIN == WHEEL_B1_PIN || TOUCH_SCL_PIN == WHEEL_B1_PIN
|
||||||
|
#error "Wheel button pins conflict with touch interface"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // CROWPANEL_PINS_H
|
||||||
36
Pantalla/include/common/display_id.hpp
Normal file
36
Pantalla/include/common/display_id.hpp
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef DISPLAY_ID_HPP
|
||||||
|
#define DISPLAY_ID_HPP
|
||||||
|
|
||||||
|
#define DISPLAY_0_ID 0x00
|
||||||
|
#define DISPLAY_1_ID 0x01
|
||||||
|
#define DISPLAY_2_ID 0x02
|
||||||
|
#define DISPLAY_3_ID 0x03
|
||||||
|
#define DISPLAY_4_ID 0x04
|
||||||
|
|
||||||
|
#define RPM_ID 0x51 //RPM
|
||||||
|
#define ECT_IN_ID 0x52 //Temperatura entrada del radiador
|
||||||
|
#define GEAR_ID 0x53 //Marcha
|
||||||
|
#define TPS_ID 0x54 //Posición pedal acelerador
|
||||||
|
#define BPS_ID 0x55 //Presión de freno
|
||||||
|
#define BVOLT_ID 0x56 //Voltaje de batería
|
||||||
|
#define LAMBDA_ID 0x57 //Lambda
|
||||||
|
#define LR_WS_ID 0x58 //Velocidad de rueda LR
|
||||||
|
#define RR_WS_ID 0x59 //Velocidad de rueda RR
|
||||||
|
#define LF_WS_ID 0x60 //Velocidad de rueda LF
|
||||||
|
#define RF_WS_ID 0x61 //Velocidad de rueda RF
|
||||||
|
#define ECT_OUT_ID 0x62 //Temperatura salida del radiador
|
||||||
|
#define IAT_ID 0x63 //IAT
|
||||||
|
#define MAP_ID 0x64 //IAT
|
||||||
|
#define AFR_ID 0x65 //Target Lambda
|
||||||
|
#define CAN1_ID 0x66 //CAN_DIG#1
|
||||||
|
#define CAN2_ID 0x67 //CAN_DIG#2
|
||||||
|
#define CAN3_ID 0x68 //CAN_DIG#3
|
||||||
|
#define CAN4_ID 0x69 //CAN_DIG#4
|
||||||
|
#define CAN5_ID 0x70 //CAN_DIG#5
|
||||||
|
#define CAN6_ID 0x71 //CAN_DIG#6
|
||||||
|
#define TEMP_WARNING 0x72 //Warning de temperatura
|
||||||
|
#define OIL_TEMP_ID 0x73 //Temperatura de aceite
|
||||||
|
#define FUEL_PRESSURE_ID 0x74 //Presión de combustible
|
||||||
|
#define BOTONES_ID 0x40
|
||||||
|
|
||||||
|
#endif
|
||||||
9
Pantalla/include/common/telemetry_status.hpp
Normal file
9
Pantalla/include/common/telemetry_status.hpp
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef TELEMETRY_STATUS_HPP
|
||||||
|
#define TELEMETRY_STATUS_HPP
|
||||||
|
|
||||||
|
enum class TelemetryStatus {
|
||||||
|
CONNECTED,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
185
Pantalla/include/crowpanel_controller.hpp
Normal file
185
Pantalla/include/crowpanel_controller.hpp
Normal file
|
|
@ -0,0 +1,185 @@
|
||||||
|
#ifndef CROWPANEL_CONTROLLER_HPP
|
||||||
|
#define CROWPANEL_CONTROLLER_HPP
|
||||||
|
|
||||||
|
#include <lvgl.h>
|
||||||
|
#include <DHT20.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <LovyanGFX.hpp>
|
||||||
|
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
|
||||||
|
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
|
||||||
|
#include "ui/ui.h"
|
||||||
|
|
||||||
|
#define TFT_BL 2
|
||||||
|
|
||||||
|
extern SemaphoreHandle_t lvgl_mutex;
|
||||||
|
|
||||||
|
class LGFX : public lgfx::LGFX_Device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
lgfx::Bus_RGB _bus_instance;
|
||||||
|
lgfx::Panel_RGB _panel_instance;
|
||||||
|
lgfx::Light_PWM _light_instance;
|
||||||
|
lgfx::Touch_GT911 _touch_instance;
|
||||||
|
LGFX(void)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
auto cfg = _panel_instance.config();
|
||||||
|
cfg.memory_width = 800;
|
||||||
|
cfg.memory_height = 480;
|
||||||
|
cfg.panel_width = 800;
|
||||||
|
cfg.panel_height = 480;
|
||||||
|
cfg.offset_x = 0;
|
||||||
|
cfg.offset_y = 0;
|
||||||
|
_panel_instance.config(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto cfg = _bus_instance.config();
|
||||||
|
cfg.panel = &_panel_instance;
|
||||||
|
|
||||||
|
cfg.pin_d0 = GPIO_NUM_8; // B0
|
||||||
|
cfg.pin_d1 = GPIO_NUM_3; // B1
|
||||||
|
cfg.pin_d2 = GPIO_NUM_46; // B2
|
||||||
|
cfg.pin_d3 = GPIO_NUM_9; // B3
|
||||||
|
cfg.pin_d4 = GPIO_NUM_1; // B4
|
||||||
|
|
||||||
|
cfg.pin_d5 = GPIO_NUM_5; // G0
|
||||||
|
cfg.pin_d6 = GPIO_NUM_6; // G1
|
||||||
|
cfg.pin_d7 = GPIO_NUM_7; // G2
|
||||||
|
cfg.pin_d8 = GPIO_NUM_15; // G3
|
||||||
|
cfg.pin_d9 = GPIO_NUM_16; // G4
|
||||||
|
cfg.pin_d10 = GPIO_NUM_4; // G5
|
||||||
|
|
||||||
|
cfg.pin_d11 = GPIO_NUM_45; // R0
|
||||||
|
cfg.pin_d12 = GPIO_NUM_48; // R1
|
||||||
|
cfg.pin_d13 = GPIO_NUM_47; // R2
|
||||||
|
cfg.pin_d14 = GPIO_NUM_21; // R3
|
||||||
|
cfg.pin_d15 = GPIO_NUM_14; // R4
|
||||||
|
|
||||||
|
cfg.pin_henable = GPIO_NUM_40;
|
||||||
|
cfg.pin_vsync = GPIO_NUM_41;
|
||||||
|
cfg.pin_hsync = GPIO_NUM_39;
|
||||||
|
cfg.pin_pclk = GPIO_NUM_0;
|
||||||
|
cfg.freq_write = 15000000;
|
||||||
|
|
||||||
|
cfg.hsync_polarity = 0;
|
||||||
|
cfg.hsync_front_porch = 8;
|
||||||
|
cfg.hsync_pulse_width = 4;
|
||||||
|
cfg.hsync_back_porch = 43;
|
||||||
|
|
||||||
|
cfg.vsync_polarity = 0;
|
||||||
|
cfg.vsync_front_porch = 8;
|
||||||
|
cfg.vsync_pulse_width = 4;
|
||||||
|
cfg.vsync_back_porch = 12;
|
||||||
|
|
||||||
|
cfg.pclk_active_neg = 1;
|
||||||
|
cfg.de_idle_high = 0;
|
||||||
|
cfg.pclk_idle_high = 0;
|
||||||
|
|
||||||
|
_bus_instance.config(cfg);
|
||||||
|
_panel_instance.setBus(&_bus_instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto cfg = _light_instance.config();
|
||||||
|
cfg.pin_bl = GPIO_NUM_2;
|
||||||
|
_light_instance.config(cfg);
|
||||||
|
_panel_instance.light(&_light_instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto cfg = _touch_instance.config();
|
||||||
|
cfg.x_min = 0;
|
||||||
|
cfg.x_max = 799;
|
||||||
|
cfg.y_min = 0;
|
||||||
|
cfg.y_max = 479;
|
||||||
|
cfg.pin_int = -1;
|
||||||
|
cfg.pin_rst = -1;
|
||||||
|
cfg.bus_shared = true;
|
||||||
|
cfg.offset_rotation = 2;
|
||||||
|
cfg.i2c_port = I2C_NUM_1;
|
||||||
|
cfg.pin_sda = GPIO_NUM_19;
|
||||||
|
cfg.pin_scl = GPIO_NUM_20;
|
||||||
|
cfg.freq = 400000;
|
||||||
|
cfg.i2c_addr = 0x14;
|
||||||
|
_touch_instance.config(cfg);
|
||||||
|
_panel_instance.setTouch(&_touch_instance);
|
||||||
|
}
|
||||||
|
setPanel(&_panel_instance);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CrowPanelController {
|
||||||
|
public:
|
||||||
|
|
||||||
|
bool encendido_pantalla=false;
|
||||||
|
LGFX lcd;
|
||||||
|
static uint32_t screenWidth;
|
||||||
|
static uint32_t screenHeight;
|
||||||
|
static lv_disp_draw_buf_t draw_buf;
|
||||||
|
static lv_color_t disp_draw_buf[800 * 480 / 10];
|
||||||
|
static lv_disp_drv_t disp_drv;
|
||||||
|
static lv_indev_drv_t indev_drv;
|
||||||
|
|
||||||
|
CrowPanelController();
|
||||||
|
void begin();
|
||||||
|
static void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
|
||||||
|
static void my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data);
|
||||||
|
static void set_value_to_label(lv_obj_t *label, double value);
|
||||||
|
void set_string_to_label(lv_obj_t *label, const char *string);
|
||||||
|
void change_screen();
|
||||||
|
static void iniciar_pantalla(lv_timer_t * timer);
|
||||||
|
void show_label(lv_obj_t *label);
|
||||||
|
void hide_label(lv_obj_t *label);
|
||||||
|
|
||||||
|
// New methods for conditional color management
|
||||||
|
void set_label_color(lv_obj_t *label, uint32_t color);
|
||||||
|
void set_panel_color(lv_obj_t *panel, uint32_t bg_color);
|
||||||
|
void set_conditional_colors();
|
||||||
|
void update_rpm_bar(int rpm);
|
||||||
|
int rpm_to_pixel(int rpm); // Update RPM LED bar based on RPM (8000-12500 range)
|
||||||
|
static void create_rpm_bar(int, int);
|
||||||
|
void inic_barra_rpm();
|
||||||
|
static int set_lineal();
|
||||||
|
|
||||||
|
// Predefined colors for different conditions
|
||||||
|
static const uint32_t COLOR_NORMAL = 0xFFFFFF; // White
|
||||||
|
static const uint32_t COLOR_WARNING = 0xFFFF00; // Yellow
|
||||||
|
static const uint32_t COLOR_CRITICAL = 0xFF0000; // Red
|
||||||
|
static const uint32_t COLOR_GOOD = 0x00FF00; // Green
|
||||||
|
static const uint32_t COLOR_INFO = 0xFF8500; // Orange (current label color)
|
||||||
|
static const uint32_t COLOR_BLUE = 0x0080FF; // Blue
|
||||||
|
static const uint32_t COLOR_PANEL_DEFAULT = 0x2C2C2C; // Dark grey for panel backgrounds
|
||||||
|
|
||||||
|
static const uint32_t COLOR_ROJO=0xFF5454; // Rojo mas oscuro
|
||||||
|
static const uint32_t COLOR_VERDE=0x00CB36; // Verde mas oscuro
|
||||||
|
static const uint32_t COLOR_NEGROP=0x101010; // El color negro de la pantalla negra
|
||||||
|
|
||||||
|
static const uint32_t COLOR_NEGRO_NUEVO=0x232323;
|
||||||
|
static const uint32_t COLOR_ROJO_NUEVO=0x9E3D3D;
|
||||||
|
static const uint32_t COLOR_VERDE_NUEVO=0x458F45;
|
||||||
|
static const uint32_t COLOR_AMARILLO_NUEVO=0xA8A800;
|
||||||
|
static const uint32_t COLOR_AZUL_NUEVO=0x02A6AC;
|
||||||
|
static const uint32_t COLOR_BLANCO_NUEVO=0xd2d2d2;
|
||||||
|
static const uint32_t COLOR_ROJO_BARRA=0xbb1818;
|
||||||
|
static const uint32_t COLOR_FONDO_BARRA_OSCURO=0x3A3A3A;
|
||||||
|
|
||||||
|
static const uint32_t COLOR_AMARILLO_CLARO=0xD7D737;
|
||||||
|
static const uint32_t COLOR_AZUL_CLARO=0x31CBD1;
|
||||||
|
static const uint32_t COLOR_ROJO_CLARO=0xD54A4A;
|
||||||
|
static const uint32_t COLOR_VERDE_CLARO=0x5BB95B;
|
||||||
|
static const uint32_t COLOR_BLANCO_CLARO=0xE9E9E9;
|
||||||
|
static const uint32_t COLOR_FONDO_BARRA_CLARO=0xAAAAAA;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool initialized=false;
|
||||||
|
int new_screen=0;
|
||||||
|
uint32_t last_parpadeo=0;
|
||||||
|
bool last_rpm12300=false;
|
||||||
|
bool parpadeo=false;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
38
Pantalla/include/data_processor.hpp
Normal file
38
Pantalla/include/data_processor.hpp
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef DATAPROCESSOR_HPP
|
||||||
|
#define DATAPROCESSOR_HPP
|
||||||
|
|
||||||
|
#include "common/common_libraries.hpp"
|
||||||
|
#include "common/display_id.hpp"
|
||||||
|
#include "led_strip.hpp"
|
||||||
|
#include "crowpanel_controller.hpp"
|
||||||
|
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/semphr.h"
|
||||||
|
|
||||||
|
class DataProcessor {
|
||||||
|
public:
|
||||||
|
DataProcessor() = default;
|
||||||
|
void send_serial(byte type, unsigned int value);
|
||||||
|
void send_serial_frame_0(int rpmh, int rpml, int tpsh, int tpsl, int ecth, int ectl, int gear);
|
||||||
|
void send_serial_frame_1(int lfws, int rfws, int lrws, int rrws, int maph, int mapl, int ect);
|
||||||
|
void send_serial_frame_2(int lambh, int lambl, int lamth, int lamtl, int bvolth, int bvoltl, int iat);
|
||||||
|
void send_serial_frame_3(int oilth, int oiltl, int oilph, int oilpl, int maph, int mapl, int useless);
|
||||||
|
void send_serial_frame_5(int aux1, int aux2, int aux3, int aux4, int aux5, int aux6, int aux7);
|
||||||
|
void send_serial_frame_volante(int neutra, int cpant, int arrancar, int launch, int levaizq, int levader, int aux);
|
||||||
|
void set_led_strip(LedStrip *led_strip){
|
||||||
|
_led_strip = led_strip;
|
||||||
|
}
|
||||||
|
void set_crow_panel_controller(CrowPanelController *crow_panel_controller) {
|
||||||
|
_crow_panel_controller = crow_panel_controller;
|
||||||
|
}
|
||||||
|
static void set_dataprocessor();
|
||||||
|
void update_rpm_leds(int rpm);
|
||||||
|
|
||||||
|
private:
|
||||||
|
LedStrip *_led_strip;
|
||||||
|
CrowPanelController *_crow_panel_controller;
|
||||||
|
int current_display=0;
|
||||||
|
int request_screen=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
83
Pantalla/include/g24_wheel_buttons.hpp
Normal file
83
Pantalla/include/g24_wheel_buttons.hpp
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
#ifndef G24WHEELBUTTONS_HPP
|
||||||
|
#define G24WHEELBUTTONS_HPP
|
||||||
|
|
||||||
|
#include "common/common_libraries.hpp"
|
||||||
|
#include "can.hpp"
|
||||||
|
#include "led_strip.hpp"
|
||||||
|
#include "data_processor.hpp"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/semphr.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
#include "common/crowpanel_pins.h"
|
||||||
|
|
||||||
|
#include "can.hpp"
|
||||||
|
|
||||||
|
#define B1_PIN GPIO_NUM_2
|
||||||
|
#define B2_PIN GPIO_NUM_4
|
||||||
|
#define B3_PIN GPIO_NUM_42
|
||||||
|
#define B4_PIN GPIO_NUM_40
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define B1_PIN GPIO_AVAILABLE_2
|
||||||
|
#define B2_PIN GPIO_AVAILABLE_3
|
||||||
|
#define B3_PIN GPIO_AVAILABLE_4
|
||||||
|
#define B4_PIN GPIO_AVAILABLE_5
|
||||||
|
*/
|
||||||
|
#define B1_LED_PIN GPIO_NUM_3
|
||||||
|
#define B2_LED_PIN GPIO_NUM_5
|
||||||
|
#define B3_LED_PIN GPIO_NUM_41
|
||||||
|
#define B4_LED_PIN GPIO_NUM_39
|
||||||
|
|
||||||
|
#define LEVA_IZQ_PIN GPIO_NUM_15
|
||||||
|
#define LEVA_DER_PIN GPIO_NUM_16
|
||||||
|
/*
|
||||||
|
#define LEVA_IZQ_PIN GPIO_AVAILABLE_10
|
||||||
|
#define LEVA_DER_PIN GPIO_AVAILABLE_11
|
||||||
|
*/
|
||||||
|
#define E1_PIN_A GPIO_NUM_11
|
||||||
|
#define E1_PIN_B GPIO_NUM_10
|
||||||
|
#define E2_PIN_A GPIO_NUM_36
|
||||||
|
#define E2_PIN_B GPIO_NUM_35
|
||||||
|
|
||||||
|
#define E1_BUTTON_PIN GPIO_NUM_12
|
||||||
|
#define E2_BUTTON_PIN GPIO_NUM_34
|
||||||
|
|
||||||
|
#define PRESS_TIME 30
|
||||||
|
|
||||||
|
class G24WheelButtons {
|
||||||
|
public:
|
||||||
|
void ejecucion();
|
||||||
|
void begin();
|
||||||
|
static void botonera(void *arg);
|
||||||
|
static void updateTask(void *arg);
|
||||||
|
void set_can(CAN *can){
|
||||||
|
_can = can;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
CAN *_can=nullptr;
|
||||||
|
void estado_boton(gpio_num_t buttonPin, volatile bool &buttonState, volatile bool &laststate, volatile unsigned long &lastPressTime, volatile unsigned long &temporizador);
|
||||||
|
void check_boton();
|
||||||
|
|
||||||
|
static const unsigned long debounceTime = 50; // milliseconds
|
||||||
|
|
||||||
|
struct boton{
|
||||||
|
volatile bool estado=false;
|
||||||
|
volatile bool last_estado=false;
|
||||||
|
volatile unsigned long lastPressTime=0;
|
||||||
|
volatile unsigned long temporizador=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
boton B1;
|
||||||
|
boton B2;
|
||||||
|
boton B3;
|
||||||
|
boton B4;
|
||||||
|
boton levaizq;
|
||||||
|
boton levader;
|
||||||
|
|
||||||
|
bool estado_tarea=false;
|
||||||
|
TaskHandle_t manejador_tarea=nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
99
Pantalla/include/guardado.hpp
Normal file
99
Pantalla/include/guardado.hpp
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
#ifndef GUARDADO_HPP
|
||||||
|
#define GUARDADO_HPP
|
||||||
|
|
||||||
|
#define nombre_archivo "/guardado.txt"
|
||||||
|
|
||||||
|
class data{
|
||||||
|
|
||||||
|
public:
|
||||||
|
void load_data();
|
||||||
|
void save_data();
|
||||||
|
|
||||||
|
void update_data(
|
||||||
|
int rpm_maxn,
|
||||||
|
int desplazamienton,
|
||||||
|
bool modo_oscuron,
|
||||||
|
int pantallan,
|
||||||
|
int rpm_displayn,
|
||||||
|
int diff_rpmn,
|
||||||
|
int recepcion_datosn,
|
||||||
|
float vbatt_too_highn,
|
||||||
|
float vbatt_highn,
|
||||||
|
float vbatt_lown,
|
||||||
|
int water_hotn,
|
||||||
|
int water_mildn,
|
||||||
|
int water_coldn,
|
||||||
|
int oil_hotn,
|
||||||
|
int oil_mildn,
|
||||||
|
int oil_coldn,
|
||||||
|
float oil_pressure_too_highn,
|
||||||
|
float oil_pressure_highn,
|
||||||
|
float oil_pressure_lown,
|
||||||
|
float fuel_pressure_too_highn,
|
||||||
|
float fuel_pressure_highn,
|
||||||
|
float fuel_pressure_lown
|
||||||
|
);
|
||||||
|
|
||||||
|
int get_rpm();
|
||||||
|
int get_desplazamiento();
|
||||||
|
bool get_modo_oscuro();
|
||||||
|
|
||||||
|
int get_pantalla();
|
||||||
|
int get_rpm_display();
|
||||||
|
int get_diff_rpm();
|
||||||
|
int get_recepcion_datos();
|
||||||
|
|
||||||
|
float get_vbatt_too_high();
|
||||||
|
float get_vbatt_high();
|
||||||
|
float get_vbatt_low();
|
||||||
|
|
||||||
|
int get_water_hot();
|
||||||
|
int get_water_mild();
|
||||||
|
int get_water_cold();
|
||||||
|
|
||||||
|
int get_oil_hot();
|
||||||
|
int get_oil_mild();
|
||||||
|
int get_oil_cold();
|
||||||
|
|
||||||
|
float get_oil_pressure_too_high();
|
||||||
|
float get_oil_pressure_high();
|
||||||
|
float get_oil_pressure_low();
|
||||||
|
|
||||||
|
float get_fuel_pressure_too_high();
|
||||||
|
float get_fuel_pressure_high();
|
||||||
|
float get_fuel_pressure_low();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int rpm_max=8000;
|
||||||
|
int desplazamiento=0;
|
||||||
|
bool modo_oscuro=true;
|
||||||
|
|
||||||
|
int pantalla=0;
|
||||||
|
int rpm_display=false;
|
||||||
|
int diff_rpm=0;
|
||||||
|
int recepcion_datos=0;
|
||||||
|
|
||||||
|
float vbatt_too_high=0;
|
||||||
|
float vbatt_high=0;
|
||||||
|
float vbatt_low=0;
|
||||||
|
|
||||||
|
|
||||||
|
int water_hot=0;
|
||||||
|
int water_mild=0;
|
||||||
|
int water_cold=0;
|
||||||
|
|
||||||
|
int oil_hot=0;
|
||||||
|
int oil_mild=0;
|
||||||
|
int oil_cold=0;
|
||||||
|
|
||||||
|
float oil_pressure_too_high=0;
|
||||||
|
float oil_pressure_high=0;
|
||||||
|
float oil_pressure_low=0;
|
||||||
|
|
||||||
|
float fuel_pressure_too_high=0;
|
||||||
|
float fuel_pressure_high=0;
|
||||||
|
float fuel_pressure_low=0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
40
Pantalla/include/led_strip.hpp
Normal file
40
Pantalla/include/led_strip.hpp
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
#ifndef LED_STRIP_HPP
|
||||||
|
#define LED_STRIP_HPP
|
||||||
|
|
||||||
|
#include <Adafruit_NeoPixel.h>
|
||||||
|
#include "common/crowpanel_pins.h"
|
||||||
|
|
||||||
|
#define PIN_WS2812B 6
|
||||||
|
//#define PIN_WS2812B GPIO_AVAILABLE_1
|
||||||
|
#define NUM_PIXELS 18
|
||||||
|
#define T_PARPADEO 50
|
||||||
|
|
||||||
|
#define STOP_CAR_WARNING 1
|
||||||
|
|
||||||
|
#define RPM_MIN 8000
|
||||||
|
#define RPM_MAX 12500
|
||||||
|
|
||||||
|
class LedStrip{
|
||||||
|
public:
|
||||||
|
LedStrip(): _ws2812b(NUM_PIXELS, PIN_WS2812B, NEO_GRB + NEO_KHZ800), _warning(0), _brightness(255) {}
|
||||||
|
|
||||||
|
void begin(){
|
||||||
|
_ws2812b.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_rpm(int rpm);
|
||||||
|
void display_startup();
|
||||||
|
void launch_control(bool estado);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Adafruit_NeoPixel _ws2812b;
|
||||||
|
SemaphoreHandle_t _mutex;
|
||||||
|
int _rpm;
|
||||||
|
int _warning;
|
||||||
|
int _brightness;
|
||||||
|
bool launch=false;
|
||||||
|
uint32_t last_parpadeo=0;
|
||||||
|
bool estado_parpadeo=false;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
55
Pantalla/include/led_strip_fl.hpp
Normal file
55
Pantalla/include/led_strip_fl.hpp
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
// #ifndef LED_STRIP_HPP
|
||||||
|
// #define LED_STRIP_HPP
|
||||||
|
|
||||||
|
// #include <FastLED.h>
|
||||||
|
|
||||||
|
// #define PIN_WS2812B 6
|
||||||
|
// #define NUM_PIXELS 18
|
||||||
|
|
||||||
|
// #define STOP_CAR_WARNING 1
|
||||||
|
|
||||||
|
// #define RPM_MIN 6000
|
||||||
|
// #define RPM_MAX 11000
|
||||||
|
|
||||||
|
// class LedStrip{
|
||||||
|
// public:
|
||||||
|
// LedStrip(): _warning(0), _brightness(255) {}
|
||||||
|
|
||||||
|
// static void updateTask(void *arg) {
|
||||||
|
// LedStrip *ledStrip = static_cast<LedStrip*>(arg);
|
||||||
|
// ledStrip->update();
|
||||||
|
// vTaskDelete(NULL);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void update();
|
||||||
|
|
||||||
|
// void set_rpm(int rpm);
|
||||||
|
|
||||||
|
// void begin(){
|
||||||
|
// FastLED.addLeds<WS2812B, PIN_WS2812B, GRB>(_leds, NUM_PIXELS);
|
||||||
|
// FastLED.setBrightness(_brightness);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void set_brightness(uint8_t brightness) {
|
||||||
|
// _brightness = brightness;
|
||||||
|
// FastLED.setBrightness(_brightness);
|
||||||
|
// FastLED.show();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void set_mutex(SemaphoreHandle_t mutex){
|
||||||
|
// _mutex = mutex;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void display_warning(int warning);
|
||||||
|
// void display_rpm(int rpm);
|
||||||
|
// void display_startup();
|
||||||
|
|
||||||
|
// private:
|
||||||
|
// CRGB _leds[NUM_PIXELS];
|
||||||
|
// SemaphoreHandle_t _mutex;
|
||||||
|
// int _rpm;
|
||||||
|
// int _warning;
|
||||||
|
// int _brightness;
|
||||||
|
// };
|
||||||
|
|
||||||
|
// #endif
|
||||||
68
Pantalla/include/ui/ui.h
Normal file
68
Pantalla/include/ui/ui.h
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef _G26_V3_UI_H
|
||||||
|
#define _G26_V3_UI_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#include "lvgl.h"
|
||||||
|
#elif __has_include("lvgl/lvgl.h")
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl.h"
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include "lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ui_helpers.h"
|
||||||
|
#include "ui_events.h"
|
||||||
|
#include "ui_theme_manager.h"
|
||||||
|
#include "ui_themes.h"
|
||||||
|
|
||||||
|
///////////////////// SCREENS ////////////////////
|
||||||
|
|
||||||
|
#include "ui_bootscreen.h"
|
||||||
|
#include "ui_Screen1.h"
|
||||||
|
#include "ui_settingscreen.h"
|
||||||
|
#include "ui_Screen2.h"
|
||||||
|
|
||||||
|
///////////////////// VARIABLES ////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
// EVENTS
|
||||||
|
|
||||||
|
extern lv_obj_t * ui____initial_actions0;
|
||||||
|
|
||||||
|
// IMAGES AND IMAGE SETS
|
||||||
|
LV_IMG_DECLARE(ui_img_logo_volante_png); // assets/Logo_volante.png
|
||||||
|
|
||||||
|
// FONTS
|
||||||
|
LV_FONT_DECLARE(ui_font_ajustes);
|
||||||
|
LV_FONT_DECLARE(ui_font_ajustesnames);
|
||||||
|
LV_FONT_DECLARE(ui_font_labeld);
|
||||||
|
LV_FONT_DECLARE(ui_font_labeld2);
|
||||||
|
LV_FONT_DECLARE(ui_font_labelt);
|
||||||
|
LV_FONT_DECLARE(ui_font_neutral);
|
||||||
|
LV_FONT_DECLARE(ui_font_offon);
|
||||||
|
LV_FONT_DECLARE(ui_font_rpm);
|
||||||
|
LV_FONT_DECLARE(ui_font_speed);
|
||||||
|
LV_FONT_DECLARE(ui_font_speedlabel);
|
||||||
|
LV_FONT_DECLARE(ui_font_warmup);
|
||||||
|
|
||||||
|
// UI INIT
|
||||||
|
void ui_init(void);
|
||||||
|
void ui_destroy(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
123
Pantalla/include/ui/ui_Screen1.h
Normal file
123
Pantalla/include/ui/ui_Screen1.h
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef UI_SCREEN1_H
|
||||||
|
#define UI_SCREEN1_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SCREEN: ui_Screen1
|
||||||
|
extern void ui_Screen1_screen_init(void);
|
||||||
|
extern void ui_Screen1_screen_destroy(void);
|
||||||
|
extern lv_obj_t * ui_Screen1;
|
||||||
|
extern lv_obj_t * ui_main;
|
||||||
|
extern lv_obj_t * ui_barcontainer;
|
||||||
|
extern lv_obj_t * ui_rpm0;
|
||||||
|
extern lv_obj_t * ui_rpmt0;
|
||||||
|
extern lv_obj_t * ui_rpm1;
|
||||||
|
extern lv_obj_t * ui_rpm2;
|
||||||
|
extern lv_obj_t * ui_rpmt1;
|
||||||
|
extern lv_obj_t * ui_rpm3;
|
||||||
|
extern lv_obj_t * ui_rpm4;
|
||||||
|
extern lv_obj_t * ui_rpmt2;
|
||||||
|
extern lv_obj_t * ui_rpm5;
|
||||||
|
extern lv_obj_t * ui_rpm6;
|
||||||
|
extern lv_obj_t * ui_rpmt3;
|
||||||
|
extern lv_obj_t * ui_rpm7;
|
||||||
|
extern lv_obj_t * ui_rpm8;
|
||||||
|
extern lv_obj_t * ui_rpmt4;
|
||||||
|
extern lv_obj_t * ui_rpm9;
|
||||||
|
extern lv_obj_t * ui_rpm10;
|
||||||
|
extern lv_obj_t * ui_rpmt5;
|
||||||
|
extern lv_obj_t * ui_rpm11;
|
||||||
|
extern lv_obj_t * ui_rpm12;
|
||||||
|
extern lv_obj_t * ui_rpmt6;
|
||||||
|
extern lv_obj_t * ui_rpm13;
|
||||||
|
extern lv_obj_t * ui_rpmt16;
|
||||||
|
extern lv_obj_t * ui_rpmt7;
|
||||||
|
extern lv_obj_t * ui_rpmt8;
|
||||||
|
extern lv_obj_t * ui_rpmt9;
|
||||||
|
extern lv_obj_t * ui_rpmt10;
|
||||||
|
extern lv_obj_t * ui_rpmt11;
|
||||||
|
extern lv_obj_t * ui_rpmt12;
|
||||||
|
extern lv_obj_t * ui_rpmbaja1;
|
||||||
|
extern lv_obj_t * ui_rpmbaja2;
|
||||||
|
extern lv_obj_t * ui_rpmbaja3;
|
||||||
|
extern lv_obj_t * ui_rpmbaja4;
|
||||||
|
extern lv_obj_t * ui_rpmbaja5;
|
||||||
|
extern lv_obj_t * ui_rpmbaja6;
|
||||||
|
extern lv_obj_t * ui_rpmbaja7;
|
||||||
|
extern lv_obj_t * ui_tiraledsrpmcontainer;
|
||||||
|
extern lv_obj_t * ui_led0;
|
||||||
|
extern lv_obj_t * ui_led1;
|
||||||
|
extern lv_obj_t * ui_led2;
|
||||||
|
extern lv_obj_t * ui_led3;
|
||||||
|
extern lv_obj_t * ui_led4;
|
||||||
|
extern lv_obj_t * ui_led5;
|
||||||
|
extern lv_obj_t * ui_led6;
|
||||||
|
extern lv_obj_t * ui_led7;
|
||||||
|
extern lv_obj_t * ui_led8;
|
||||||
|
extern lv_obj_t * ui_led9;
|
||||||
|
extern lv_obj_t * ui_led10;
|
||||||
|
extern lv_obj_t * ui_led11;
|
||||||
|
extern lv_obj_t * ui_led12;
|
||||||
|
extern lv_obj_t * ui_led13;
|
||||||
|
extern lv_obj_t * ui_led14;
|
||||||
|
extern lv_obj_t * ui_barrpm;
|
||||||
|
extern lv_obj_t * ui_rpma;
|
||||||
|
extern lv_obj_t * ui_rpmb;
|
||||||
|
extern lv_obj_t * ui_rpmname;
|
||||||
|
extern lv_obj_t * ui_rpm;
|
||||||
|
extern lv_obj_t * ui_oiltpanel;
|
||||||
|
extern lv_obj_t * ui_oilt;
|
||||||
|
extern lv_obj_t * ui_oiltname;
|
||||||
|
extern lv_obj_t * ui_oiltseparator;
|
||||||
|
extern lv_obj_t * ui_oilppanel;
|
||||||
|
extern lv_obj_t * ui_oilp;
|
||||||
|
extern lv_obj_t * ui_oilpseparator;
|
||||||
|
extern lv_obj_t * ui_oilpname;
|
||||||
|
extern lv_obj_t * ui_fuelppanel;
|
||||||
|
extern lv_obj_t * ui_fuelp;
|
||||||
|
extern lv_obj_t * ui_fuelpseparator;
|
||||||
|
extern lv_obj_t * ui_fuelpname;
|
||||||
|
extern lv_obj_t * ui_lambdapanel;
|
||||||
|
extern lv_obj_t * ui_lambda;
|
||||||
|
extern lv_obj_t * ui_lambdaname;
|
||||||
|
extern lv_obj_t * ui_lambdaseparator;
|
||||||
|
extern lv_obj_t * ui_watertpanel;
|
||||||
|
extern lv_obj_t * ui_watert;
|
||||||
|
extern lv_obj_t * ui_watertseparator;
|
||||||
|
extern lv_obj_t * ui_watertname;
|
||||||
|
extern lv_obj_t * ui_sdownpanel;
|
||||||
|
extern lv_obj_t * ui_sdownname;
|
||||||
|
extern lv_obj_t * ui_sdown;
|
||||||
|
extern lv_obj_t * ui_sdownseparator;
|
||||||
|
extern lv_obj_t * ui_vbatpanel;
|
||||||
|
extern lv_obj_t * ui_vbat;
|
||||||
|
extern lv_obj_t * ui_vbatseparator;
|
||||||
|
extern lv_obj_t * ui_vbatname;
|
||||||
|
extern lv_obj_t * ui_fanpanel;
|
||||||
|
extern lv_obj_t * ui_fanname;
|
||||||
|
extern lv_obj_t * ui_fan;
|
||||||
|
extern lv_obj_t * ui_fanseparator;
|
||||||
|
extern lv_obj_t * ui_neutralpanel;
|
||||||
|
extern lv_obj_t * ui_neutral;
|
||||||
|
extern lv_obj_t * ui_warmuppanel;
|
||||||
|
extern lv_obj_t * ui_warmup;
|
||||||
|
extern void ui_event_botonshowajustes(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_botonshowajustes;
|
||||||
|
extern void ui_event_ajustesboton(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_ajustesboton;
|
||||||
|
extern lv_obj_t * ui_ajustesnombre;
|
||||||
|
// CUSTOM VARIABLES
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
81
Pantalla/include/ui/ui_Screen2.h
Normal file
81
Pantalla/include/ui/ui_Screen2.h
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef UI_SCREEN2_H
|
||||||
|
#define UI_SCREEN2_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SCREEN: ui_Screen2
|
||||||
|
extern void ui_Screen2_screen_init(void);
|
||||||
|
extern void ui_Screen2_screen_destroy(void);
|
||||||
|
extern lv_obj_t * ui_Screen2;
|
||||||
|
extern lv_obj_t * ui_aux1panel;
|
||||||
|
extern lv_obj_t * ui_aux1name;
|
||||||
|
extern lv_obj_t * ui_aux1;
|
||||||
|
extern lv_obj_t * ui_aux1separator;
|
||||||
|
extern lv_obj_t * ui_aux3panel;
|
||||||
|
extern lv_obj_t * ui_aux3name;
|
||||||
|
extern lv_obj_t * ui_aux3;
|
||||||
|
extern lv_obj_t * ui_aux3separator;
|
||||||
|
extern lv_obj_t * ui_aux4panel;
|
||||||
|
extern lv_obj_t * ui_aux4name;
|
||||||
|
extern lv_obj_t * ui_aux4;
|
||||||
|
extern lv_obj_t * ui_aux4separator;
|
||||||
|
extern lv_obj_t * ui_aux5panel;
|
||||||
|
extern lv_obj_t * ui_aux5name;
|
||||||
|
extern lv_obj_t * ui_aux5;
|
||||||
|
extern lv_obj_t * ui_aux5separator;
|
||||||
|
extern lv_obj_t * ui_aux6panel;
|
||||||
|
extern lv_obj_t * ui_aux6name;
|
||||||
|
extern lv_obj_t * ui_aux6;
|
||||||
|
extern lv_obj_t * ui_aux6separator;
|
||||||
|
extern lv_obj_t * ui_aux7panel;
|
||||||
|
extern lv_obj_t * ui_aux7name;
|
||||||
|
extern lv_obj_t * ui_aux7;
|
||||||
|
extern lv_obj_t * ui_aux7separator;
|
||||||
|
extern lv_obj_t * ui_aux8panel;
|
||||||
|
extern lv_obj_t * ui_aux8name;
|
||||||
|
extern lv_obj_t * ui_aux8;
|
||||||
|
extern lv_obj_t * ui_aux8separator;
|
||||||
|
extern lv_obj_t * ui_dig1panel;
|
||||||
|
extern lv_obj_t * ui_dig1name;
|
||||||
|
extern lv_obj_t * ui_dig1;
|
||||||
|
extern lv_obj_t * ui_dig1separator;
|
||||||
|
extern lv_obj_t * ui_throttlepanel;
|
||||||
|
extern lv_obj_t * ui_throttlename;
|
||||||
|
extern lv_obj_t * ui_throttle;
|
||||||
|
extern lv_obj_t * ui_throttleseparator;
|
||||||
|
extern lv_obj_t * ui_nousepanel;
|
||||||
|
extern lv_obj_t * ui_nousename;
|
||||||
|
extern lv_obj_t * ui_nouse;
|
||||||
|
extern lv_obj_t * ui_nouseseparator;
|
||||||
|
extern lv_obj_t * ui_lambdtrgapanel;
|
||||||
|
extern lv_obj_t * ui_lambdatrgname;
|
||||||
|
extern lv_obj_t * ui_lambdatrg;
|
||||||
|
extern lv_obj_t * ui_lambdatrgseparator;
|
||||||
|
extern lv_obj_t * ui_mappanel;
|
||||||
|
extern lv_obj_t * ui_mapname;
|
||||||
|
extern lv_obj_t * ui_map;
|
||||||
|
extern lv_obj_t * ui_mapseparator;
|
||||||
|
extern lv_obj_t * ui_brakepanel;
|
||||||
|
extern lv_obj_t * ui_brakename;
|
||||||
|
extern lv_obj_t * ui_brake;
|
||||||
|
extern lv_obj_t * ui_brakeseparator;
|
||||||
|
extern void ui_event_botonshowajustes2(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_botonshowajustes2;
|
||||||
|
extern void ui_event_ajustesboton2(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_ajustesboton2;
|
||||||
|
extern lv_obj_t * ui_ajustesnombre2;
|
||||||
|
// CUSTOM VARIABLES
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
25
Pantalla/include/ui/ui_bootscreen.h
Normal file
25
Pantalla/include/ui/ui_bootscreen.h
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef UI_BOOTSCREEN_H
|
||||||
|
#define UI_BOOTSCREEN_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SCREEN: ui_bootscreen
|
||||||
|
extern void ui_bootscreen_screen_init(void);
|
||||||
|
extern void ui_bootscreen_screen_destroy(void);
|
||||||
|
extern lv_obj_t * ui_bootscreen;
|
||||||
|
extern lv_obj_t * ui_logoboot;
|
||||||
|
// CUSTOM VARIABLES
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
69
Pantalla/include/ui/ui_events.h
Normal file
69
Pantalla/include/ui/ui_events.h
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26
|
||||||
|
|
||||||
|
#ifndef _UI_EVENTS_H
|
||||||
|
#define _UI_EVENTS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void abrirajustes(lv_event_t * e);
|
||||||
|
void cerrarajustes(lv_event_t * e);
|
||||||
|
void opcionesdrop(lv_event_t * e);
|
||||||
|
void themesitch(lv_event_t * e);
|
||||||
|
void cambiarpantalla(lv_event_t * e);
|
||||||
|
void cambiardatos(lv_event_t * e);
|
||||||
|
|
||||||
|
void lessrpm_(lv_event_t * e);
|
||||||
|
void morerpm_(lv_event_t * e);
|
||||||
|
void lessdesp(lv_event_t * e);
|
||||||
|
void moredesp(lv_event_t * e);
|
||||||
|
void rpmdisplay(lv_event_t * e);
|
||||||
|
void lessdiffrpm(lv_event_t * e);
|
||||||
|
void morediffrpm(lv_event_t * e);
|
||||||
|
|
||||||
|
void lessvbatttoohigh(lv_event_t * e);
|
||||||
|
void morevbatttoohigh(lv_event_t * e);
|
||||||
|
void lessvbatthigh(lv_event_t * e);
|
||||||
|
void morebvbatthigh(lv_event_t * e);
|
||||||
|
void lessvbattlow(lv_event_t * e);
|
||||||
|
void morevbattlow(lv_event_t * e);
|
||||||
|
|
||||||
|
void lesswaterhot(lv_event_t * e);
|
||||||
|
void mroewaterhot(lv_event_t * e);
|
||||||
|
void lesswatermild(lv_event_t * e);
|
||||||
|
void morewatermild(lv_event_t * e);
|
||||||
|
void lesswatercold(lv_event_t * e);
|
||||||
|
void morewatercold(lv_event_t * e);
|
||||||
|
|
||||||
|
void lessoilhot(lv_event_t * e);
|
||||||
|
void moreoilhot(lv_event_t * e);
|
||||||
|
void lessoilmild(lv_event_t * e);
|
||||||
|
void moreoilmild(lv_event_t * e);
|
||||||
|
void lessoilcold(lv_event_t * e);
|
||||||
|
void moreoilcold(lv_event_t * e);
|
||||||
|
|
||||||
|
void lessoilptoohigh(lv_event_t * e);
|
||||||
|
void moreoilptoohigh(lv_event_t * e);
|
||||||
|
void lessoilphigh(lv_event_t * e);
|
||||||
|
void moreoilphigh(lv_event_t * e);
|
||||||
|
void lessoilplow(lv_event_t * e);
|
||||||
|
void moreoilplow(lv_event_t * e);
|
||||||
|
|
||||||
|
void lessfuelptoohigh(lv_event_t * e);
|
||||||
|
void morefuelptoohigh(lv_event_t * e);
|
||||||
|
void lessfuelphigh(lv_event_t * e);
|
||||||
|
void morefuelphigh(lv_event_t * e);
|
||||||
|
void lessfuelp(lv_event_t * e);
|
||||||
|
void morefuelplow(lv_event_t * e);
|
||||||
|
|
||||||
|
void refresh_ui_values();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
148
Pantalla/include/ui/ui_helpers.h
Normal file
148
Pantalla/include/ui/ui_helpers.h
Normal file
|
|
@ -0,0 +1,148 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef _G26_V3_UI_HELPERS_H
|
||||||
|
#define _G26_V3_UI_HELPERS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ui.h"
|
||||||
|
|
||||||
|
#define _UI_TEMPORARY_STRING_BUFFER_SIZE 32
|
||||||
|
#define _UI_BAR_PROPERTY_VALUE 0
|
||||||
|
#define _UI_BAR_PROPERTY_VALUE_WITH_ANIM 1
|
||||||
|
void _ui_bar_set_property(lv_obj_t * target, int id, int val);
|
||||||
|
|
||||||
|
#define _UI_BASIC_PROPERTY_POSITION_X 0
|
||||||
|
#define _UI_BASIC_PROPERTY_POSITION_Y 1
|
||||||
|
#define _UI_BASIC_PROPERTY_WIDTH 2
|
||||||
|
#define _UI_BASIC_PROPERTY_HEIGHT 3
|
||||||
|
void _ui_basic_set_property(lv_obj_t * target, int id, int val);
|
||||||
|
|
||||||
|
#define _UI_DROPDOWN_PROPERTY_SELECTED 0
|
||||||
|
void _ui_dropdown_set_property(lv_obj_t * target, int id, int val);
|
||||||
|
|
||||||
|
#define _UI_IMAGE_PROPERTY_IMAGE 0
|
||||||
|
void _ui_image_set_property(lv_obj_t * target, int id, uint8_t * val);
|
||||||
|
|
||||||
|
#define _UI_LABEL_PROPERTY_TEXT 0
|
||||||
|
void _ui_label_set_property(lv_obj_t * target, int id, const char * val);
|
||||||
|
|
||||||
|
#define _UI_ROLLER_PROPERTY_SELECTED 0
|
||||||
|
#define _UI_ROLLER_PROPERTY_SELECTED_WITH_ANIM 1
|
||||||
|
void _ui_roller_set_property(lv_obj_t * target, int id, int val);
|
||||||
|
|
||||||
|
#define _UI_SLIDER_PROPERTY_VALUE 0
|
||||||
|
#define _UI_SLIDER_PROPERTY_VALUE_WITH_ANIM 1
|
||||||
|
void _ui_slider_set_property(lv_obj_t * target, int id, int val);
|
||||||
|
|
||||||
|
void _ui_screen_change(lv_obj_t ** target, lv_scr_load_anim_t fademode, int spd, int delay, void (*target_init)(void));
|
||||||
|
|
||||||
|
void _ui_screen_delete(void (*target)(void));
|
||||||
|
|
||||||
|
void _ui_arc_increment(lv_obj_t * target, int val);
|
||||||
|
|
||||||
|
void _ui_bar_increment(lv_obj_t * target, int val, int anm);
|
||||||
|
|
||||||
|
void _ui_slider_increment(lv_obj_t * target, int val, int anm);
|
||||||
|
|
||||||
|
void _ui_keyboard_set_target(lv_obj_t * keyboard, lv_obj_t * textarea);
|
||||||
|
|
||||||
|
#define _UI_MODIFY_FLAG_ADD 0
|
||||||
|
#define _UI_MODIFY_FLAG_REMOVE 1
|
||||||
|
#define _UI_MODIFY_FLAG_TOGGLE 2
|
||||||
|
void _ui_flag_modify(lv_obj_t * target, int32_t flag, int value);
|
||||||
|
|
||||||
|
#define _UI_MODIFY_STATE_ADD 0
|
||||||
|
#define _UI_MODIFY_STATE_REMOVE 1
|
||||||
|
#define _UI_MODIFY_STATE_TOGGLE 2
|
||||||
|
void _ui_state_modify(lv_obj_t * target, int32_t state, int value);
|
||||||
|
|
||||||
|
#define UI_MOVE_CURSOR_UP 0
|
||||||
|
#define UI_MOVE_CURSOR_RIGHT 1
|
||||||
|
#define UI_MOVE_CURSOR_DOWN 2
|
||||||
|
#define UI_MOVE_CURSOR_LEFT 3
|
||||||
|
void _ui_textarea_move_cursor(lv_obj_t * target, int val)
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
void scr_unloaded_delete_cb(lv_event_t * e);
|
||||||
|
|
||||||
|
void _ui_opacity_set(lv_obj_t * target, int val);
|
||||||
|
|
||||||
|
/** Describes an animation*/
|
||||||
|
typedef struct _ui_anim_user_data_t {
|
||||||
|
lv_obj_t * target;
|
||||||
|
lv_img_dsc_t ** imgset;
|
||||||
|
int32_t imgset_size;
|
||||||
|
int32_t val;
|
||||||
|
} ui_anim_user_data_t;
|
||||||
|
void _ui_anim_callback_free_user_data(lv_anim_t * a);
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_x(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_y(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_width(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_height(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_opacity(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_image_zoom(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_image_angle(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_image_frame(lv_anim_t * a, int32_t v);
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_x(lv_anim_t * a);
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_y(lv_anim_t * a);
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_width(lv_anim_t * a);
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_height(lv_anim_t * a);
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_opacity(lv_anim_t * a);
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_image_zoom(lv_anim_t * a);
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_image_angle(lv_anim_t * a);
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_image_frame(lv_anim_t * a);
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_arc_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix);
|
||||||
|
|
||||||
|
void _ui_slider_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix);
|
||||||
|
|
||||||
|
void _ui_checked_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * txt_on, const char * txt_off);
|
||||||
|
|
||||||
|
void _ui_spinbox_step(lv_obj_t * target, int val)
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_switch_theme(int val)
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
196
Pantalla/include/ui/ui_settingscreen.h
Normal file
196
Pantalla/include/ui/ui_settingscreen.h
Normal file
|
|
@ -0,0 +1,196 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef UI_SETTINGSCREEN_H
|
||||||
|
#define UI_SETTINGSCREEN_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SCREEN: ui_settingscreen
|
||||||
|
extern void ui_settingscreen_screen_init(void);
|
||||||
|
extern void ui_settingscreen_screen_destroy(void);
|
||||||
|
extern lv_obj_t * ui_settingscreen;
|
||||||
|
extern lv_obj_t * ui_cross1;
|
||||||
|
extern lv_obj_t * ui_cross2;
|
||||||
|
extern void ui_event_cerrarajustesboton(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_cerrarajustesboton;
|
||||||
|
extern lv_obj_t * ui_ajustesname;
|
||||||
|
extern lv_obj_t * ui_ajustesseparator;
|
||||||
|
extern lv_obj_t * ui_opcionname;
|
||||||
|
extern void ui_event_opciondrop(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_opciondrop;
|
||||||
|
extern lv_obj_t * ui_settingsmain;
|
||||||
|
extern lv_obj_t * ui_modooscuroname;
|
||||||
|
extern void ui_event_modooscuoswitch(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_modooscuoswitch;
|
||||||
|
extern lv_obj_t * ui_pantallaname;
|
||||||
|
extern void ui_event_pantalladrop(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_pantalladrop;
|
||||||
|
extern lv_obj_t * ui_recepciondatosname;
|
||||||
|
extern void ui_event_recepciondatosdrop(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_recepciondatosdrop;
|
||||||
|
extern lv_obj_t * ui_settingsrpm;
|
||||||
|
extern lv_obj_t * ui_rpmfinalname;
|
||||||
|
extern lv_obj_t * ui_rpmfinalvalue;
|
||||||
|
extern void ui_event_lessrpm(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessrpm;
|
||||||
|
extern lv_obj_t * ui_lessrpmname;
|
||||||
|
extern void ui_event_morerpm(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morerpm;
|
||||||
|
extern lv_obj_t * ui_morerpmname;
|
||||||
|
extern lv_obj_t * ui_desplazamientoname;
|
||||||
|
extern lv_obj_t * ui_desplazamientovalue;
|
||||||
|
extern void ui_event_lessdesp(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessdesp;
|
||||||
|
extern lv_obj_t * ui_lessdespname;
|
||||||
|
extern void ui_event_moredesp(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moredesp;
|
||||||
|
extern lv_obj_t * ui_moredespname;
|
||||||
|
extern lv_obj_t * ui_rpmdisplayname;
|
||||||
|
extern void ui_event_rpmdisplaydrop(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_rpmdisplaydrop;
|
||||||
|
extern lv_obj_t * ui_diffrpmname;
|
||||||
|
extern lv_obj_t * ui_diffrpmvalue;
|
||||||
|
extern void ui_event_lessdiffrpm(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessdiffrpm;
|
||||||
|
extern lv_obj_t * ui_lessdiffrpmname;
|
||||||
|
extern void ui_event_morediffrpm(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morediffrpm;
|
||||||
|
extern lv_obj_t * ui_morediffrpmname;
|
||||||
|
extern lv_obj_t * ui_settingsvbatt;
|
||||||
|
extern lv_obj_t * ui_vbatttoohigh;
|
||||||
|
extern lv_obj_t * ui_vbatttoohighvalue;
|
||||||
|
extern void ui_event_lessvbatttoohigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessvbatttoohigh;
|
||||||
|
extern lv_obj_t * ui_lessvbatttoohighname;
|
||||||
|
extern void ui_event_morevbatttoohigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morevbatttoohigh;
|
||||||
|
extern lv_obj_t * ui_morevbatttoohighname;
|
||||||
|
extern lv_obj_t * ui_vbatthighname;
|
||||||
|
extern lv_obj_t * ui_vbatthighvalue;
|
||||||
|
extern void ui_event_lessvbatthigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessvbatthigh;
|
||||||
|
extern lv_obj_t * ui_lessvbatthighname;
|
||||||
|
extern void ui_event_morevbatthigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morevbatthigh;
|
||||||
|
extern lv_obj_t * ui_morevbatthighname;
|
||||||
|
extern lv_obj_t * ui_vbattlowname;
|
||||||
|
extern lv_obj_t * ui_vbattlowvalue;
|
||||||
|
extern void ui_event_lessvbattlow(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessvbattlow;
|
||||||
|
extern lv_obj_t * ui_lessvbattlowname;
|
||||||
|
extern void ui_event_morevbattlow(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morevbattlow;
|
||||||
|
extern lv_obj_t * ui_morevbattlowname;
|
||||||
|
extern lv_obj_t * ui_settingswatert;
|
||||||
|
extern lv_obj_t * ui_waterhotname;
|
||||||
|
extern lv_obj_t * ui_waterhotvalue;
|
||||||
|
extern void ui_event_lessrwaterhot(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessrwaterhot;
|
||||||
|
extern lv_obj_t * ui_lessrwaterhotname;
|
||||||
|
extern void ui_event_morerwaterhot(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morerwaterhot;
|
||||||
|
extern lv_obj_t * ui_morerwaterhotname;
|
||||||
|
extern lv_obj_t * ui_watermidname;
|
||||||
|
extern lv_obj_t * ui_watermidvalue;
|
||||||
|
extern void ui_event_lesswatermid(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lesswatermid;
|
||||||
|
extern lv_obj_t * ui_lesswatermidname;
|
||||||
|
extern void ui_event_morewatermid(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morewatermid;
|
||||||
|
extern lv_obj_t * ui_morewatermid1;
|
||||||
|
extern lv_obj_t * ui_watercoldname;
|
||||||
|
extern lv_obj_t * ui_watercoldvalue;
|
||||||
|
extern void ui_event_lesswatercold(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lesswatercold;
|
||||||
|
extern lv_obj_t * ui_lesswatercoldname;
|
||||||
|
extern void ui_event_morewatercold(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morewatercold;
|
||||||
|
extern lv_obj_t * ui_morewatercoldname;
|
||||||
|
extern lv_obj_t * ui_settingsoilt;
|
||||||
|
extern lv_obj_t * ui_oilhotname;
|
||||||
|
extern lv_obj_t * ui_oilhotvalue;
|
||||||
|
extern void ui_event_lessoilhot(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessoilhot;
|
||||||
|
extern lv_obj_t * ui_lessoilhotname;
|
||||||
|
extern void ui_event_moreoilhot(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moreoilhot;
|
||||||
|
extern lv_obj_t * ui_moreoilhotname;
|
||||||
|
extern lv_obj_t * ui_oilmildname;
|
||||||
|
extern lv_obj_t * ui_oilmildvalue;
|
||||||
|
extern void ui_event_lessoilmild(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessoilmild;
|
||||||
|
extern lv_obj_t * ui_lessoilmildname;
|
||||||
|
extern void ui_event_moreoilmild(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moreoilmild;
|
||||||
|
extern lv_obj_t * ui_moreoilmildname;
|
||||||
|
extern lv_obj_t * ui_oilcoldname;
|
||||||
|
extern lv_obj_t * ui_oilcoldvalue;
|
||||||
|
extern void ui_event_lessoilcold(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessoilcold;
|
||||||
|
extern lv_obj_t * ui_lessoilcoldname;
|
||||||
|
extern void ui_event_moreoilcold(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moreoilcold;
|
||||||
|
extern lv_obj_t * ui_moreoilcoldname;
|
||||||
|
extern lv_obj_t * ui_settingsoilp;
|
||||||
|
extern lv_obj_t * ui_oilptoohighname;
|
||||||
|
extern lv_obj_t * ui_oilptoohighvalue;
|
||||||
|
extern void ui_event_lessoilptoohigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessoilptoohigh;
|
||||||
|
extern lv_obj_t * ui_lessoilptoohighname;
|
||||||
|
extern void ui_event_moreoilptoohigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moreoilptoohigh;
|
||||||
|
extern lv_obj_t * ui_moreoilptoohighname;
|
||||||
|
extern lv_obj_t * ui_oilphighname;
|
||||||
|
extern lv_obj_t * ui_oilphighvalue;
|
||||||
|
extern void ui_event_lessoilphigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessoilphigh;
|
||||||
|
extern lv_obj_t * ui_lessoilphighname;
|
||||||
|
extern void ui_event_moreoilphigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moreoilphigh;
|
||||||
|
extern lv_obj_t * ui_moreoilphighname;
|
||||||
|
extern lv_obj_t * ui_oilplowname;
|
||||||
|
extern lv_obj_t * ui_oilplowvalue;
|
||||||
|
extern void ui_event_lessoilplow(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessoilplow;
|
||||||
|
extern lv_obj_t * ui_lessoilplowname;
|
||||||
|
extern void ui_event_moreoilplow(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_moreoilplow;
|
||||||
|
extern lv_obj_t * ui_moreoilploname;
|
||||||
|
extern lv_obj_t * ui_settingsfuelp;
|
||||||
|
extern lv_obj_t * ui_fuelptoohighname;
|
||||||
|
extern lv_obj_t * ui_fuelptoohighvalue;
|
||||||
|
extern void ui_event_lessfuelptoohigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessfuelptoohigh;
|
||||||
|
extern lv_obj_t * ui_lessfuelptoohighname;
|
||||||
|
extern void ui_event_morefuelptoohigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morefuelptoohigh;
|
||||||
|
extern lv_obj_t * ui_morefuelptoohighname;
|
||||||
|
extern lv_obj_t * ui_fuelphighname;
|
||||||
|
extern lv_obj_t * ui_fuelphighvalue;
|
||||||
|
extern void ui_event_lessfuelphigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessfuelphigh;
|
||||||
|
extern lv_obj_t * ui_lessfuelphighname;
|
||||||
|
extern void ui_event_morefuelphigh(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morefuelphigh;
|
||||||
|
extern lv_obj_t * ui_morefuelphighname;
|
||||||
|
extern lv_obj_t * ui_fuelplowname;
|
||||||
|
extern lv_obj_t * ui_fuelplowvalue;
|
||||||
|
extern void ui_event_lessfuelplow(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_lessfuelplow;
|
||||||
|
extern lv_obj_t * ui_lessfuelplowname;
|
||||||
|
extern void ui_event_morefuelplow(lv_event_t * e);
|
||||||
|
extern lv_obj_t * ui_morefuelplow;
|
||||||
|
extern lv_obj_t * ui_morefuelplowname;
|
||||||
|
// CUSTOM VARIABLES
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
75
Pantalla/include/ui/ui_theme_manager.h
Normal file
75
Pantalla/include/ui/ui_theme_manager.h
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.4.3+
|
||||||
|
|
||||||
|
#ifndef _UI_THEME_MANAGER_H
|
||||||
|
#define _UI_THEME_MANAGER_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UI_THEME_ACTIVE 1
|
||||||
|
|
||||||
|
/*#ifndef LV_SQUARELINE_THEME__IMPLICIT_GARBAGE_COLLECTOR
|
||||||
|
#ifndef LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD //for slow hardware, tells how frequently the style-properties inside this style should be garbage-collected (recommended value: 10..100, 0:never)
|
||||||
|
#define LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD 100 //a sensible default value that already gives good results on slow hardware, can be overridden from outside
|
||||||
|
#endif
|
||||||
|
#endif*/
|
||||||
|
|
||||||
|
|
||||||
|
enum { UI_VARIABLE_STYLES_MODE_INIT = 1, UI_VARIABLE_STYLES_MODE_FOLLOW = 0 };
|
||||||
|
|
||||||
|
|
||||||
|
typedef int64_t ui_style_variable_t;
|
||||||
|
typedef ui_style_variable_t ui_theme_variable_t; //A 'theme' variable array is an array of 'style' variables for corresponding themes.
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
lv_obj_t * object_p;
|
||||||
|
lv_style_selector_t selector;
|
||||||
|
lv_style_prop_t property;
|
||||||
|
/*#ifdef LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE //for slow hardware, adding this and setting to 5..10 in lv_conf.h might make it faster (less lv_obj_is_valid calls)
|
||||||
|
uint16_t validcheck_counter; //used for garbage collection (finding empty slots) not to call lv_obj_is_valid() every time
|
||||||
|
#endif*/
|
||||||
|
void * next_p;
|
||||||
|
} _ui_local_style_property_setting_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool is_themeable; //scalar or vector?
|
||||||
|
ui_style_variable_t * style_variable_p;
|
||||||
|
ui_style_variable_t * previous_pointer;
|
||||||
|
ui_style_variable_t previous_value;
|
||||||
|
uint32_t style_property_setting_count;
|
||||||
|
_ui_local_style_property_setting_t * style_property_settings;
|
||||||
|
/*#ifdef LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD
|
||||||
|
uint16_t garbage_collector_couter;
|
||||||
|
#endif*/
|
||||||
|
} _ui_local_style_t;
|
||||||
|
|
||||||
|
|
||||||
|
extern _ui_local_style_t * _ui_local_styles;
|
||||||
|
extern uint32_t _ui_local_style_count;
|
||||||
|
|
||||||
|
|
||||||
|
void ui_object_set_local_style_property
|
||||||
|
(lv_obj_t* object_p, lv_style_selector_t selector, lv_style_prop_t property, ui_style_variable_t value );
|
||||||
|
|
||||||
|
void ui_object_set_themeable_style_property
|
||||||
|
(lv_obj_t* object_p, lv_style_selector_t selector, lv_style_prop_t property, const ui_theme_variable_t* theme_variable_p);
|
||||||
|
|
||||||
|
void _ui_theme_set_variable_styles (uint8_t mode);
|
||||||
|
|
||||||
|
lv_style_value_t _ui_style_value_convert (lv_style_prop_t property, ui_style_variable_t value);
|
||||||
|
ui_style_variable_t ui_get_theme_value (const ui_theme_variable_t *var);
|
||||||
|
|
||||||
|
_ui_local_style_t * _ui_local_style_create (const ui_style_variable_t * style_variable_p, bool is_themeable);
|
||||||
|
|
||||||
|
_ui_local_style_property_setting_t * _ui_local_style_property_setting_create
|
||||||
|
(_ui_local_style_t * local_style, lv_obj_t * object_p, lv_style_selector_t selector, lv_style_prop_t property);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
46
Pantalla/include/ui/ui_themes.h
Normal file
46
Pantalla/include/ui/ui_themes.h
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#ifndef _UI_THEMES_H
|
||||||
|
#define _UI_THEMES_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UI_THEME_COLOR_FONDO 0
|
||||||
|
#define UI_THEME_COLOR_TEXTO 1
|
||||||
|
#define UI_THEME_COLOR_FBARRA 2
|
||||||
|
#define UI_THEME_COLOR_BARRAR 3
|
||||||
|
|
||||||
|
#define UI_THEME_DEFAULT 0
|
||||||
|
|
||||||
|
#define UI_THEME_OSCURO 1
|
||||||
|
|
||||||
|
#define UI_THEME_CLARO 2
|
||||||
|
|
||||||
|
extern const ui_theme_variable_t _ui_theme_color_fondo[3];
|
||||||
|
extern const ui_theme_variable_t _ui_theme_alpha_fondo[3];
|
||||||
|
|
||||||
|
extern const ui_theme_variable_t _ui_theme_color_texto[3];
|
||||||
|
extern const ui_theme_variable_t _ui_theme_alpha_texto[3];
|
||||||
|
|
||||||
|
extern const ui_theme_variable_t _ui_theme_color_fbarra[3];
|
||||||
|
extern const ui_theme_variable_t _ui_theme_alpha_fbarra[3];
|
||||||
|
|
||||||
|
extern const ui_theme_variable_t _ui_theme_color_barrar[3];
|
||||||
|
extern const ui_theme_variable_t _ui_theme_alpha_barrar[3];
|
||||||
|
|
||||||
|
extern const uint32_t * ui_theme_colors[3];
|
||||||
|
extern const uint8_t * ui_theme_alphas[3];
|
||||||
|
extern uint8_t ui_theme_idx;
|
||||||
|
|
||||||
|
void ui_theme_set(uint8_t theme_idx);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /*extern "C"*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
784
Pantalla/lv_conf.h
Normal file
784
Pantalla/lv_conf.h
Normal file
|
|
@ -0,0 +1,784 @@
|
||||||
|
/**
|
||||||
|
* @file lv_conf.h
|
||||||
|
* Configuration file for v8.4.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy this file as `lv_conf.h`
|
||||||
|
* 1. simply next to the `lvgl` folder
|
||||||
|
* 2. or any other places and
|
||||||
|
* - define `LV_CONF_INCLUDE_SIMPLE`
|
||||||
|
* - add the path as include path
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
#if 1 /*Set it to "1" to enable content*/
|
||||||
|
|
||||||
|
#ifndef LV_CONF_H
|
||||||
|
#define LV_CONF_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*====================
|
||||||
|
COLOR SETTINGS
|
||||||
|
*====================*/
|
||||||
|
|
||||||
|
/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
|
||||||
|
#define LV_COLOR_DEPTH 16
|
||||||
|
|
||||||
|
/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
|
||||||
|
#define LV_COLOR_16_SWAP 0
|
||||||
|
|
||||||
|
/*Enable features to draw on transparent background.
|
||||||
|
*It's required if opa, and transform_* style properties are used.
|
||||||
|
*Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
|
||||||
|
#define LV_COLOR_SCREEN_TRANSP 0
|
||||||
|
|
||||||
|
/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
|
||||||
|
* 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */
|
||||||
|
#define LV_COLOR_MIX_ROUND_OFS 0
|
||||||
|
|
||||||
|
/*Images pixels with this color will not be drawn if they are chroma keyed)*/
|
||||||
|
#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/
|
||||||
|
|
||||||
|
/*=========================
|
||||||
|
MEMORY SETTINGS
|
||||||
|
*=========================*/
|
||||||
|
|
||||||
|
/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
|
||||||
|
#define LV_MEM_CUSTOM 0
|
||||||
|
#if LV_MEM_CUSTOM == 0
|
||||||
|
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
|
||||||
|
#define LV_MEM_SIZE (160U * 1024U) /*[bytes]*/
|
||||||
|
|
||||||
|
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
|
||||||
|
#define LV_MEM_ADR 0 /*0: unused*/
|
||||||
|
/*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
|
||||||
|
#if LV_MEM_ADR == 0
|
||||||
|
#undef LV_MEM_POOL_INCLUDE
|
||||||
|
#undef LV_MEM_POOL_ALLOC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /*LV_MEM_CUSTOM*/
|
||||||
|
#define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
|
||||||
|
#define LV_MEM_CUSTOM_ALLOC malloc
|
||||||
|
#define LV_MEM_CUSTOM_FREE free
|
||||||
|
#define LV_MEM_CUSTOM_REALLOC realloc
|
||||||
|
#endif /*LV_MEM_CUSTOM*/
|
||||||
|
|
||||||
|
/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms.
|
||||||
|
*You will see an error log message if there wasn't enough buffers. */
|
||||||
|
#define LV_MEM_BUF_MAX_NUM 16
|
||||||
|
|
||||||
|
/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/
|
||||||
|
#define LV_MEMCPY_MEMSET_STD 0
|
||||||
|
|
||||||
|
/*====================
|
||||||
|
HAL SETTINGS
|
||||||
|
*====================*/
|
||||||
|
|
||||||
|
/*Default display refresh period. LVG will redraw changed areas with this period time*/
|
||||||
|
#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/
|
||||||
|
|
||||||
|
/*Input device read period in milliseconds*/
|
||||||
|
#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/
|
||||||
|
|
||||||
|
/*Use a custom tick source that tells the elapsed time in milliseconds.
|
||||||
|
*It removes the need to manually update the tick with `lv_tick_inc()`)*/
|
||||||
|
#define LV_TICK_CUSTOM 1
|
||||||
|
#if LV_TICK_CUSTOM
|
||||||
|
#define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
|
||||||
|
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
|
||||||
|
/*If using lvgl as ESP32 component*/
|
||||||
|
// #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h"
|
||||||
|
// #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL))
|
||||||
|
#endif /*LV_TICK_CUSTOM*/
|
||||||
|
|
||||||
|
/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
|
||||||
|
*(Not so important, you can adjust it to modify default sizes and spaces)*/
|
||||||
|
#define LV_DPI_DEF 130 /*[px/inch]*/
|
||||||
|
|
||||||
|
/*=======================
|
||||||
|
* FEATURE CONFIGURATION
|
||||||
|
*=======================*/
|
||||||
|
|
||||||
|
/*-------------
|
||||||
|
* Drawing
|
||||||
|
*-----------*/
|
||||||
|
|
||||||
|
/*Enable complex draw engine.
|
||||||
|
*Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/
|
||||||
|
#define LV_DRAW_COMPLEX 1
|
||||||
|
#if LV_DRAW_COMPLEX != 0
|
||||||
|
|
||||||
|
/*Allow buffering some shadow calculation.
|
||||||
|
*LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
|
||||||
|
*Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/
|
||||||
|
#define LV_SHADOW_CACHE_SIZE 0
|
||||||
|
|
||||||
|
/* Set number of maximally cached circle data.
|
||||||
|
* The circumference of 1/4 circle are saved for anti-aliasing
|
||||||
|
* radius * 4 bytes are used per circle (the most often used radiuses are saved)
|
||||||
|
* 0: to disable caching */
|
||||||
|
#define LV_CIRCLE_CACHE_SIZE 4
|
||||||
|
#endif /*LV_DRAW_COMPLEX*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
|
||||||
|
* and blend it as an image with the given opacity.
|
||||||
|
* Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
|
||||||
|
* The widget can be buffered in smaller chunks to avoid using large buffers.
|
||||||
|
*
|
||||||
|
* - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
|
||||||
|
* - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
|
||||||
|
*
|
||||||
|
* Both buffer sizes are in bytes.
|
||||||
|
* "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
|
||||||
|
* and can't be drawn in chunks. So these settings affects only widgets with opacity.
|
||||||
|
*/
|
||||||
|
#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024)
|
||||||
|
#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
|
||||||
|
|
||||||
|
/*Default image cache size. Image caching keeps the images opened.
|
||||||
|
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
|
||||||
|
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
|
||||||
|
*However the opened images might consume additional RAM.
|
||||||
|
*0: to disable caching*/
|
||||||
|
#define LV_IMG_CACHE_DEF_SIZE 0
|
||||||
|
|
||||||
|
/*Number of stops allowed per gradient. Increase this to allow more stops.
|
||||||
|
*This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/
|
||||||
|
#define LV_GRADIENT_MAX_STOPS 2
|
||||||
|
|
||||||
|
/*Default gradient buffer size.
|
||||||
|
*When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
|
||||||
|
*LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
|
||||||
|
*If the cache is too small the map will be allocated only while it's required for the drawing.
|
||||||
|
*0 mean no caching.*/
|
||||||
|
#define LV_GRAD_CACHE_DEF_SIZE 0
|
||||||
|
|
||||||
|
/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
|
||||||
|
*LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
|
||||||
|
*The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */
|
||||||
|
#define LV_DITHER_GRADIENT 0
|
||||||
|
#if LV_DITHER_GRADIENT
|
||||||
|
/*Add support for error diffusion dithering.
|
||||||
|
*Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
|
||||||
|
*The increase in memory consumption is (24 bits * object's width)*/
|
||||||
|
#define LV_DITHER_ERROR_DIFFUSION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Maximum buffer size to allocate for rotation.
|
||||||
|
*Only used if software rotation is enabled in the display driver.*/
|
||||||
|
#define LV_DISP_ROT_MAX_BUF (10*1024)
|
||||||
|
|
||||||
|
/*-------------
|
||||||
|
* GPU
|
||||||
|
*-----------*/
|
||||||
|
|
||||||
|
/*Use Arm's 2D acceleration library Arm-2D */
|
||||||
|
#define LV_USE_GPU_ARM2D 0
|
||||||
|
|
||||||
|
/*Use STM32's DMA2D (aka Chrom Art) GPU*/
|
||||||
|
#define LV_USE_GPU_STM32_DMA2D 0
|
||||||
|
#if LV_USE_GPU_STM32_DMA2D
|
||||||
|
/*Must be defined to include path of CMSIS header of target processor
|
||||||
|
e.g. "stm32f7xx.h" or "stm32f4xx.h"*/
|
||||||
|
#define LV_GPU_DMA2D_CMSIS_INCLUDE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Enable RA6M3 G2D GPU*/
|
||||||
|
#define LV_USE_GPU_RA6M3_G2D 0
|
||||||
|
#if LV_USE_GPU_RA6M3_G2D
|
||||||
|
/*include path of target processor
|
||||||
|
e.g. "hal_data.h"*/
|
||||||
|
#define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Use SWM341's DMA2D GPU*/
|
||||||
|
#define LV_USE_GPU_SWM341_DMA2D 0
|
||||||
|
#if LV_USE_GPU_SWM341_DMA2D
|
||||||
|
#define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Use NXP's PXP GPU iMX RTxxx platforms*/
|
||||||
|
#define LV_USE_GPU_NXP_PXP 0
|
||||||
|
#if LV_USE_GPU_NXP_PXP
|
||||||
|
/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
|
||||||
|
* and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS
|
||||||
|
* has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
|
||||||
|
*0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
|
||||||
|
*/
|
||||||
|
#define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/
|
||||||
|
#define LV_USE_GPU_NXP_VG_LITE 0
|
||||||
|
|
||||||
|
/*Use SDL renderer API*/
|
||||||
|
#define LV_USE_GPU_SDL 0
|
||||||
|
#if LV_USE_GPU_SDL
|
||||||
|
#define LV_GPU_SDL_INCLUDE_PATH <SDL2/SDL.h>
|
||||||
|
/*Texture cache size, 8MB by default*/
|
||||||
|
#define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8)
|
||||||
|
/*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/
|
||||||
|
#define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------
|
||||||
|
* Logging
|
||||||
|
*-----------*/
|
||||||
|
|
||||||
|
/*Enable the log module*/
|
||||||
|
#define LV_USE_LOG 0
|
||||||
|
#if LV_USE_LOG
|
||||||
|
|
||||||
|
/*How important log should be added:
|
||||||
|
*LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
|
||||||
|
*LV_LOG_LEVEL_INFO Log important events
|
||||||
|
*LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
|
||||||
|
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
|
||||||
|
*LV_LOG_LEVEL_USER Only logs added by the user
|
||||||
|
*LV_LOG_LEVEL_NONE Do not log anything*/
|
||||||
|
#define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
|
||||||
|
|
||||||
|
/*1: Print the log with 'printf';
|
||||||
|
*0: User need to register a callback with `lv_log_register_print_cb()`*/
|
||||||
|
#define LV_LOG_PRINTF 0
|
||||||
|
|
||||||
|
/*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/
|
||||||
|
#define LV_LOG_TRACE_MEM 1
|
||||||
|
#define LV_LOG_TRACE_TIMER 1
|
||||||
|
#define LV_LOG_TRACE_INDEV 1
|
||||||
|
#define LV_LOG_TRACE_DISP_REFR 1
|
||||||
|
#define LV_LOG_TRACE_EVENT 1
|
||||||
|
#define LV_LOG_TRACE_OBJ_CREATE 1
|
||||||
|
#define LV_LOG_TRACE_LAYOUT 1
|
||||||
|
#define LV_LOG_TRACE_ANIM 1
|
||||||
|
|
||||||
|
#endif /*LV_USE_LOG*/
|
||||||
|
|
||||||
|
/*-------------
|
||||||
|
* Asserts
|
||||||
|
*-----------*/
|
||||||
|
|
||||||
|
/*Enable asserts if an operation is failed or an invalid data is found.
|
||||||
|
*If LV_USE_LOG is enabled an error message will be printed on failure*/
|
||||||
|
#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/
|
||||||
|
#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/
|
||||||
|
#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/
|
||||||
|
#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/
|
||||||
|
#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/
|
||||||
|
|
||||||
|
/*Add a custom handler when assert happens e.g. to restart the MCU*/
|
||||||
|
#define LV_ASSERT_HANDLER_INCLUDE <stdint.h>
|
||||||
|
#define LV_ASSERT_HANDLER while(1); /*Halt by default*/
|
||||||
|
|
||||||
|
/*-------------
|
||||||
|
* Others
|
||||||
|
*-----------*/
|
||||||
|
|
||||||
|
/*1: Show CPU usage and FPS count*/
|
||||||
|
#define LV_USE_PERF_MONITOR 0
|
||||||
|
#if LV_USE_PERF_MONITOR
|
||||||
|
#define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*1: Show the used memory and the memory fragmentation
|
||||||
|
* Requires LV_MEM_CUSTOM = 0*/
|
||||||
|
#define LV_USE_MEM_MONITOR 0
|
||||||
|
#if LV_USE_MEM_MONITOR
|
||||||
|
#define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*1: Draw random colored rectangles over the redrawn areas*/
|
||||||
|
#define LV_USE_REFR_DEBUG 0
|
||||||
|
|
||||||
|
/*Change the built in (v)snprintf functions*/
|
||||||
|
#define LV_SPRINTF_CUSTOM 0
|
||||||
|
#if LV_SPRINTF_CUSTOM
|
||||||
|
#define LV_SPRINTF_INCLUDE <stdio.h>
|
||||||
|
#define lv_snprintf snprintf
|
||||||
|
#define lv_vsnprintf vsnprintf
|
||||||
|
#else /*LV_SPRINTF_CUSTOM*/
|
||||||
|
#define LV_SPRINTF_USE_FLOAT 0
|
||||||
|
#endif /*LV_SPRINTF_CUSTOM*/
|
||||||
|
|
||||||
|
#define LV_USE_USER_DATA 1
|
||||||
|
|
||||||
|
/*Garbage Collector settings
|
||||||
|
*Used if lvgl is bound to higher level language and the memory is managed by that language*/
|
||||||
|
#define LV_ENABLE_GC 0
|
||||||
|
#if LV_ENABLE_GC != 0
|
||||||
|
#define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/
|
||||||
|
#endif /*LV_ENABLE_GC*/
|
||||||
|
|
||||||
|
/*=====================
|
||||||
|
* COMPILER SETTINGS
|
||||||
|
*====================*/
|
||||||
|
|
||||||
|
/*For big endian systems set to 1*/
|
||||||
|
#define LV_BIG_ENDIAN_SYSTEM 0
|
||||||
|
|
||||||
|
/*Define a custom attribute to `lv_tick_inc` function*/
|
||||||
|
#define LV_ATTRIBUTE_TICK_INC
|
||||||
|
|
||||||
|
/*Define a custom attribute to `lv_timer_handler` function*/
|
||||||
|
#define LV_ATTRIBUTE_TIMER_HANDLER
|
||||||
|
|
||||||
|
/*Define a custom attribute to `lv_disp_flush_ready` function*/
|
||||||
|
#define LV_ATTRIBUTE_FLUSH_READY
|
||||||
|
|
||||||
|
/*Required alignment size for buffers*/
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1
|
||||||
|
|
||||||
|
/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
|
||||||
|
* E.g. __attribute__((aligned(4)))*/
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
|
||||||
|
/*Attribute to mark large constant arrays for example font's bitmaps*/
|
||||||
|
#define LV_ATTRIBUTE_LARGE_CONST
|
||||||
|
|
||||||
|
/*Compiler prefix for a big array declaration in RAM*/
|
||||||
|
#define LV_ATTRIBUTE_LARGE_RAM_ARRAY
|
||||||
|
|
||||||
|
/*Place performance critical functions into a faster memory (e.g RAM)*/
|
||||||
|
#define LV_ATTRIBUTE_FAST_MEM
|
||||||
|
|
||||||
|
/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/
|
||||||
|
#define LV_ATTRIBUTE_DMA
|
||||||
|
|
||||||
|
/*Export integer constant to binding. This macro is used with constants in the form of LV_<CONST> that
|
||||||
|
*should also appear on LVGL binding API such as Micropython.*/
|
||||||
|
#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/
|
||||||
|
|
||||||
|
/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/
|
||||||
|
#define LV_USE_LARGE_COORD 0
|
||||||
|
|
||||||
|
/*==================
|
||||||
|
* FONT USAGE
|
||||||
|
*===================*/
|
||||||
|
|
||||||
|
/*Montserrat fonts with ASCII range and some symbols using bpp = 4
|
||||||
|
*https://fonts.google.com/specimen/Montserrat*/
|
||||||
|
#define LV_FONT_MONTSERRAT_8 0
|
||||||
|
#define LV_FONT_MONTSERRAT_10 0
|
||||||
|
#define LV_FONT_MONTSERRAT_12 0
|
||||||
|
#define LV_FONT_MONTSERRAT_14 1
|
||||||
|
#define LV_FONT_MONTSERRAT_16 1
|
||||||
|
#define LV_FONT_MONTSERRAT_18 1
|
||||||
|
#define LV_FONT_MONTSERRAT_20 0
|
||||||
|
#define LV_FONT_MONTSERRAT_22 0
|
||||||
|
#define LV_FONT_MONTSERRAT_24 0
|
||||||
|
#define LV_FONT_MONTSERRAT_26 1
|
||||||
|
#define LV_FONT_MONTSERRAT_28 0
|
||||||
|
#define LV_FONT_MONTSERRAT_30 1
|
||||||
|
#define LV_FONT_MONTSERRAT_32 0
|
||||||
|
#define LV_FONT_MONTSERRAT_34 0
|
||||||
|
#define LV_FONT_MONTSERRAT_36 1
|
||||||
|
#define LV_FONT_MONTSERRAT_38 0
|
||||||
|
#define LV_FONT_MONTSERRAT_40 0
|
||||||
|
#define LV_FONT_MONTSERRAT_42 0
|
||||||
|
#define LV_FONT_MONTSERRAT_44 1
|
||||||
|
#define LV_FONT_MONTSERRAT_46 0
|
||||||
|
#define LV_FONT_MONTSERRAT_48 1
|
||||||
|
|
||||||
|
/*Demonstrate special features*/
|
||||||
|
#define LV_FONT_MONTSERRAT_12_SUBPX 0
|
||||||
|
#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/
|
||||||
|
#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/
|
||||||
|
#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/
|
||||||
|
|
||||||
|
/*Pixel perfect monospace fonts*/
|
||||||
|
#define LV_FONT_UNSCII_8 0
|
||||||
|
#define LV_FONT_UNSCII_16 0
|
||||||
|
|
||||||
|
/*Optionally declare custom fonts here.
|
||||||
|
*You can use these fonts as default font too and they will be available globally.
|
||||||
|
*E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/
|
||||||
|
#define LV_FONT_CUSTOM_DECLARE
|
||||||
|
|
||||||
|
/*Always set a default font*/
|
||||||
|
#define LV_FONT_DEFAULT &lv_font_montserrat_14
|
||||||
|
|
||||||
|
/*Enable handling large font and/or fonts with a lot of characters.
|
||||||
|
*The limit depends on the font size, font face and bpp.
|
||||||
|
*Compiler error will be triggered if a font needs it.*/
|
||||||
|
#define LV_FONT_FMT_TXT_LARGE 0
|
||||||
|
|
||||||
|
/*Enables/disables support for compressed fonts.*/
|
||||||
|
#define LV_USE_FONT_COMPRESSED 0
|
||||||
|
|
||||||
|
/*Enable subpixel rendering*/
|
||||||
|
#define LV_USE_FONT_SUBPX 0
|
||||||
|
#if LV_USE_FONT_SUBPX
|
||||||
|
/*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/
|
||||||
|
#define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Enable drawing placeholders when glyph dsc is not found*/
|
||||||
|
#define LV_USE_FONT_PLACEHOLDER 1
|
||||||
|
|
||||||
|
/*=================
|
||||||
|
* TEXT SETTINGS
|
||||||
|
*=================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select a character encoding for strings.
|
||||||
|
* Your IDE or editor should have the same character encoding
|
||||||
|
* - LV_TXT_ENC_UTF8
|
||||||
|
* - LV_TXT_ENC_ASCII
|
||||||
|
*/
|
||||||
|
#define LV_TXT_ENC LV_TXT_ENC_UTF8
|
||||||
|
|
||||||
|
/*Can break (wrap) texts on these chars*/
|
||||||
|
#define LV_TXT_BREAK_CHARS " ,.;:-_"
|
||||||
|
|
||||||
|
/*If a word is at least this long, will break wherever "prettiest"
|
||||||
|
*To disable, set to a value <= 0*/
|
||||||
|
#define LV_TXT_LINE_BREAK_LONG_LEN 0
|
||||||
|
|
||||||
|
/*Minimum number of characters in a long word to put on a line before a break.
|
||||||
|
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
|
||||||
|
#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3
|
||||||
|
|
||||||
|
/*Minimum number of characters in a long word to put on a line after a break.
|
||||||
|
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
|
||||||
|
#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
|
||||||
|
|
||||||
|
/*The control character to use for signalling text recoloring.*/
|
||||||
|
#define LV_TXT_COLOR_CMD "#"
|
||||||
|
|
||||||
|
/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts.
|
||||||
|
*The direction will be processed according to the Unicode Bidirectional Algorithm:
|
||||||
|
*https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/
|
||||||
|
#define LV_USE_BIDI 0
|
||||||
|
#if LV_USE_BIDI
|
||||||
|
/*Set the default direction. Supported values:
|
||||||
|
*`LV_BASE_DIR_LTR` Left-to-Right
|
||||||
|
*`LV_BASE_DIR_RTL` Right-to-Left
|
||||||
|
*`LV_BASE_DIR_AUTO` detect texts base direction*/
|
||||||
|
#define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Enable Arabic/Persian processing
|
||||||
|
*In these languages characters should be replaced with an other form based on their position in the text*/
|
||||||
|
#define LV_USE_ARABIC_PERSIAN_CHARS 0
|
||||||
|
|
||||||
|
/*==================
|
||||||
|
* WIDGET USAGE
|
||||||
|
*================*/
|
||||||
|
|
||||||
|
/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/
|
||||||
|
|
||||||
|
#define LV_USE_ARC 1
|
||||||
|
|
||||||
|
#define LV_USE_BAR 1
|
||||||
|
|
||||||
|
#define LV_USE_BTN 1
|
||||||
|
|
||||||
|
#define LV_USE_BTNMATRIX 1
|
||||||
|
|
||||||
|
#define LV_USE_CANVAS 1
|
||||||
|
|
||||||
|
#define LV_USE_CHECKBOX 1
|
||||||
|
|
||||||
|
#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/
|
||||||
|
|
||||||
|
#define LV_USE_IMG 1 /*Requires: lv_label*/
|
||||||
|
|
||||||
|
#define LV_USE_LABEL 1
|
||||||
|
#if LV_USE_LABEL
|
||||||
|
#define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/
|
||||||
|
#define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LV_USE_LINE 1
|
||||||
|
|
||||||
|
#define LV_USE_ROLLER 1 /*Requires: lv_label*/
|
||||||
|
#if LV_USE_ROLLER
|
||||||
|
#define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LV_USE_SLIDER 1 /*Requires: lv_bar*/
|
||||||
|
|
||||||
|
#define LV_USE_SWITCH 1
|
||||||
|
|
||||||
|
#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/
|
||||||
|
#if LV_USE_TEXTAREA != 0
|
||||||
|
#define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LV_USE_TABLE 1
|
||||||
|
|
||||||
|
/*==================
|
||||||
|
* EXTRA COMPONENTS
|
||||||
|
*==================*/
|
||||||
|
|
||||||
|
/*-----------
|
||||||
|
* Widgets
|
||||||
|
*----------*/
|
||||||
|
#define LV_USE_ANIMIMG 1
|
||||||
|
|
||||||
|
#define LV_USE_CALENDAR 1
|
||||||
|
#if LV_USE_CALENDAR
|
||||||
|
#define LV_CALENDAR_WEEK_STARTS_MONDAY 0
|
||||||
|
#if LV_CALENDAR_WEEK_STARTS_MONDAY
|
||||||
|
#define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
|
||||||
|
#else
|
||||||
|
#define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
|
||||||
|
#define LV_USE_CALENDAR_HEADER_ARROW 1
|
||||||
|
#define LV_USE_CALENDAR_HEADER_DROPDOWN 1
|
||||||
|
#endif /*LV_USE_CALENDAR*/
|
||||||
|
|
||||||
|
#define LV_USE_CHART 1
|
||||||
|
|
||||||
|
#define LV_USE_COLORWHEEL 1
|
||||||
|
|
||||||
|
#define LV_USE_IMGBTN 1
|
||||||
|
|
||||||
|
#define LV_USE_KEYBOARD 1
|
||||||
|
|
||||||
|
#define LV_USE_LED 1
|
||||||
|
|
||||||
|
#define LV_USE_LIST 1
|
||||||
|
|
||||||
|
#define LV_USE_MENU 1
|
||||||
|
|
||||||
|
#define LV_USE_METER 1
|
||||||
|
|
||||||
|
#define LV_USE_MSGBOX 1
|
||||||
|
|
||||||
|
#define LV_USE_SPAN 1
|
||||||
|
#if LV_USE_SPAN
|
||||||
|
/*A line text can contain maximum num of span descriptor */
|
||||||
|
#define LV_SPAN_SNIPPET_STACK_SIZE 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LV_USE_SPINBOX 1
|
||||||
|
|
||||||
|
#define LV_USE_SPINNER 1
|
||||||
|
|
||||||
|
#define LV_USE_TABVIEW 1
|
||||||
|
|
||||||
|
#define LV_USE_TILEVIEW 1
|
||||||
|
|
||||||
|
#define LV_USE_WIN 1
|
||||||
|
|
||||||
|
/*-----------
|
||||||
|
* Themes
|
||||||
|
*----------*/
|
||||||
|
|
||||||
|
/*A simple, impressive and very complete theme*/
|
||||||
|
#define LV_USE_THEME_DEFAULT 1
|
||||||
|
#if LV_USE_THEME_DEFAULT
|
||||||
|
|
||||||
|
/*0: Light mode; 1: Dark mode*/
|
||||||
|
#define LV_THEME_DEFAULT_DARK 0
|
||||||
|
|
||||||
|
/*1: Enable grow on press*/
|
||||||
|
#define LV_THEME_DEFAULT_GROW 1
|
||||||
|
|
||||||
|
/*Default transition time in [ms]*/
|
||||||
|
#define LV_THEME_DEFAULT_TRANSITION_TIME 80
|
||||||
|
#endif /*LV_USE_THEME_DEFAULT*/
|
||||||
|
|
||||||
|
/*A very simple theme that is a good starting point for a custom theme*/
|
||||||
|
#define LV_USE_THEME_BASIC 1
|
||||||
|
|
||||||
|
/*A theme designed for monochrome displays*/
|
||||||
|
#define LV_USE_THEME_MONO 1
|
||||||
|
|
||||||
|
/*-----------
|
||||||
|
* Layouts
|
||||||
|
*----------*/
|
||||||
|
|
||||||
|
/*A layout similar to Flexbox in CSS.*/
|
||||||
|
#define LV_USE_FLEX 1
|
||||||
|
|
||||||
|
/*A layout similar to Grid in CSS.*/
|
||||||
|
#define LV_USE_GRID 1
|
||||||
|
|
||||||
|
/*---------------------
|
||||||
|
* 3rd party libraries
|
||||||
|
*--------------------*/
|
||||||
|
|
||||||
|
/*File system interfaces for common APIs */
|
||||||
|
|
||||||
|
/*API for fopen, fread, etc*/
|
||||||
|
#define LV_USE_FS_STDIO 0
|
||||||
|
#if LV_USE_FS_STDIO
|
||||||
|
#define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
|
||||||
|
#define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
|
||||||
|
#define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*API for open, read, etc*/
|
||||||
|
#define LV_USE_FS_POSIX 0
|
||||||
|
#if LV_USE_FS_POSIX
|
||||||
|
#define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
|
||||||
|
#define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
|
||||||
|
#define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*API for CreateFile, ReadFile, etc*/
|
||||||
|
#define LV_USE_FS_WIN32 0
|
||||||
|
#if LV_USE_FS_WIN32
|
||||||
|
#define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
|
||||||
|
#define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
|
||||||
|
#define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
|
||||||
|
#define LV_USE_FS_FATFS 0
|
||||||
|
#if LV_USE_FS_FATFS
|
||||||
|
#define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
|
||||||
|
#define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/
|
||||||
|
#define LV_USE_FS_LITTLEFS 0
|
||||||
|
#if LV_USE_FS_LITTLEFS
|
||||||
|
#define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
|
||||||
|
#define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*PNG decoder library*/
|
||||||
|
#define LV_USE_PNG 0
|
||||||
|
|
||||||
|
/*BMP decoder library*/
|
||||||
|
#define LV_USE_BMP 0
|
||||||
|
|
||||||
|
/* JPG + split JPG decoder library.
|
||||||
|
* Split JPG is a custom format optimized for embedded systems. */
|
||||||
|
#define LV_USE_SJPG 0
|
||||||
|
|
||||||
|
/*GIF decoder library*/
|
||||||
|
#define LV_USE_GIF 0
|
||||||
|
|
||||||
|
/*QR code library*/
|
||||||
|
#define LV_USE_QRCODE 0
|
||||||
|
|
||||||
|
/*FreeType library*/
|
||||||
|
#define LV_USE_FREETYPE 0
|
||||||
|
#if LV_USE_FREETYPE
|
||||||
|
/*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/
|
||||||
|
#define LV_FREETYPE_CACHE_SIZE (16 * 1024)
|
||||||
|
#if LV_FREETYPE_CACHE_SIZE >= 0
|
||||||
|
/* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */
|
||||||
|
/* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */
|
||||||
|
/* if font size >= 256, must be configured as image cache */
|
||||||
|
#define LV_FREETYPE_SBIT_CACHE 0
|
||||||
|
/* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
|
||||||
|
/* (0:use system defaults) */
|
||||||
|
#define LV_FREETYPE_CACHE_FT_FACES 0
|
||||||
|
#define LV_FREETYPE_CACHE_FT_SIZES 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Tiny TTF library*/
|
||||||
|
#define LV_USE_TINY_TTF 0
|
||||||
|
#if LV_USE_TINY_TTF
|
||||||
|
/*Load TTF data from files*/
|
||||||
|
#define LV_TINY_TTF_FILE_SUPPORT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Rlottie library*/
|
||||||
|
#define LV_USE_RLOTTIE 0
|
||||||
|
|
||||||
|
/*FFmpeg library for image decoding and playing videos
|
||||||
|
*Supports all major image formats so do not enable other image decoder with it*/
|
||||||
|
#define LV_USE_FFMPEG 0
|
||||||
|
#if LV_USE_FFMPEG
|
||||||
|
/*Dump input information to stderr*/
|
||||||
|
#define LV_FFMPEG_DUMP_FORMAT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-----------
|
||||||
|
* Others
|
||||||
|
*----------*/
|
||||||
|
|
||||||
|
/*1: Enable API to take snapshot for object*/
|
||||||
|
#define LV_USE_SNAPSHOT 0
|
||||||
|
|
||||||
|
/*1: Enable Monkey test*/
|
||||||
|
#define LV_USE_MONKEY 0
|
||||||
|
|
||||||
|
/*1: Enable grid navigation*/
|
||||||
|
#define LV_USE_GRIDNAV 0
|
||||||
|
|
||||||
|
/*1: Enable lv_obj fragment*/
|
||||||
|
#define LV_USE_FRAGMENT 0
|
||||||
|
|
||||||
|
/*1: Support using images as font in label or span widgets */
|
||||||
|
#define LV_USE_IMGFONT 0
|
||||||
|
|
||||||
|
/*1: Enable a published subscriber based messaging system */
|
||||||
|
#define LV_USE_MSG 0
|
||||||
|
|
||||||
|
/*1: Enable Pinyin input method*/
|
||||||
|
/*Requires: lv_keyboard*/
|
||||||
|
#define LV_USE_IME_PINYIN 0
|
||||||
|
#if LV_USE_IME_PINYIN
|
||||||
|
/*1: Use default thesaurus*/
|
||||||
|
/*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
|
||||||
|
#define LV_IME_PINYIN_USE_DEFAULT_DICT 1
|
||||||
|
/*Set the maximum number of candidate panels that can be displayed*/
|
||||||
|
/*This needs to be adjusted according to the size of the screen*/
|
||||||
|
#define LV_IME_PINYIN_CAND_TEXT_NUM 6
|
||||||
|
|
||||||
|
/*Use 9 key input(k9)*/
|
||||||
|
#define LV_IME_PINYIN_USE_K9_MODE 1
|
||||||
|
#if LV_IME_PINYIN_USE_K9_MODE == 1
|
||||||
|
#define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
|
||||||
|
#endif // LV_IME_PINYIN_USE_K9_MODE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*==================
|
||||||
|
* EXAMPLES
|
||||||
|
*==================*/
|
||||||
|
|
||||||
|
/*Enable the examples to be built with the library*/
|
||||||
|
#define LV_BUILD_EXAMPLES 1
|
||||||
|
|
||||||
|
/*===================
|
||||||
|
* DEMO USAGE
|
||||||
|
====================*/
|
||||||
|
|
||||||
|
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
|
||||||
|
#define LV_USE_DEMO_WIDGETS 0
|
||||||
|
#if LV_USE_DEMO_WIDGETS
|
||||||
|
#define LV_DEMO_WIDGETS_SLIDESHOW 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Demonstrate the usage of encoder and keyboard*/
|
||||||
|
#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
|
||||||
|
|
||||||
|
/*Benchmark your system*/
|
||||||
|
#define LV_USE_DEMO_BENCHMARK 0
|
||||||
|
#if LV_USE_DEMO_BENCHMARK
|
||||||
|
/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/
|
||||||
|
#define LV_DEMO_BENCHMARK_RGB565A8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Stress test for LVGL*/
|
||||||
|
#define LV_USE_DEMO_STRESS 0
|
||||||
|
|
||||||
|
/*Music player demo*/
|
||||||
|
#define LV_USE_DEMO_MUSIC 0
|
||||||
|
#if LV_USE_DEMO_MUSIC
|
||||||
|
#define LV_DEMO_MUSIC_SQUARE 0
|
||||||
|
#define LV_DEMO_MUSIC_LANDSCAPE 0
|
||||||
|
#define LV_DEMO_MUSIC_ROUND 0
|
||||||
|
#define LV_DEMO_MUSIC_LARGE 0
|
||||||
|
#define LV_DEMO_MUSIC_AUTO_PLAY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*--END OF LV_CONF_H--*/
|
||||||
|
|
||||||
|
#endif /*LV_CONF_H*/
|
||||||
|
|
||||||
|
#endif /*End of "Content enable"*/
|
||||||
161
Pantalla/src/ajustes.cpp
Normal file
161
Pantalla/src/ajustes.cpp
Normal file
|
|
@ -0,0 +1,161 @@
|
||||||
|
#include "../include/ajustes.hpp"
|
||||||
|
|
||||||
|
data *puntero_datos;
|
||||||
|
|
||||||
|
void set_data(data *datos){
|
||||||
|
puntero_datos=datos;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_rpm(){
|
||||||
|
return puntero_datos->get_rpm();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_desplazamiento(){
|
||||||
|
return puntero_datos->get_desplazamiento();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get_modo_oscuro(){
|
||||||
|
return puntero_datos->get_modo_oscuro();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_pantalla(){
|
||||||
|
return puntero_datos->get_pantalla();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_rpm_display(){
|
||||||
|
return puntero_datos->get_rpm_display();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_diff_rpm(){
|
||||||
|
return puntero_datos->get_diff_rpm();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_recepcion_datos(){
|
||||||
|
return puntero_datos->get_recepcion_datos();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_vbatt_too_high(){
|
||||||
|
return puntero_datos->get_vbatt_too_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_vbatt_high(){
|
||||||
|
return puntero_datos->get_vbatt_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_vbatt_low(){
|
||||||
|
return puntero_datos->get_vbatt_low();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_water_hot(){
|
||||||
|
return puntero_datos->get_water_hot();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_water_mild(){
|
||||||
|
return puntero_datos->get_water_mild();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_water_cold(){
|
||||||
|
return puntero_datos->get_water_cold();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_oil_hot(){
|
||||||
|
return puntero_datos->get_oil_hot();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_oil_mild(){
|
||||||
|
return puntero_datos->get_oil_mild();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_oil_cold(){
|
||||||
|
return puntero_datos->get_oil_cold();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_oil_pressure_too_high(){
|
||||||
|
return puntero_datos->get_oil_pressure_too_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_oil_pressure_high(){
|
||||||
|
return puntero_datos->get_oil_pressure_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_oil_pressure_low(){
|
||||||
|
return puntero_datos->get_oil_pressure_low();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_fuel_pressure_too_high(){
|
||||||
|
return puntero_datos->get_fuel_pressure_too_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_fuel_pressure_high(){
|
||||||
|
return puntero_datos->get_fuel_pressure_high();
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_fuel_pressure_low(){
|
||||||
|
return puntero_datos->get_fuel_pressure_low();
|
||||||
|
}
|
||||||
|
|
||||||
|
void save(){
|
||||||
|
puntero_datos->save_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void load(){
|
||||||
|
puntero_datos->load_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void update(
|
||||||
|
int rpm_max,
|
||||||
|
int desplazamiento,
|
||||||
|
bool modo_oscuro,
|
||||||
|
int pantalla,
|
||||||
|
int rpm_display,
|
||||||
|
int diff_rpm,
|
||||||
|
int recepcion_datos,
|
||||||
|
float vbatt_too_high,
|
||||||
|
float vbatt_high,
|
||||||
|
float vbatt_low,
|
||||||
|
int water_hot,
|
||||||
|
int water_mild,
|
||||||
|
int water_cold,
|
||||||
|
int oil_hot,
|
||||||
|
int oil_mild,
|
||||||
|
int oil_cold,
|
||||||
|
float oil_pressure_too_high,
|
||||||
|
float oil_pressure_high,
|
||||||
|
float oil_pressure_low,
|
||||||
|
float fuel_pressure_too_high,
|
||||||
|
float fuel_pressure_high,
|
||||||
|
float fuel_pressure_low
|
||||||
|
){
|
||||||
|
puntero_datos->update_data(
|
||||||
|
rpm_max,
|
||||||
|
desplazamiento,
|
||||||
|
modo_oscuro,
|
||||||
|
pantalla,
|
||||||
|
rpm_display,
|
||||||
|
diff_rpm,
|
||||||
|
recepcion_datos,
|
||||||
|
vbatt_too_high,
|
||||||
|
vbatt_high,
|
||||||
|
vbatt_low,
|
||||||
|
water_hot,
|
||||||
|
water_mild,
|
||||||
|
water_cold,
|
||||||
|
oil_hot,
|
||||||
|
oil_mild,
|
||||||
|
oil_cold,
|
||||||
|
oil_pressure_too_high,
|
||||||
|
oil_pressure_high,
|
||||||
|
oil_pressure_low,
|
||||||
|
fuel_pressure_too_high,
|
||||||
|
fuel_pressure_high,
|
||||||
|
fuel_pressure_low
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
int modify_value(int value, int modifier){
|
||||||
|
return value+modifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
float modify_value(float value, float modifier){
|
||||||
|
return value+modifier;
|
||||||
|
}
|
||||||
560
Pantalla/src/can.cpp
Normal file
560
Pantalla/src/can.cpp
Normal file
|
|
@ -0,0 +1,560 @@
|
||||||
|
/**
|
||||||
|
* @file can.cpp
|
||||||
|
* @author Raúl Arcos Herrera
|
||||||
|
* @brief This file contains the implementation of the CAN Controller class for Link G4+ ECU.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/can.hpp"
|
||||||
|
#include "../include/data_processor.hpp"
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
static bool driver_installed = false;
|
||||||
|
|
||||||
|
static const uint32_t UI_CAN_MS = 40;
|
||||||
|
|
||||||
|
static bool every_ms(uint32_t &last_time, uint32_t interval)
|
||||||
|
{
|
||||||
|
uint32_t now = millis();
|
||||||
|
|
||||||
|
if(last_time == 0 || now - last_time >= interval){
|
||||||
|
last_time = now;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CAN::start() {
|
||||||
|
Serial.println("Starting CAN Controller...");
|
||||||
|
twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);
|
||||||
|
g_config.rx_queue_len = 64;
|
||||||
|
g_config.tx_queue_len = 16;
|
||||||
|
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
|
||||||
|
twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
|
||||||
|
|
||||||
|
esp_err_t install_status = twai_driver_install(&g_config, &t_config, &f_config);
|
||||||
|
if (install_status != ESP_OK) {
|
||||||
|
Serial.println("Failed to install TWAI driver");
|
||||||
|
driver_installed = false;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Serial.println("TWAI driver installed");
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t start_status = twai_start();
|
||||||
|
if (start_status != ESP_OK) {
|
||||||
|
Serial.println("Failed to start TWAI driver");
|
||||||
|
driver_installed = false;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Serial.println("TWAI driver started");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t alerts_to_enable = TWAI_ALERT_RX_DATA | TWAI_ALERT_ERR_PASS | TWAI_ALERT_BUS_ERROR | TWAI_ALERT_RX_QUEUE_FULL;
|
||||||
|
if (twai_reconfigure_alerts(alerts_to_enable, NULL) == ESP_OK) {
|
||||||
|
Serial.println("CAN Alerts reconfigured");
|
||||||
|
} else {
|
||||||
|
Serial.println("Failed to reconfigure alerts");
|
||||||
|
driver_installed = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TWAI driver is now successfully installed and started
|
||||||
|
driver_installed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAN::~CAN() {
|
||||||
|
stop_iracing_task();
|
||||||
|
stop_listening_task();
|
||||||
|
if (driver_installed) {
|
||||||
|
twai_stop();
|
||||||
|
twai_driver_uninstall();
|
||||||
|
driver_installed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::start_listening_task() {
|
||||||
|
if (_listen_task_handle == NULL) {
|
||||||
|
_should_stop_listening = false;
|
||||||
|
|
||||||
|
BaseType_t result = xTaskCreate(
|
||||||
|
listenTask, // Task function
|
||||||
|
"CAN_Listen_Task", // Task name
|
||||||
|
4096, // Stack size (words)
|
||||||
|
this, // Task parameter (this CAN instance)
|
||||||
|
1, // Priority (lowered from 5 to 1)
|
||||||
|
&_listen_task_handle // Task handle
|
||||||
|
);
|
||||||
|
|
||||||
|
// BaseType_t result = xTaskCreatePinnedToCore(
|
||||||
|
// listenTask, // Task function
|
||||||
|
// "CAN_Listen_Task", // Task name
|
||||||
|
// 4096, // Stack size (words)
|
||||||
|
// this, // Task parameter (this CAN instance)
|
||||||
|
// 1, // Priority
|
||||||
|
// &_listen_task_handle, // Task handle
|
||||||
|
// 0 // Core 0 (main loop typically runs on Core 1)
|
||||||
|
// );
|
||||||
|
|
||||||
|
if (result == pdPASS) {
|
||||||
|
Serial.println("CAN listening task created successfully");
|
||||||
|
} else {
|
||||||
|
Serial.println("Failed to create CAN listening task");
|
||||||
|
_listen_task_handle = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Serial.println("CAN listening task already running");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::stop_listening_task() {
|
||||||
|
if (_listen_task_handle != NULL) {
|
||||||
|
_should_stop_listening = true;
|
||||||
|
|
||||||
|
// Wait for task to finish (max 1 second)
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
if (_listen_task_handle == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force delete if still running
|
||||||
|
if (_listen_task_handle != NULL) {
|
||||||
|
vTaskDelete(_listen_task_handle);
|
||||||
|
_listen_task_handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("CAN listening task stopped");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::start_iracing_task() {
|
||||||
|
if (_iracing_task_handle == NULL) {
|
||||||
|
_should_stop_iracing = false;
|
||||||
|
_serial_protocol = 0;
|
||||||
|
_serial_index = 0;
|
||||||
|
|
||||||
|
BaseType_t result = xTaskCreate(iracingTask, "iRacing_Task", 4096, this, 1, &_iracing_task_handle);
|
||||||
|
|
||||||
|
if (result == pdPASS) {
|
||||||
|
Serial.println("iRacing serial task created successfully");
|
||||||
|
} else {
|
||||||
|
Serial.println("Failed to create iRacing serial task");
|
||||||
|
_iracing_task_handle = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Serial.println("iRacing serial task already running");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::stop_iracing_task() {
|
||||||
|
if (_iracing_task_handle != NULL) {
|
||||||
|
_should_stop_iracing = true;
|
||||||
|
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
if (_iracing_task_handle == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_iracing_task_handle != NULL) {
|
||||||
|
vTaskDelete(_iracing_task_handle);
|
||||||
|
_iracing_task_handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("iRacing serial task stopped");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::send_frame(twai_message_t message) {
|
||||||
|
while (xSemaphoreTake(_mutex, portMAX_DELAY) != pdTRUE) {
|
||||||
|
Serial.println("Retrying to take mutex in send_frame");
|
||||||
|
}
|
||||||
|
twai_transmit(&message, pdMS_TO_TICKS(TRANSMIT_RATE_MS));
|
||||||
|
xSemaphoreGive(_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
twai_message_t CAN::createBoolMessage(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7) {
|
||||||
|
twai_message_t message;
|
||||||
|
memset(&message, 0, sizeof(message));
|
||||||
|
message.identifier = 0x001;
|
||||||
|
message.data[0] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) |
|
||||||
|
(b3 << 3) | (b2 << 2) | (b1 << 1) | b0;
|
||||||
|
message.data_length_code = 8;
|
||||||
|
message.flags = TWAI_MSG_FLAG_NONE;
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::listenTask(void *arg){
|
||||||
|
CAN* instance=static_cast<CAN*>(arg);
|
||||||
|
|
||||||
|
instance->listen_id();
|
||||||
|
|
||||||
|
instance->_listen_task_handle=NULL;
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::iracingTask(void *arg) {
|
||||||
|
CAN* instance = static_cast<CAN*>(arg);
|
||||||
|
|
||||||
|
while (!instance->_should_stop_iracing) {
|
||||||
|
instance->data_update();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
instance->_iracing_task_handle = NULL;
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::listen() {
|
||||||
|
Serial.println("CAN listening task started");
|
||||||
|
|
||||||
|
// Continuous loop for the thread
|
||||||
|
while (!_should_stop_listening) {
|
||||||
|
if (!driver_installed) {
|
||||||
|
// Driver not installed
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
continue;
|
||||||
|
Serial.println("No driver");
|
||||||
|
}
|
||||||
|
|
||||||
|
mensaje_botonera(1, 1, 1, 1, 1, 1);
|
||||||
|
Serial.println("Enviado boton");
|
||||||
|
|
||||||
|
// Check if alert happened
|
||||||
|
uint32_t alerts_triggered;
|
||||||
|
twai_read_alerts(&alerts_triggered, pdMS_TO_TICKS(1000)); // Reduced timeout for more responsiveness
|
||||||
|
twai_status_info_t twaistatus;
|
||||||
|
twai_get_status_info(&twaistatus);
|
||||||
|
|
||||||
|
//Serial.print(alerts_triggered);
|
||||||
|
//Serial.println();
|
||||||
|
|
||||||
|
// Handle alerts
|
||||||
|
if (alerts_triggered & TWAI_ALERT_ERR_PASS) {
|
||||||
|
Serial.println("Alert: TWAI controller has become error passive.");
|
||||||
|
}
|
||||||
|
if (alerts_triggered & TWAI_ALERT_BUS_ERROR) {
|
||||||
|
Serial.println("Alert: A (Bit, Stuff, CRC, Form, ACK) error has occurred on the bus.");
|
||||||
|
Serial.printf("Bus error count: %lu\n", twaistatus.bus_error_count);
|
||||||
|
}
|
||||||
|
if (alerts_triggered & TWAI_ALERT_RX_QUEUE_FULL) {
|
||||||
|
Serial.println("Alert: The RX queue is full causing a received frame to be lost.");
|
||||||
|
Serial.printf("RX buffered: %lu\t", twaistatus.msgs_to_rx);
|
||||||
|
Serial.printf("RX missed: %lu\t", twaistatus.rx_missed_count);
|
||||||
|
Serial.printf("RX overrun %lu\n", twaistatus.rx_overrun_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alerts_triggered & TWAI_ALERT_RX_DATA) {
|
||||||
|
//Serial.println("Alerta detectada");
|
||||||
|
twai_message_t message;
|
||||||
|
int message_count = 0;
|
||||||
|
while (twai_receive(&message, 0) == ESP_OK && !_should_stop_listening) {
|
||||||
|
bool all_zeros = true;
|
||||||
|
for (int i = 0; i < message.data_length_code; i++) {
|
||||||
|
if (message.data[i] != 0) {
|
||||||
|
all_zeros = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (all_zeros) {
|
||||||
|
Serial.println("Ignoring message with all zero data");
|
||||||
|
taskYIELD();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (message.extd) {
|
||||||
|
Serial.println("Extended Format");
|
||||||
|
} else {
|
||||||
|
Serial.println("Standard Format");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//Serial.printf("ID: %lx\nByte:", message.identifier);
|
||||||
|
if (!(message.rtr)) {
|
||||||
|
for (int i = 0; i < message.data_length_code; i++) {
|
||||||
|
Serial.printf(" %d = %02x,", i, message.data[i]);
|
||||||
|
}
|
||||||
|
Serial.println("");
|
||||||
|
|
||||||
|
// Send to data processor based on first byte (maintaining original logic)
|
||||||
|
switch (message.data[0]) {
|
||||||
|
case 0:
|
||||||
|
_data_processor->send_serial_frame_0(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
_data_processor->send_serial_frame_1(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
_data_processor->send_serial_frame_2(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
_data_processor->send_serial_frame_3(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
_data_processor->send_serial_frame_volante(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taskYIELD();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
taskYIELD();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("CAN listening task ending");
|
||||||
|
_listen_task_handle = NULL;
|
||||||
|
vTaskDelete(NULL); // Delete this task
|
||||||
|
}
|
||||||
|
|
||||||
|
twai_message_t CAN::mensaje_botonera(uint8_t B1, uint8_t B2, uint8_t B3, uint8_t B4, uint8_t leval, uint8_t levar) {
|
||||||
|
twai_message_t message;
|
||||||
|
memset(&message, 0, sizeof(message));
|
||||||
|
message.identifier = 0x40;
|
||||||
|
message.data[0]=ID_BOTONES;
|
||||||
|
message.data[1]=B1; // Neutra
|
||||||
|
message.data[2]=B2; // Cambio de pantalla
|
||||||
|
message.data[3]=B3; // Arrancado
|
||||||
|
message.data[4]=B4; // Launch
|
||||||
|
message.data[5]=leval; // Leva izquierda
|
||||||
|
message.data[6]=levar; // Leva derecha
|
||||||
|
message.data[7]=1; // Para que el can lo escuche ya que si todos son 0, ignora el mensaje
|
||||||
|
message.data_length_code = 8;
|
||||||
|
message.flags = TWAI_MSG_FLAG_SELF;
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::listen_id() {
|
||||||
|
Serial.println("CAN listening task started");
|
||||||
|
|
||||||
|
static uint32_t last_can_update=0;
|
||||||
|
|
||||||
|
// Continuous loop for the thread
|
||||||
|
while (!_should_stop_listening) {
|
||||||
|
|
||||||
|
if (!driver_installed) {
|
||||||
|
// Driver not installed
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
continue;
|
||||||
|
Serial.println("No driver");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!every_ms(last_can_update, UI_CAN_MS)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if alert happened
|
||||||
|
uint32_t alerts_triggered;
|
||||||
|
twai_read_alerts(&alerts_triggered, 0); // Reduced timeout for more responsiveness
|
||||||
|
twai_status_info_t twaistatus;
|
||||||
|
twai_get_status_info(&twaistatus);
|
||||||
|
|
||||||
|
//Serial.print(alerts_triggered);
|
||||||
|
//Serial.println();
|
||||||
|
|
||||||
|
// Handle alerts
|
||||||
|
if (alerts_triggered & TWAI_ALERT_ERR_PASS) {
|
||||||
|
Serial.println("Alert: TWAI controller has become error passive.");
|
||||||
|
}
|
||||||
|
if (alerts_triggered & TWAI_ALERT_BUS_ERROR) {
|
||||||
|
Serial.println("Alert: A (Bit, Stuff, CRC, Form, ACK) error has occurred on the bus.");
|
||||||
|
Serial.printf("Bus error count: %lu\n", twaistatus.bus_error_count);
|
||||||
|
}
|
||||||
|
if (alerts_triggered & TWAI_ALERT_RX_QUEUE_FULL) {
|
||||||
|
Serial.println("Alert: The RX queue is full causing a received frame to be lost.");
|
||||||
|
Serial.printf("RX buffered: %lu\t", twaistatus.msgs_to_rx);
|
||||||
|
Serial.printf("RX missed: %lu\t", twaistatus.rx_missed_count);
|
||||||
|
Serial.printf("RX overrun %lu\n", twaistatus.rx_overrun_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alerts_triggered & TWAI_ALERT_RX_DATA) {
|
||||||
|
//Serial.println("Alerta detectada");
|
||||||
|
twai_message_t message;
|
||||||
|
int message_count = 0;
|
||||||
|
while (twai_receive(&message, 0) == ESP_OK && !_should_stop_listening) {
|
||||||
|
//bool all_zeros = true;
|
||||||
|
/*
|
||||||
|
for (int i = 1; i < message.data_length_code; i++){
|
||||||
|
|
||||||
|
if (message.data[i] != 0) {
|
||||||
|
all_zeros = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message.data[0]==0){
|
||||||
|
float vbatt_prueba = ((message.data[6] * 256.0) + (float)message.data[5])/100.0;
|
||||||
|
if(vbatt_prueba<=2){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (all_zeros) {
|
||||||
|
//Serial.println("Ignoring message with all zero data");
|
||||||
|
taskYIELD();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if (message.extd) {
|
||||||
|
Serial.println("Extended Format");
|
||||||
|
} else {
|
||||||
|
Serial.println("Standard Format");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//Serial.printf("ID: %lx\nByte:", message.identifier);
|
||||||
|
if (!(message.rtr)) {
|
||||||
|
/*
|
||||||
|
for (int i = 0; i < message.data_length_code; i++) {
|
||||||
|
Serial.printf(" %d = %02x,", i, message.data[i]);
|
||||||
|
}
|
||||||
|
Serial.println("");
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Send to data processor based on first byte (maintaining original logic)
|
||||||
|
switch (message.data[0]) {
|
||||||
|
case 0:
|
||||||
|
_data_processor->send_serial_frame_0(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
_data_processor->send_serial_frame_1(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
_data_processor->send_serial_frame_2(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
_data_processor->send_serial_frame_3(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
_data_processor->send_serial_frame_volante(message.data[1], message.data[2], message.data[3], message.data[4], message.data[5], message.data[6], message.data[7]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taskYIELD();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
taskYIELD();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("CAN listening task ending");
|
||||||
|
_listen_task_handle = NULL;
|
||||||
|
vTaskDelete(NULL); // Delete this task
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAN::clear_rx_queue() {
|
||||||
|
esp_err_t result = twai_clear_receive_queue();
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (result == ESP_OK) {
|
||||||
|
Serial.println("CAN RX queue cleared");
|
||||||
|
} else {
|
||||||
|
Serial.printf("Error clearing CAN RX queue: %d\n", result);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CAN::data_update() {
|
||||||
|
while(Serial.available()>0){
|
||||||
|
uint8_t b=(uint8_t)Serial.read();
|
||||||
|
|
||||||
|
if(_serial_protocol==0){
|
||||||
|
if(b==0xAD){
|
||||||
|
_serial_buffer[0]=b;
|
||||||
|
_serial_protocol=1;
|
||||||
|
_serial_index=1;
|
||||||
|
} else if(b==0xAA){
|
||||||
|
_serial_protocol=3;
|
||||||
|
_serial_index=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_serial_protocol==1){
|
||||||
|
if(b==0x02){
|
||||||
|
_serial_buffer[1]=b;
|
||||||
|
_serial_protocol=2;
|
||||||
|
_serial_index=2;
|
||||||
|
} else if(b==0xAD){
|
||||||
|
_serial_buffer[0]=b;
|
||||||
|
_serial_index=1;
|
||||||
|
} else if(b==0xAA){
|
||||||
|
_serial_protocol=3;
|
||||||
|
_serial_index=0;
|
||||||
|
} else {
|
||||||
|
_serial_protocol=0;
|
||||||
|
_serial_index=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_serial_protocol==2){
|
||||||
|
if(_serial_index<sizeof(_serial_buffer)){
|
||||||
|
_serial_buffer[_serial_index++]=b;
|
||||||
|
} else {
|
||||||
|
_serial_protocol=0;
|
||||||
|
_serial_index=0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_serial_index==15 && _serial_buffer[14]==0x0A){
|
||||||
|
_data_processor->send_serial_frame_0(_serial_buffer[3], _serial_buffer[2], _serial_buffer[5], _serial_buffer[4], _serial_buffer[7], _serial_buffer[6], _serial_buffer[8]);
|
||||||
|
_data_processor->send_serial_frame_1(_serial_buffer[11], _serial_buffer[10], 0, 0, _serial_buffer[13], _serial_buffer[12], _serial_buffer[9]);
|
||||||
|
_data_processor->send_serial_frame_2(0, 0, 0, 0, 0, 0, _serial_buffer[9]);
|
||||||
|
|
||||||
|
_serial_protocol=0;
|
||||||
|
_serial_index=0;
|
||||||
|
} else if(_serial_index==21){
|
||||||
|
if(_serial_buffer[20]==0x0A){
|
||||||
|
_data_processor->send_serial_frame_0(_serial_buffer[3], _serial_buffer[2], _serial_buffer[5], _serial_buffer[4], _serial_buffer[7], _serial_buffer[6], _serial_buffer[8]);
|
||||||
|
_data_processor->send_serial_frame_1(_serial_buffer[11], _serial_buffer[10], _serial_buffer[15], _serial_buffer[14], _serial_buffer[13], _serial_buffer[12], _serial_buffer[9]);
|
||||||
|
_data_processor->send_serial_frame_2(_serial_buffer[16], _serial_buffer[17], 0, 0, _serial_buffer[19], _serial_buffer[18], _serial_buffer[9]);
|
||||||
|
}
|
||||||
|
|
||||||
|
_serial_protocol=0;
|
||||||
|
_serial_index=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_serial_protocol==3){
|
||||||
|
if(_serial_index<13){
|
||||||
|
_serial_buffer[_serial_index++]=b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_serial_index==13){
|
||||||
|
uint16_t oil_temperature_raw=(uint16_t)_serial_buffer[5]*100U;
|
||||||
|
|
||||||
|
_data_processor->send_serial_frame_0(_serial_buffer[0], _serial_buffer[1], 0, 0, _serial_buffer[10], _serial_buffer[11], _serial_buffer[12]);
|
||||||
|
_data_processor->send_serial_frame_1(0, 0, 0, 0, _serial_buffer[8], _serial_buffer[9], _serial_buffer[4]);
|
||||||
|
_data_processor->send_serial_frame_2(0, 0, 0, 0, 0, 0, _serial_buffer[4]);
|
||||||
|
_data_processor->send_serial_frame_3((oil_temperature_raw>>8)&0xFF, oil_temperature_raw&0xFF, _serial_buffer[6], _serial_buffer[7], 0, 0, 0);
|
||||||
|
|
||||||
|
_serial_protocol=0;
|
||||||
|
_serial_index=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
563
Pantalla/src/crowpanel_controller.cpp
Normal file
563
Pantalla/src/crowpanel_controller.cpp
Normal file
|
|
@ -0,0 +1,563 @@
|
||||||
|
#include "../include/crowpanel_controller.hpp"
|
||||||
|
#include "../include/ajustes.hpp"
|
||||||
|
#include <PCA9557.h>
|
||||||
|
|
||||||
|
uint32_t CrowPanelController::screenWidth;
|
||||||
|
uint32_t CrowPanelController::screenHeight;
|
||||||
|
lv_disp_draw_buf_t CrowPanelController::draw_buf;
|
||||||
|
lv_color_t CrowPanelController::disp_draw_buf[800 * 480 / 10];
|
||||||
|
lv_disp_drv_t CrowPanelController::disp_drv;
|
||||||
|
lv_indev_drv_t CrowPanelController::indev_drv;
|
||||||
|
|
||||||
|
SemaphoreHandle_t lvgl_mutex;
|
||||||
|
PCA9557 Out;
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
static const int RPM_SCALE_START_X = -385;
|
||||||
|
static const int RPM_SCALE_BREAK_RPM = 6000;
|
||||||
|
static const int RPM_SCALE_BREAK_X = -198;
|
||||||
|
static const int RPM_SCALE_END_X_BASE = 365;
|
||||||
|
|
||||||
|
static const int RPM_MAJOR_Y = -190;
|
||||||
|
static const int RPM_MAJOR_H = 22;
|
||||||
|
|
||||||
|
static const int RPM_MID_Y = -186;
|
||||||
|
static const int RPM_MID_H = 12;
|
||||||
|
|
||||||
|
static const int RPM_LABEL_Y = -218;
|
||||||
|
|
||||||
|
static const int RPM_MAX_OBJECTS = 16;
|
||||||
|
|
||||||
|
static lv_obj_t *rpm_dynamic_major[RPM_MAX_OBJECTS] = {nullptr};
|
||||||
|
static lv_obj_t *rpm_dynamic_mid[RPM_MAX_OBJECTS] = {nullptr};
|
||||||
|
static lv_obj_t *rpm_dynamic_label[RPM_MAX_OBJECTS] = {nullptr};
|
||||||
|
|
||||||
|
static bool rpm_original_scale_hidden = false;
|
||||||
|
|
||||||
|
static int rpm_scale_x_from_rpm(int rpm_value, int rpm_max, int desplazamiento)
|
||||||
|
{
|
||||||
|
if(rpm_max < 1000){
|
||||||
|
rpm_max = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_value < 0){
|
||||||
|
rpm_value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_value > rpm_max){
|
||||||
|
rpm_value = rpm_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
int end_x = RPM_SCALE_END_X_BASE + desplazamiento;
|
||||||
|
|
||||||
|
if(end_x > 385){
|
||||||
|
end_x = 385;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(end_x < RPM_SCALE_BREAK_X + 20){
|
||||||
|
end_x = RPM_SCALE_BREAK_X + 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(CrowPanelController::set_lineal()==2 || CrowPanelController::set_lineal()==3 || rpm_max <= RPM_SCALE_BREAK_RPM){
|
||||||
|
return RPM_SCALE_START_X + ((rpm_value * (end_x - RPM_SCALE_START_X)) / rpm_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_value <= RPM_SCALE_BREAK_RPM){
|
||||||
|
return RPM_SCALE_START_X + ((rpm_value * (RPM_SCALE_BREAK_X - RPM_SCALE_START_X)) / RPM_SCALE_BREAK_RPM);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RPM_SCALE_BREAK_X + (((rpm_value - RPM_SCALE_BREAK_RPM) * (end_x - RPM_SCALE_BREAK_X)) / (rpm_max - RPM_SCALE_BREAK_RPM));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hide_original_rpm_scale()
|
||||||
|
{
|
||||||
|
if(rpm_original_scale_hidden){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_t *original_objs[] = {
|
||||||
|
ui_rpm0, ui_rpm1, ui_rpm2, ui_rpm3, ui_rpm4, ui_rpm5, ui_rpm6,
|
||||||
|
ui_rpm7, ui_rpm8, ui_rpm9, ui_rpm10, ui_rpm11, ui_rpm12, ui_rpm13,
|
||||||
|
|
||||||
|
ui_rpmt0, ui_rpmt1, ui_rpmt2, ui_rpmt3, ui_rpmt4, ui_rpmt5, ui_rpmt6,
|
||||||
|
ui_rpmt7, ui_rpmt8, ui_rpmt9, ui_rpmt10, ui_rpmt11, ui_rpmt12, ui_rpmt16,
|
||||||
|
|
||||||
|
ui_rpmbaja1, ui_rpmbaja2, ui_rpmbaja3, ui_rpmbaja4,
|
||||||
|
ui_rpmbaja5, ui_rpmbaja6, ui_rpmbaja7
|
||||||
|
};
|
||||||
|
|
||||||
|
int total = sizeof(original_objs) / sizeof(original_objs[0]);
|
||||||
|
|
||||||
|
for(int i=0; i<total; i++){
|
||||||
|
if(original_objs[i] != nullptr){
|
||||||
|
lv_obj_add_flag(original_objs[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rpm_original_scale_hidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t rpm_scale_normal_color()
|
||||||
|
{
|
||||||
|
return (ui_theme_idx == 1) ? CrowPanelController::COLOR_BLANCO_NUEVO : CrowPanelController::COLOR_NEGRO_NUEVO;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t rpm_scale_red_color()
|
||||||
|
{
|
||||||
|
return CrowPanelController::COLOR_ROJO_BARRA;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_rpm_mark_color(lv_obj_t *obj, bool red)
|
||||||
|
{
|
||||||
|
if(obj == nullptr){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t color = red ? rpm_scale_red_color() : rpm_scale_normal_color();
|
||||||
|
|
||||||
|
lv_obj_set_style_bg_opa(obj, LV_OPA_TRANSP, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_border_width(obj, 3, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_border_color(obj, lv_color_hex(color), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_border_opa(obj, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_rpm_label_color(lv_obj_t *obj, bool red)
|
||||||
|
{
|
||||||
|
if(obj == nullptr){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t color = red ? rpm_scale_red_color() : rpm_scale_normal_color();
|
||||||
|
|
||||||
|
lv_obj_set_style_text_color(obj, lv_color_hex(color), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_text_opa(obj, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CrowPanelController::CrowPanelController()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::begin()
|
||||||
|
{
|
||||||
|
if (initialized) return;
|
||||||
|
|
||||||
|
lvgl_mutex = xSemaphoreCreateRecursiveMutex();
|
||||||
|
if (lvgl_mutex == NULL) {
|
||||||
|
Serial.println("ERROR: lvgl_mutex no creado");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
|
||||||
|
Serial.println("Init CrowPanel...");
|
||||||
|
|
||||||
|
pinMode(17, OUTPUT);
|
||||||
|
digitalWrite(17, LOW);
|
||||||
|
pinMode(18, OUTPUT);
|
||||||
|
digitalWrite(18, LOW);
|
||||||
|
pinMode(42, OUTPUT);
|
||||||
|
digitalWrite(42, LOW);
|
||||||
|
|
||||||
|
Wire.begin(19, 20);
|
||||||
|
Out.reset();
|
||||||
|
Out.setMode(IO_OUTPUT);
|
||||||
|
Out.setState(IO0, IO_LOW);
|
||||||
|
Out.setState(IO1, IO_LOW);
|
||||||
|
delay(20);
|
||||||
|
Out.setState(IO0, IO_HIGH);
|
||||||
|
delay(100);
|
||||||
|
Out.setMode(IO1, IO_INPUT);
|
||||||
|
|
||||||
|
lcd.begin();
|
||||||
|
lcd.setRotation(2);
|
||||||
|
lcd.fillScreen(TFT_BLACK);
|
||||||
|
screenWidth = lcd.width();
|
||||||
|
screenHeight = lcd.height();
|
||||||
|
Serial.printf("LCD %lux%lu\n", (unsigned long)screenWidth, (unsigned long)screenHeight);
|
||||||
|
|
||||||
|
lv_init();
|
||||||
|
delay(100);
|
||||||
|
|
||||||
|
lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, screenWidth * screenHeight / 10);
|
||||||
|
|
||||||
|
lv_disp_drv_init(&disp_drv);
|
||||||
|
disp_drv.hor_res = screenWidth;
|
||||||
|
disp_drv.ver_res = screenHeight;
|
||||||
|
disp_drv.flush_cb = my_disp_flush;
|
||||||
|
disp_drv.full_refresh = 1;
|
||||||
|
disp_drv.draw_buf = &draw_buf;
|
||||||
|
disp_drv.user_data = this;
|
||||||
|
lv_disp_drv_register(&disp_drv);
|
||||||
|
|
||||||
|
lv_indev_drv_init(&CrowPanelController::indev_drv);
|
||||||
|
CrowPanelController::indev_drv.type = LV_INDEV_TYPE_POINTER;
|
||||||
|
CrowPanelController::indev_drv.read_cb = my_touchpad_read;
|
||||||
|
CrowPanelController::indev_drv.user_data = this;
|
||||||
|
lv_indev_drv_register(&CrowPanelController::indev_drv);
|
||||||
|
|
||||||
|
ui_init();
|
||||||
|
inic_barra_rpm();
|
||||||
|
lv_timer_create(CrowPanelController::iniciar_pantalla, 2000, this);
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
Serial.println("CrowPanel OK");
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::show_label(lv_obj_t *label){
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
lv_obj_clear_flag(label, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::hide_label(lv_obj_t *label){
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
lv_obj_add_flag(label, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
|
||||||
|
{
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
|
||||||
|
CrowPanelController* controller = static_cast<CrowPanelController*>(disp->user_data);
|
||||||
|
LGFX& lcd = controller->lcd;
|
||||||
|
|
||||||
|
uint32_t w = (area->x2 - area->x1 + 1);
|
||||||
|
uint32_t h = (area->y2 - area->y1 + 1);
|
||||||
|
|
||||||
|
#if (LV_COLOR_16_SWAP != 0)
|
||||||
|
lcd.pushImageDMA(area->x1, area->y1, w, h, (lgfx::rgb565_t*)&color_p->full);
|
||||||
|
#else
|
||||||
|
lcd.pushImageDMA(area->x1, area->y1, w, h, (lgfx::rgb565_t*)&color_p->full);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lv_disp_flush_ready(disp);
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data)
|
||||||
|
{
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
|
||||||
|
CrowPanelController* controller = static_cast<CrowPanelController*>(indev_driver->user_data);
|
||||||
|
|
||||||
|
uint16_t touchX, touchY;
|
||||||
|
bool touched = controller->lcd.getTouch(&touchX, &touchY);
|
||||||
|
|
||||||
|
if (!touched) {
|
||||||
|
data->state = LV_INDEV_STATE_REL;
|
||||||
|
} else {
|
||||||
|
data->state = LV_INDEV_STATE_PR;
|
||||||
|
data->point.x = screenWidth - 1 - touchX;
|
||||||
|
data->point.y = screenHeight - 1 - touchY;
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::set_value_to_label(lv_obj_t *label, double value)
|
||||||
|
{
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
|
||||||
|
if (value == (int)value) {
|
||||||
|
lv_label_set_text_fmt(label, "%d", (int)value);
|
||||||
|
} else {
|
||||||
|
char buffer[10];
|
||||||
|
snprintf(buffer, sizeof(buffer), "%.2f", value);
|
||||||
|
lv_label_set_text(label, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::set_string_to_label(lv_obj_t *label, const char *string){
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
lv_label_set_text(label, string);
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::iniciar_pantalla(lv_timer_t * timer){ // Temporizador para que este 2 segundos en el logo y llama al cambio de pantalla
|
||||||
|
CrowPanelController *self = (CrowPanelController *) timer->user_data;
|
||||||
|
|
||||||
|
if(self){
|
||||||
|
self->encendido_pantalla=true;
|
||||||
|
self->change_screen();
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
lv_timer_del(timer);
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::change_screen(){
|
||||||
|
|
||||||
|
if(encendido_pantalla){
|
||||||
|
new_screen++;
|
||||||
|
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
if(new_screen >= 2){ // Se puede expandir si se ponen mas pantallas
|
||||||
|
new_screen = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(new_screen){
|
||||||
|
case 1:
|
||||||
|
lv_disp_load_scr(ui_Screen1);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
lv_disp_load_scr(ui_Screen2);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
//lv_disp_load_scr(ui_Screen3);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Serial.println("Error cambiar pantalla");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// New color management methods
|
||||||
|
void CrowPanelController::set_label_color(lv_obj_t *label, uint32_t color) {
|
||||||
|
if (label != NULL) {
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
lv_obj_set_style_text_color(label, lv_color_hex(color), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::set_panel_color(lv_obj_t *panel, uint32_t bg_color) {
|
||||||
|
if (panel != NULL) {
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
// 1. COPIAMOS la lógica de opacidad de la función default
|
||||||
|
// LV_OPA_COVER significa 100% opaco (es lo mismo que 255)
|
||||||
|
lv_obj_set_style_bg_opa(panel, LV_OPA_COVER, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
// 2. Aplicamos el color que queremos (Rojo, Verde, etc.)
|
||||||
|
lv_obj_set_style_bg_color(panel, lv_color_hex(bg_color), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::set_conditional_colors() {
|
||||||
|
// This method will be called from data_processor.cpp to update colors based on conditions
|
||||||
|
// Implementation will be added when specific conditions are defined
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::update_rpm_bar(int rpm){ // Actualiza la barra de las rpm
|
||||||
|
|
||||||
|
int pixel=0;
|
||||||
|
uint32_t color;
|
||||||
|
// bool rpm12300=false;
|
||||||
|
|
||||||
|
pixel=rpm_to_pixel(rpm);
|
||||||
|
|
||||||
|
if(pixel<695){
|
||||||
|
color=(ui_theme_idx==1) ? COLOR_BLANCO_NUEVO : COLOR_NEGRO_NUEVO;
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm, lv_color_hex(color), LV_PART_INDICATOR);
|
||||||
|
} else{
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm, lv_color_hex(COLOR_ROJO_BARRA), LV_PART_INDICATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_bar_set_value(ui_barrpm, pixel, LV_ANIM_ON);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if(rpm>12300){
|
||||||
|
uint32_t ahora=millis();
|
||||||
|
rpm12300=true;
|
||||||
|
|
||||||
|
if(ahora-last_parpadeo>50){
|
||||||
|
last_parpadeo=ahora;
|
||||||
|
parpadeo=!parpadeo;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(parpadeo){
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm, lv_color_make(255, 255, 255), LV_PART_INDICATOR);
|
||||||
|
lv_obj_set_style_bg_grad_color(ui_barrpm, lv_color_make(255, 255, 255), LV_PART_INDICATOR);
|
||||||
|
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm1, lv_color_make(255, 255, 255), LV_PART_INDICATOR);
|
||||||
|
lv_obj_set_style_bg_grad_color(ui_barrpm1, lv_color_make(255, 255, 255), LV_PART_INDICATOR);
|
||||||
|
} else {
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm, lv_color_make(255, 0, 0), LV_PART_INDICATOR);
|
||||||
|
lv_obj_set_style_bg_grad_color(ui_barrpm, lv_color_make(255, 0, 0), LV_PART_INDICATOR);
|
||||||
|
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm1, lv_color_make(255, 0, 0), LV_PART_INDICATOR);
|
||||||
|
lv_obj_set_style_bg_grad_color(ui_barrpm1, lv_color_make(255, 0, 0), LV_PART_INDICATOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!rpm12300 && last_rpm12300){
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm, lv_color_make(0, 205, 0), LV_PART_INDICATOR);
|
||||||
|
lv_obj_set_style_bg_grad_color(ui_barrpm, lv_color_make(230, 230, 0), LV_PART_INDICATOR);
|
||||||
|
|
||||||
|
lv_obj_set_style_bg_color(ui_barrpm1, lv_color_make(230, 230, 0), LV_PART_INDICATOR);
|
||||||
|
lv_obj_set_style_bg_grad_color(ui_barrpm1, lv_color_make(255, 0, 0), LV_PART_INDICATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_rpm12300=rpm12300;
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int CrowPanelController::rpm_to_pixel(int rpm)
|
||||||
|
{
|
||||||
|
int rpm_max = (get_rpm()/1000)*1000;
|
||||||
|
int desplazamiento = get_desplazamiento();
|
||||||
|
|
||||||
|
int x = rpm_scale_x_from_rpm(rpm, rpm_max, desplazamiento);
|
||||||
|
int pixel = x - RPM_SCALE_START_X;
|
||||||
|
|
||||||
|
if(pixel < 0){
|
||||||
|
pixel = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pixel > 770){
|
||||||
|
pixel = 770;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pixel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrowPanelController::inic_barra_rpm(){ // Inicializa el rango de la barra y la animacion
|
||||||
|
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
|
||||||
|
lv_bar_set_range(ui_barrpm, 0, 770);
|
||||||
|
lv_obj_set_style_anim_time(ui_barrpm, 40, LV_PART_MAIN); // Si se ve mal se puede cambiar e incluso quitar, si se quita hay que modificar en update_rpm_bar
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
void CrowPanelController::create_rpm_bar(int rpm_max, int desplazamiento)
|
||||||
|
{
|
||||||
|
if(ui_barcontainer == nullptr){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_max < 1000){
|
||||||
|
rpm_max = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_max > 15000){
|
||||||
|
rpm_max = 15000;
|
||||||
|
}
|
||||||
|
|
||||||
|
int divisor = rpm_max / 1000;
|
||||||
|
|
||||||
|
if(divisor >= RPM_MAX_OBJECTS){
|
||||||
|
divisor = RPM_MAX_OBJECTS - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreTakeRecursive(lvgl_mutex, portMAX_DELAY);
|
||||||
|
|
||||||
|
hide_original_rpm_scale();
|
||||||
|
|
||||||
|
for(int i=0; i<RPM_MAX_OBJECTS; i++){
|
||||||
|
if(rpm_dynamic_major[i] != nullptr){
|
||||||
|
lv_obj_add_flag(rpm_dynamic_major[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_dynamic_mid[i] != nullptr){
|
||||||
|
lv_obj_add_flag(rpm_dynamic_mid[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rpm_dynamic_label[i] != nullptr){
|
||||||
|
lv_obj_add_flag(rpm_dynamic_label[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int previous_x = RPM_SCALE_START_X;
|
||||||
|
|
||||||
|
for(int i=0; i<=divisor; i++){
|
||||||
|
|
||||||
|
int rpm_value = i * 1000;
|
||||||
|
|
||||||
|
if(i == divisor){
|
||||||
|
rpm_value = rpm_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = rpm_scale_x_from_rpm(rpm_value, rpm_max, desplazamiento);
|
||||||
|
|
||||||
|
bool red = (i == divisor);
|
||||||
|
|
||||||
|
if(rpm_dynamic_major[i] == nullptr){
|
||||||
|
rpm_dynamic_major[i] = lv_obj_create(ui_barcontainer);
|
||||||
|
lv_obj_set_width(rpm_dynamic_major[i], 3);
|
||||||
|
lv_obj_set_height(rpm_dynamic_major[i], RPM_MAJOR_H);
|
||||||
|
lv_obj_set_align(rpm_dynamic_major[i], LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(rpm_dynamic_major[i], LV_OBJ_FLAG_SCROLLABLE);
|
||||||
|
lv_obj_set_style_radius(rpm_dynamic_major[i], 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_set_x(rpm_dynamic_major[i], x);
|
||||||
|
lv_obj_set_y(rpm_dynamic_major[i], RPM_MAJOR_Y);
|
||||||
|
lv_obj_clear_flag(rpm_dynamic_major[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
set_rpm_mark_color(rpm_dynamic_major[i], red);
|
||||||
|
|
||||||
|
if(rpm_dynamic_label[i] == nullptr){
|
||||||
|
rpm_dynamic_label[i] = lv_label_create(ui_barcontainer);
|
||||||
|
lv_obj_set_width(rpm_dynamic_label[i], LV_SIZE_CONTENT);
|
||||||
|
lv_obj_set_height(rpm_dynamic_label[i], LV_SIZE_CONTENT);
|
||||||
|
lv_obj_set_align(rpm_dynamic_label[i], LV_ALIGN_CENTER);
|
||||||
|
lv_obj_set_style_text_font(rpm_dynamic_label[i], &ui_font_rpm, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_set_x(rpm_dynamic_label[i], x);
|
||||||
|
lv_obj_set_y(rpm_dynamic_label[i], RPM_LABEL_Y);
|
||||||
|
|
||||||
|
if(rpm_value <= 6000){
|
||||||
|
lv_label_set_text_fmt(rpm_dynamic_label[i], "%d", rpm_value / 1000);
|
||||||
|
} else {
|
||||||
|
lv_label_set_text_fmt(rpm_dynamic_label[i], "%d", rpm_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_clear_flag(rpm_dynamic_label[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
set_rpm_label_color(rpm_dynamic_label[i], red);
|
||||||
|
|
||||||
|
if(i > 0 && rpm_value > 6000){
|
||||||
|
|
||||||
|
int x_middle = (previous_x + x) / 2;
|
||||||
|
bool mid_red = (i == divisor);
|
||||||
|
|
||||||
|
if(rpm_dynamic_mid[i] == nullptr){
|
||||||
|
rpm_dynamic_mid[i] = lv_obj_create(ui_barcontainer);
|
||||||
|
lv_obj_set_width(rpm_dynamic_mid[i], 3);
|
||||||
|
lv_obj_set_height(rpm_dynamic_mid[i], RPM_MID_H);
|
||||||
|
lv_obj_set_align(rpm_dynamic_mid[i], LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(rpm_dynamic_mid[i], LV_OBJ_FLAG_SCROLLABLE);
|
||||||
|
lv_obj_set_style_radius(rpm_dynamic_mid[i], 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_set_x(rpm_dynamic_mid[i], x_middle);
|
||||||
|
lv_obj_set_y(rpm_dynamic_mid[i], RPM_MID_Y);
|
||||||
|
lv_obj_clear_flag(rpm_dynamic_mid[i], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
set_rpm_mark_color(rpm_dynamic_mid[i], mid_red);
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_x = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreGiveRecursive(lvgl_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CrowPanelController::set_lineal(){
|
||||||
|
return get_rpm_display();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
584
Pantalla/src/data_processor.cpp
Normal file
584
Pantalla/src/data_processor.cpp
Normal file
|
|
@ -0,0 +1,584 @@
|
||||||
|
/**
|
||||||
|
* @file data_processor.cpp
|
||||||
|
* @author Raúl Arcos Herrera
|
||||||
|
* @brief This file contains the implementation of the Data Processor class for Link G4+ ECU.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/data_processor.hpp"
|
||||||
|
#include "../include/ajustes.hpp"
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
static int rpm_max=8000;
|
||||||
|
static int desp=0;
|
||||||
|
static bool modo_oscuro=true;
|
||||||
|
static int pantalla=0;
|
||||||
|
static int rpm_display=false;
|
||||||
|
static int diff_rpm=1200;
|
||||||
|
|
||||||
|
static float vbatt_too_high=15.0;
|
||||||
|
static float vbatt_high=14.5;
|
||||||
|
static float vbatt_low=12.5;
|
||||||
|
|
||||||
|
static int water_hot=110;
|
||||||
|
static int water_mild=100;
|
||||||
|
static int water_cold=70;
|
||||||
|
|
||||||
|
static int oil_hot=110;
|
||||||
|
static int oil_mild=100;
|
||||||
|
static int oil_cold=70;
|
||||||
|
|
||||||
|
static float oil_pressure_too_high=4.0;
|
||||||
|
static float oil_pressure_high=3.0;
|
||||||
|
static float oil_pressure_low=1.0;
|
||||||
|
|
||||||
|
static float fuel_pressure_too_high=15.0;
|
||||||
|
static float fuel_pressure_high=12.0;
|
||||||
|
static float fuel_pressure_low=3.0;
|
||||||
|
|
||||||
|
static const uint32_t UI_RPM_MS = 30;
|
||||||
|
static const uint32_t UI_SLOW_MS = 100;
|
||||||
|
static const uint32_t UI_AUX_MS = 200;
|
||||||
|
|
||||||
|
static bool every_ms(uint32_t &last_time, uint32_t interval)
|
||||||
|
{
|
||||||
|
uint32_t now = millis();
|
||||||
|
|
||||||
|
if(last_time == 0 || now - last_time >= interval){
|
||||||
|
last_time = now;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// --------------------------------
|
||||||
|
|
||||||
|
void DataProcessor::send_serial(byte type, unsigned int value) { //Como parámetros se pasan el ID (type), que es el ID establecido al inicio del código para el dato que se quiera enviar. Ej: RPM_ID -> 0x51; y se envía el valor de dicho dato.
|
||||||
|
byte dato[8] = { 0x5A, 0xA5, 0x05, 0x82, 0x00, 0x00, 0x00, 0x00 }; //Se establece un arreglo de bytes con los primeros datos necesarios para que la pantalla lo interprete como mensaje (En la Wiki hay tutoriales que lo explican a fondo), como ser la longitud y el tipo de mensaje.
|
||||||
|
dato[4] = type; //Se configura en el mensaje el ID correspondiente al dato a enviar.
|
||||||
|
dato[6] = (value >> 8) & 0xFF; //Se configura el dato en los últimos 2 bytes.
|
||||||
|
dato[7] = value & 0xFF;
|
||||||
|
|
||||||
|
Serial.write(dato, 8); //Se envía serialmente el mensaje, indicando su longituden bytes para ello.
|
||||||
|
}
|
||||||
|
|
||||||
|
//RPM + TPS + vBatt + ECT
|
||||||
|
void DataProcessor::send_serial_frame_0(int rpmh, int rpml, int tpsh, int tpsl, int vbatth, int vbattl, int ect){
|
||||||
|
//Serial.println("send_serial_frame_0");
|
||||||
|
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
int rpm = (rpmh * 256) + rpml;
|
||||||
|
float tps = ((tpsh * 256) + tpsl);
|
||||||
|
float vbatt = ((vbatth * 256.0) + (float)vbattl)/100.0;
|
||||||
|
|
||||||
|
static uint32_t last_rpm_update = 0;
|
||||||
|
static uint32_t last_slow_update = 0;
|
||||||
|
|
||||||
|
if(every_ms(last_rpm_update, UI_RPM_MS)){
|
||||||
|
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_rpm, rpm);
|
||||||
|
|
||||||
|
_crow_panel_controller->update_rpm_bar(rpm);
|
||||||
|
DataProcessor::update_rpm_leds(rpm);
|
||||||
|
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_throttle, tps);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!every_ms(last_slow_update, UI_SLOW_MS)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_vbat, vbatt);
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_watert, ect);
|
||||||
|
|
||||||
|
// Battery voltage color (typical car battery: 12.6V resting, 13.2-14.4V running)
|
||||||
|
if (vbatt < vbatt_low) {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_vbatpanel, color); // Red for low
|
||||||
|
} else if (vbatt < vbatt_high) {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_vbatpanel, color); // Yellow for warning
|
||||||
|
} else if (vbatt > vbatt_too_high) {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_vbatpanel, color); // Yellow for overcharge
|
||||||
|
} else {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_vbatpanel, color); // Green for good
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Engine coolant temperature (typical range: 80-105°C normal operating temp)
|
||||||
|
if (ect > water_hot) {
|
||||||
|
// Crítico: Rojo
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_watertpanel, color);
|
||||||
|
_crow_panel_controller->hide_label(ui_warmuppanel);
|
||||||
|
_crow_panel_controller->hide_label(ui_warmup);
|
||||||
|
} else if (ect >= water_mild) {
|
||||||
|
// Advertencia: Amarillo (100 a 110)
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_watertpanel, color);
|
||||||
|
_crow_panel_controller->hide_label(ui_warmuppanel);
|
||||||
|
_crow_panel_controller->hide_label(ui_warmup);
|
||||||
|
} else if (ect >= water_cold) {
|
||||||
|
//Temperatura Ideal: Verde (70 a 100)
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_watertpanel, color);
|
||||||
|
_crow_panel_controller->hide_label(ui_warmuppanel);
|
||||||
|
_crow_panel_controller->hide_label(ui_warmup);
|
||||||
|
} else { // etc <= 70 Azul
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AZUL_NUEVO : CrowPanelController::COLOR_AZUL_CLARO;
|
||||||
|
_crow_panel_controller->show_label(ui_warmuppanel);
|
||||||
|
_crow_panel_controller->show_label(ui_warmup);
|
||||||
|
_crow_panel_controller->set_panel_color(ui_watertpanel, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//LAMB + LAMBTRG + FUEL + GEAR
|
||||||
|
void DataProcessor::send_serial_frame_1(int lmbh, int lmbl, int lmbth, int lmbtl, int fuelh, int fuell, int gear){
|
||||||
|
//Serial.println("send_serial_frame_1");
|
||||||
|
|
||||||
|
static uint32_t last_slow_update = 0;
|
||||||
|
|
||||||
|
if(!every_ms(last_slow_update, UI_SLOW_MS)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
double lmb = ((lmbh * 256) + lmbl) / 100.0;
|
||||||
|
double lmbtrg = ((lmbth * 256) + lmbtl) / 100.0;
|
||||||
|
double fuel = ((fuelh * 256) + fuell)/100.0;
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_lambda, lmb);
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_lambdatrg, lmbtrg);
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_fuelp, fuel);
|
||||||
|
//_crow_panel_controller->set_value_to_label(ui_neutral, gear);
|
||||||
|
|
||||||
|
if (fuel > fuel_pressure_too_high) {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_fuelppanel, color);
|
||||||
|
} else if (fuel >= fuel_pressure_high) {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_fuelppanel, color);
|
||||||
|
} else if (fuel >= fuel_pressure_low) {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_fuelppanel, color);
|
||||||
|
} else {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_fuelppanel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lmb > 1.1){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_lambdapanel, color);
|
||||||
|
} else {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_lambdapanel, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DataProcessor::send_serial_frame_2(int shut, int fan, int lmbch, int lmbcl, int brakeh, int brakel, int aux1){
|
||||||
|
//Serial.println("send_serial_frame_2");
|
||||||
|
|
||||||
|
static uint32_t last_aux_update = 0;
|
||||||
|
|
||||||
|
if(!every_ms(last_aux_update, UI_AUX_MS)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double lmbcorrect = ((lmbch * 256) + lmbcl) / 100.0;
|
||||||
|
double brake = ((brakeh * 256) + brakel);
|
||||||
|
|
||||||
|
char shut_str[4];
|
||||||
|
char fan_str[4];
|
||||||
|
char aux1_str[4];
|
||||||
|
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
if (shut == 1){
|
||||||
|
strcpy(shut_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_sdownpanel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(shut_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_sdownpanel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fan == 1){
|
||||||
|
strcpy(fan_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_fanpanel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(fan_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_fanpanel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aux1 == 0){
|
||||||
|
strcpy(aux1_str, "N");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->show_label(ui_neutralpanel);
|
||||||
|
_crow_panel_controller->set_panel_color(ui_neutralpanel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux1_str, "D");
|
||||||
|
_crow_panel_controller->hide_label(ui_neutralpanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
_crow_panel_controller->set_string_to_label(ui_sdown, shut_str);
|
||||||
|
_crow_panel_controller->set_string_to_label(ui_fan, fan_str);
|
||||||
|
// _crow_panel_controller->set_value_to_label(ui_correctionlambda, lmbcorrect); NO HAY AHORA MISMO
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_brake, brake);
|
||||||
|
_crow_panel_controller->set_string_to_label(ui_neutral, aux1_str);
|
||||||
|
|
||||||
|
// Brake pressure color (assuming brake > 0 means brakes applied)
|
||||||
|
/*
|
||||||
|
if (brake > 100) { // Adjust threshold as needed
|
||||||
|
_crow_panel_controller->set_label_color(ui_auxstatus9, CrowPanelController::COLOR_WARNING); // Yellow for heavy braking
|
||||||
|
} else if (brake > 0) {
|
||||||
|
_crow_panel_controller->set_label_color(ui_auxstatus9, CrowPanelController::COLOR_NORMAL); // White for light braking
|
||||||
|
} else {
|
||||||
|
_crow_panel_controller->set_label_color(ui_auxstatus9, CrowPanelController::COLOR_GOOD); // Green for no braking
|
||||||
|
}
|
||||||
|
TODO COMENTADO PORQUE LO ULTIMO NO VEO UTILIDAD Y LAS 2 COSAS PRIMERAS ESTAN OPTIMIZADAS PAR DE LINEAS ARRIBAS
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DataProcessor::send_serial_frame_3(int oilth, int oiltl, int oilph, int oilpl, int maph, int mapl, int useless) {
|
||||||
|
|
||||||
|
float oilt = ((oilth * 256) + oiltl) / 100.0;
|
||||||
|
float oilp = ((oilph * 256) + oilpl) / 100.0;
|
||||||
|
float map = ((maph * 256) + mapl) / 100.0;
|
||||||
|
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
// Temperatura del aceite
|
||||||
|
if (oilt > oil_hot) {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oiltpanel, color);
|
||||||
|
} else if (oilt >= oil_mild) {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oiltpanel, color);
|
||||||
|
} else if (oilt >= oil_cold) {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oiltpanel, color);
|
||||||
|
} else {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oiltpanel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Presión del aceite
|
||||||
|
if (oilp > oil_pressure_too_high) {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oilppanel, color);
|
||||||
|
} else if (oilp >= oil_pressure_high) {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oilppanel, color);
|
||||||
|
} else if (oilp >= oil_pressure_low) {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oilppanel, color);
|
||||||
|
} else {
|
||||||
|
color = (ui_theme_idx == 1) ? CrowPanelController::COLOR_AZUL_NUEVO : CrowPanelController::COLOR_AZUL_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_oilppanel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_oilt, oilt);
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_oilp, oilp);
|
||||||
|
_crow_panel_controller->set_value_to_label(ui_map, map);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DataProcessor::send_serial_frame_5(int aux3, int aux4, int aux5, int aux6, int aux7, int aux8, int dig1){
|
||||||
|
Serial.println("send_serial_frame_5");
|
||||||
|
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
char aux3_str[4];
|
||||||
|
char aux4_str[4];
|
||||||
|
char aux5_str[4];
|
||||||
|
char aux6_str[4];
|
||||||
|
char aux7_str[4];
|
||||||
|
char aux8_str[4];
|
||||||
|
char dig1_str[4];
|
||||||
|
|
||||||
|
if (aux3 == 1){ // Cambio de pantalla
|
||||||
|
strcpy(aux3_str, "ON");
|
||||||
|
_crow_panel_controller->change_screen();
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux3panel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux3_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux3panel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aux4 == 1){
|
||||||
|
strcpy(aux4_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux4panel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux4_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux4panel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aux5 == 1){
|
||||||
|
strcpy(aux5_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux5panel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux5_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux5panel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aux6 == 1){
|
||||||
|
strcpy(aux6_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux6panel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux6_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux6panel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(aux7==1){
|
||||||
|
strcpy(aux7_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux7panel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux7_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux7panel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(aux8==1){
|
||||||
|
strcpy(aux8_str, "ON");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux8panel, color);
|
||||||
|
} else {
|
||||||
|
strcpy(aux8_str, "OFF");
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
_crow_panel_controller->set_panel_color(ui_aux8panel, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
//_led_strip->launch_control(aux6);
|
||||||
|
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_aux3, aux3_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_aux4, aux4_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_aux5, aux5_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_aux6, aux6_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_aux7, aux7_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_aux8, aux8_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_dig1, dig1_str);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataProcessor::send_serial_frame_volante(int neutra, int cpant, int arrancar, int launch, int levaizq, int levader, int aux){
|
||||||
|
/*
|
||||||
|
char neutra_str[4];
|
||||||
|
char cpant_str[4];
|
||||||
|
char arrancar_str[4];
|
||||||
|
char launch_str[4];
|
||||||
|
char levaizq_str[4];
|
||||||
|
char levader_str[4];
|
||||||
|
|
||||||
|
if (neutra== 1){ // Neutra
|
||||||
|
strcpy(neutra_str, "ON");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_pneutra, CrowPanelController::COLOR_VERDE);
|
||||||
|
} else {
|
||||||
|
strcpy(neutra_str, "OFF");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_pneutra, CrowPanelController::COLOR_ROJO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpant == 1){ // Cambio de pantalla
|
||||||
|
if(request_screen==0){
|
||||||
|
_crow_panel_controller->change_screen();
|
||||||
|
}
|
||||||
|
strcpy(cpant_str, "ON");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_ppantalla, CrowPanelController::COLOR_VERDE);
|
||||||
|
} else {
|
||||||
|
strcpy(cpant_str, "OFF");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_ppantalla, CrowPanelController::COLOR_ROJO);
|
||||||
|
}
|
||||||
|
|
||||||
|
request_screen=cpant;
|
||||||
|
|
||||||
|
if (arrancar == 1){ // Arrancar
|
||||||
|
strcpy(arrancar_str, "ON");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_parrancar, CrowPanelController::COLOR_VERDE);
|
||||||
|
} else {
|
||||||
|
strcpy(arrancar_str, "OFF");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_parrancar, CrowPanelController::COLOR_ROJO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (launch == 1){ // Launch
|
||||||
|
strcpy(launch_str, "ON");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_plaunch, CrowPanelController::COLOR_VERDE);
|
||||||
|
} else {
|
||||||
|
strcpy(launch_str, "OFF");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_plaunch, CrowPanelController::COLOR_ROJO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(levaizq==1){ // Leva izquierda
|
||||||
|
strcpy(levaizq_str, "ON");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_plevaizq, CrowPanelController::COLOR_VERDE);
|
||||||
|
} else {
|
||||||
|
strcpy(levaizq_str, "OFF");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_plevaizq, CrowPanelController::COLOR_ROJO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(levader==1){ // Leva derecha
|
||||||
|
strcpy(levader_str, "ON");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_plevader, CrowPanelController::COLOR_VERDE);
|
||||||
|
} else {
|
||||||
|
strcpy(levader_str, "OFF");
|
||||||
|
_crow_panel_controller->set_panel_color(ui_plevader, CrowPanelController::COLOR_ROJO);
|
||||||
|
}
|
||||||
|
|
||||||
|
_led_strip->launch_control(launch);
|
||||||
|
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_neutra, neutra_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_pantalla, cpant_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_arrancar, arrancar_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_launch, launch_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_levaizq, levaizq_str);
|
||||||
|
_crow_panel_controller -> set_string_to_label(ui_levader, levader_str);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataProcessor::set_dataprocessor(){
|
||||||
|
|
||||||
|
rpm_max=get_rpm();
|
||||||
|
desp=get_desplazamiento();
|
||||||
|
modo_oscuro=get_modo_oscuro();
|
||||||
|
pantalla=get_pantalla();
|
||||||
|
rpm_display=get_rpm_display();
|
||||||
|
diff_rpm=get_diff_rpm();
|
||||||
|
|
||||||
|
vbatt_too_high=get_vbatt_too_high();
|
||||||
|
vbatt_high=get_vbatt_high();
|
||||||
|
vbatt_low=get_vbatt_low();
|
||||||
|
|
||||||
|
water_hot=get_water_hot();
|
||||||
|
water_mild=get_water_mild();
|
||||||
|
water_cold=get_water_cold();
|
||||||
|
|
||||||
|
oil_hot=get_oil_hot();
|
||||||
|
oil_mild=get_oil_mild();
|
||||||
|
oil_cold=get_oil_cold();
|
||||||
|
|
||||||
|
oil_pressure_too_high=get_oil_pressure_too_high();
|
||||||
|
oil_pressure_high=get_oil_pressure_high();
|
||||||
|
oil_pressure_low=get_oil_pressure_low();
|
||||||
|
|
||||||
|
fuel_pressure_too_high=get_fuel_pressure_too_high();
|
||||||
|
fuel_pressure_high=get_fuel_pressure_high();
|
||||||
|
fuel_pressure_low=get_fuel_pressure_low();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataProcessor::update_rpm_leds(int rpm){
|
||||||
|
|
||||||
|
static int last_leds = -1;
|
||||||
|
static int last_theme = -1;
|
||||||
|
static bool last_over_rpm = false;
|
||||||
|
|
||||||
|
static lv_obj_t* rpm_bars[15] = {
|
||||||
|
ui_led0, ui_led1, ui_led2, ui_led3, ui_led4,
|
||||||
|
ui_led5, ui_led6, ui_led7, ui_led8, ui_led9,
|
||||||
|
ui_led10, ui_led11, ui_led12, ui_led13, ui_led14
|
||||||
|
};
|
||||||
|
|
||||||
|
int rpm_inicio = rpm_max - diff_rpm;
|
||||||
|
|
||||||
|
if(rpm_inicio < 0){
|
||||||
|
rpm_inicio = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int leds = 0;
|
||||||
|
bool over_rpm = rpm >= rpm_max;
|
||||||
|
|
||||||
|
if(rpm >= rpm_max){
|
||||||
|
leds = 15;
|
||||||
|
} else if(rpm > rpm_inicio){
|
||||||
|
int rango = rpm_max - rpm_inicio;
|
||||||
|
|
||||||
|
if(rango > 0){
|
||||||
|
leds = ((rpm - rpm_inicio) * 15) / rango;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(leds < 0){
|
||||||
|
leds = 0;
|
||||||
|
} else if(leds > 15){
|
||||||
|
leds = 15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(leds == last_leds && ui_theme_idx == last_theme && over_rpm == last_over_rpm){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
if(ui_theme_idx != last_theme || last_leds == -1 || over_rpm != last_over_rpm){
|
||||||
|
|
||||||
|
for(int i=0;i<15;i++){
|
||||||
|
|
||||||
|
if(i<leds){
|
||||||
|
|
||||||
|
if(over_rpm){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AZUL_NUEVO : CrowPanelController::COLOR_AZUL_CLARO;
|
||||||
|
} else if(i<=4){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
} else if(i<=10){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
} else {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_FONDO_BARRA_OSCURO : CrowPanelController::COLOR_FONDO_BARRA_CLARO;
|
||||||
|
}
|
||||||
|
|
||||||
|
_crow_panel_controller->set_panel_color(rpm_bars[i], color);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if(leds > last_leds){
|
||||||
|
|
||||||
|
for(int i=last_leds;i<leds;i++){
|
||||||
|
|
||||||
|
if(over_rpm){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AZUL_NUEVO : CrowPanelController::COLOR_AZUL_CLARO;
|
||||||
|
} else if(i<=4){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_VERDE_NUEVO : CrowPanelController::COLOR_VERDE_CLARO;
|
||||||
|
} else if(i<=10){
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_AMARILLO_NUEVO : CrowPanelController::COLOR_AMARILLO_CLARO;
|
||||||
|
} else {
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_ROJO_NUEVO : CrowPanelController::COLOR_ROJO_CLARO;
|
||||||
|
}
|
||||||
|
|
||||||
|
_crow_panel_controller->set_panel_color(rpm_bars[i], color);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
color=(ui_theme_idx==1) ? CrowPanelController::COLOR_FONDO_BARRA_OSCURO : CrowPanelController::COLOR_FONDO_BARRA_CLARO;
|
||||||
|
|
||||||
|
for(int i=leds;i<last_leds;i++){
|
||||||
|
_crow_panel_controller->set_panel_color(rpm_bars[i], color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
last_leds = leds;
|
||||||
|
last_theme = ui_theme_idx;
|
||||||
|
last_over_rpm = over_rpm;
|
||||||
|
}
|
||||||
|
|
||||||
139
Pantalla/src/g24_wheel_buttons.cpp
Normal file
139
Pantalla/src/g24_wheel_buttons.cpp
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
#include "../include/g24_wheel_buttons.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
void G24WheelButtons::begin() {
|
||||||
|
pinMode(B1_PIN, INPUT_PULLUP); // Arriba izquierda, funcion: neutro
|
||||||
|
pinMode(B2_PIN, INPUT_PULLUP); // Arriba derecha, funcion: cambiar de pantalla
|
||||||
|
pinMode(B3_PIN, INPUT_PULLUP); // Abajo izquierda, funcion: arrancar
|
||||||
|
pinMode(B4_PIN, INPUT_PULLUP); // Abajo derecha, funcion: launch control
|
||||||
|
pinMode(LEVA_IZQ_PIN, INPUT_PULLUP); // Leva derecha
|
||||||
|
pinMode(LEVA_DER_PIN, INPUT_PULLUP); // Leva izquierda
|
||||||
|
|
||||||
|
/*
|
||||||
|
pinMode(B1_LED_PIN, OUTPUT);
|
||||||
|
pinMode(B2_LED_PIN, OUTPUT);
|
||||||
|
pinMode(B3_LED_PIN, OUTPUT);
|
||||||
|
pinMode(B4_LED_PIN, OUTPUT);
|
||||||
|
pinMode(E1_PIN_A, INPUT);
|
||||||
|
pinMode(E1_PIN_B, INPUT);
|
||||||
|
pinMode(E2_PIN_A, INPUT);
|
||||||
|
pinMode(E2_PIN_B, INPUT);
|
||||||
|
pinMode(E1_BUTTON_PIN, INPUT_PULLUP);
|
||||||
|
pinMode(E2_BUTTON_PIN, INPUT_PULLUP);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// attachInterruptArg(digitalPinToInterrupt(E1_PIN_A), handleEncoderInterrupt, this, CHANGE);
|
||||||
|
// attachInterruptArg(digitalPinToInterrupt(E2_PIN_A), handleEncoderInterrupt, this, CHANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void G24WheelButtons::ejecucion(){
|
||||||
|
|
||||||
|
if(manejador_tarea==NULL){
|
||||||
|
estado_tarea=true;
|
||||||
|
|
||||||
|
BaseType_t tarea = xTaskCreate(
|
||||||
|
botonera, // Task function
|
||||||
|
"Botones", // Task name
|
||||||
|
4096, // Stack size (words)
|
||||||
|
this, // Task parameter
|
||||||
|
1, // Priority
|
||||||
|
&manejador_tarea // Task handle
|
||||||
|
);
|
||||||
|
|
||||||
|
if(tarea==pdPASS){
|
||||||
|
Serial.println("Tarea de botones del volante creada");
|
||||||
|
} else {
|
||||||
|
Serial.println("Error creacion del boton de la tarea del boton del volante");
|
||||||
|
manejador_tarea=NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void G24WheelButtons::botonera(void *arg){ // Funcion para la tarea de la botonera
|
||||||
|
|
||||||
|
G24WheelButtons* instance = static_cast<G24WheelButtons*>(arg);
|
||||||
|
|
||||||
|
while(instance->estado_tarea){
|
||||||
|
instance->check_boton();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(20));
|
||||||
|
}
|
||||||
|
|
||||||
|
instance->manejador_tarea = NULL;
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void G24WheelButtons::estado_boton(gpio_num_t buttonPin, volatile bool &buttonState, volatile bool &laststate, volatile unsigned long &lastPressTime, volatile unsigned long &temporizador){ // Mira como esta el boton (presionado o no)
|
||||||
|
|
||||||
|
int boton=digitalRead(buttonPin);
|
||||||
|
unsigned long tiempo=millis();
|
||||||
|
|
||||||
|
laststate=buttonState;
|
||||||
|
|
||||||
|
if(boton==LOW && !buttonState){ // Esta presionado
|
||||||
|
if(tiempo - lastPressTime >= debounceTime){ // No hay doble presion
|
||||||
|
if(temporizador==0) temporizador=tiempo;
|
||||||
|
if(tiempo-temporizador>=PRESS_TIME){ // Temporizador para que no se presione solo por la cara, hay que mantener pulsado el boton 50ms
|
||||||
|
lastPressTime=tiempo;
|
||||||
|
buttonState=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if(boton==HIGH && buttonState){ // Se ha dejado de presionar
|
||||||
|
if(tiempo - lastPressTime >= debounceTime){ // No hay doble presion
|
||||||
|
lastPressTime=tiempo;
|
||||||
|
buttonState=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(boton==HIGH) temporizador=0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void G24WheelButtons::check_boton(){
|
||||||
|
|
||||||
|
uint8_t b1=0, b2=0, b3=0, b4=0, leval=0, levar=0;
|
||||||
|
bool enviar=false;
|
||||||
|
|
||||||
|
estado_boton(B1_PIN, B1.estado, B1.last_estado, B1.lastPressTime, B1.temporizador);
|
||||||
|
estado_boton(B2_PIN, B2.estado, B2.last_estado, B2.lastPressTime, B2.temporizador);
|
||||||
|
estado_boton(B3_PIN, B3.estado, B3.last_estado, B3.lastPressTime, B3.temporizador);
|
||||||
|
estado_boton(B4_PIN, B4.estado, B4.last_estado, B4.lastPressTime, B4.temporizador);
|
||||||
|
estado_boton(LEVA_IZQ_PIN, levaizq.estado, levaizq.last_estado, levaizq.lastPressTime, levaizq.temporizador);
|
||||||
|
estado_boton(LEVA_DER_PIN, levader.estado, levader.last_estado, levader.lastPressTime, levader.temporizador);
|
||||||
|
|
||||||
|
if(B1.estado!=B1.last_estado){ // Boton neutral presionado, evento puntual
|
||||||
|
b1=B1.estado;
|
||||||
|
enviar=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(B2.estado!=B2.last_estado){ // Cambio de pantalla presionado, evento puntual
|
||||||
|
b2=B2.estado;
|
||||||
|
enviar=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(B3.estado!=B3.last_estado){ // Arrancado presionado, mantener
|
||||||
|
b3=B3.estado;
|
||||||
|
enviar=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(B4.estado!=B4.last_estado){ // Launch control presionado, mantener
|
||||||
|
b4=B4.estado;
|
||||||
|
enviar=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(levaizq.estado!=levaizq.last_estado){
|
||||||
|
leval=levaizq.estado;
|
||||||
|
enviar=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(levader.estado!=levader.last_estado){
|
||||||
|
levar=levader.estado;
|
||||||
|
enviar=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(enviar){
|
||||||
|
_can->send_frame(_can->mensaje_botonera(b1, b2, b3, b4, leval, levar)); // Crea un mensaje y lo envia
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
271
Pantalla/src/guardado.cpp
Normal file
271
Pantalla/src/guardado.cpp
Normal file
|
|
@ -0,0 +1,271 @@
|
||||||
|
#include "../include/guardado.hpp"
|
||||||
|
#include <LittleFS.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
void data::save_data(){
|
||||||
|
|
||||||
|
File archivo=LittleFS.open(nombre_archivo, "w");
|
||||||
|
|
||||||
|
if(!archivo){
|
||||||
|
Serial.println("Archivo escritura no abierto");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
archivo.printf("RPM-%d\n", rpm_max);
|
||||||
|
archivo.printf("DESP-%d\n", desplazamiento);
|
||||||
|
archivo.printf("MODO-%d\n", modo_oscuro ? 1 : 0);
|
||||||
|
archivo.printf("PANTALLA-%d\n", pantalla);
|
||||||
|
archivo.printf("RPM_DISPLAY-%d\n", rpm_display);
|
||||||
|
archivo.printf("DIFF_RPM-%d\n", diff_rpm);
|
||||||
|
|
||||||
|
archivo.printf("VBATT_TOO_HIGH-%.2f\n", vbatt_too_high);
|
||||||
|
archivo.printf("VBATT_HIGH-%.2f\n", vbatt_high);
|
||||||
|
archivo.printf("VBATT_LOW-%.2f\n", vbatt_low);
|
||||||
|
|
||||||
|
archivo.printf("WATER_HOT-%d\n", water_hot);
|
||||||
|
archivo.printf("WATER_MILD-%d\n", water_mild);
|
||||||
|
archivo.printf("WATER_COLD-%d\n", water_cold);
|
||||||
|
|
||||||
|
archivo.printf("OIL_HOT-%d\n", oil_hot);
|
||||||
|
archivo.printf("OIL_MILD-%d\n", oil_mild);
|
||||||
|
archivo.printf("OIL_COLD-%d\n", oil_cold);
|
||||||
|
|
||||||
|
archivo.printf("OIL_PRESSURE_TOO_HIGH-%.2f\n", oil_pressure_too_high);
|
||||||
|
archivo.printf("OIL_PRESSURE_HIGH-%.2f\n", oil_pressure_high);
|
||||||
|
archivo.printf("OIL_PRESSURE_LOW-%.2f\n", oil_pressure_low);
|
||||||
|
|
||||||
|
archivo.printf("FUEL_PRESSURE_TOO_HIGH-%.2f\n", fuel_pressure_too_high);
|
||||||
|
archivo.printf("FUEL_PRESSURE_HIGH-%.2f\n", fuel_pressure_high);
|
||||||
|
archivo.printf("FUEL_PRESSURE_LOW-%.2f\n", fuel_pressure_low);
|
||||||
|
|
||||||
|
archivo.printf("RECEPCION_DATOS-%d\n", recepcion_datos);
|
||||||
|
|
||||||
|
archivo.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void data::load_data(){
|
||||||
|
|
||||||
|
File archivo=LittleFS.open(nombre_archivo, "r");
|
||||||
|
|
||||||
|
if(!archivo){
|
||||||
|
Serial.println("Archivo lectura no abierto");
|
||||||
|
|
||||||
|
rpm_max=8000;
|
||||||
|
desplazamiento=0;
|
||||||
|
modo_oscuro=1;
|
||||||
|
pantalla=0;
|
||||||
|
rpm_display=0;
|
||||||
|
diff_rpm=1200;
|
||||||
|
recepcion_datos=0;
|
||||||
|
|
||||||
|
vbatt_too_high=15.0;
|
||||||
|
vbatt_high=14.5;
|
||||||
|
vbatt_low=12.5;
|
||||||
|
|
||||||
|
water_hot=110;
|
||||||
|
water_mild=100;
|
||||||
|
water_cold=70;
|
||||||
|
|
||||||
|
oil_hot=110;
|
||||||
|
oil_mild=100;
|
||||||
|
oil_cold=70;
|
||||||
|
|
||||||
|
oil_pressure_too_high=4.0;
|
||||||
|
oil_pressure_high=3.0;
|
||||||
|
oil_pressure_low=1.0;
|
||||||
|
|
||||||
|
fuel_pressure_too_high=15.0;
|
||||||
|
fuel_pressure_high=12.0;
|
||||||
|
fuel_pressure_low=3.0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cantidad=0;
|
||||||
|
|
||||||
|
while(archivo.available() && cantidad<22){
|
||||||
|
String linea=archivo.readStringUntil('\n');
|
||||||
|
int guion=linea.indexOf('-');
|
||||||
|
|
||||||
|
if(guion<0){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String clave=linea.substring(0, guion);
|
||||||
|
float valor=linea.substring(guion+1).toFloat();
|
||||||
|
|
||||||
|
if(clave=="RPM") rpm_max=(int)valor;
|
||||||
|
else if(clave=="DESP") desplazamiento=(int)valor;
|
||||||
|
else if(clave=="MODO") modo_oscuro=(valor!=0);
|
||||||
|
else if(clave=="PANTALLA") pantalla=(int)valor;
|
||||||
|
else if(clave=="RPM_DISPLAY") rpm_display=(int)valor;
|
||||||
|
else if(clave=="DIFF_RPM") diff_rpm=(int)valor;
|
||||||
|
else if(clave=="RECEPCION_DATOS") recepcion_datos=(int)valor;
|
||||||
|
else if(clave=="VBATT_TOO_HIGH") vbatt_too_high=valor;
|
||||||
|
else if(clave=="VBATT_HIGH") vbatt_high=valor;
|
||||||
|
else if(clave=="VBATT_LOW") vbatt_low=valor;
|
||||||
|
else if(clave=="WATER_HOT") water_hot=(int)valor;
|
||||||
|
else if(clave=="WATER_MILD") water_mild=(int)valor;
|
||||||
|
else if(clave=="WATER_COLD") water_cold=(int)valor;
|
||||||
|
else if(clave=="OIL_HOT") oil_hot=(int)valor;
|
||||||
|
else if(clave=="OIL_MILD") oil_mild=(int)valor;
|
||||||
|
else if(clave=="OIL_COLD") oil_cold=(int)valor;
|
||||||
|
else if(clave=="OIL_PRESSURE_TOO_HIGH") oil_pressure_too_high=valor;
|
||||||
|
else if(clave=="OIL_PRESSURE_HIGH") oil_pressure_high=valor;
|
||||||
|
else if(clave=="OIL_PRESSURE_LOW") oil_pressure_low=valor;
|
||||||
|
else if(clave=="FUEL_PRESSURE_TOO_HIGH") fuel_pressure_too_high=valor;
|
||||||
|
else if(clave=="FUEL_PRESSURE_HIGH") fuel_pressure_high=valor;
|
||||||
|
else if(clave=="FUEL_PRESSURE_LOW") fuel_pressure_low=valor;
|
||||||
|
|
||||||
|
cantidad++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(recepcion_datos<0 || recepcion_datos>1){
|
||||||
|
recepcion_datos=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
archivo.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void data::update_data(
|
||||||
|
int rpm_maxn,
|
||||||
|
int desplazamienton,
|
||||||
|
bool modo_oscuron,
|
||||||
|
int pantallan,
|
||||||
|
int rpm_displayn,
|
||||||
|
int diff_rpmn,
|
||||||
|
int recepcion_datosn,
|
||||||
|
float vbatt_too_highn,
|
||||||
|
float vbatt_highn,
|
||||||
|
float vbatt_lown,
|
||||||
|
int water_hotn,
|
||||||
|
int water_mildn,
|
||||||
|
int water_coldn,
|
||||||
|
int oil_hotn,
|
||||||
|
int oil_mildn,
|
||||||
|
int oil_coldn,
|
||||||
|
float oil_pressure_too_highn,
|
||||||
|
float oil_pressure_highn,
|
||||||
|
float oil_pressure_lown,
|
||||||
|
float fuel_pressure_too_highn,
|
||||||
|
float fuel_pressure_highn,
|
||||||
|
float fuel_pressure_lown
|
||||||
|
){
|
||||||
|
|
||||||
|
rpm_max=rpm_maxn;
|
||||||
|
desplazamiento=desplazamienton;
|
||||||
|
modo_oscuro=modo_oscuron;
|
||||||
|
pantalla=pantallan;
|
||||||
|
rpm_display=rpm_displayn;
|
||||||
|
diff_rpm=diff_rpmn;
|
||||||
|
recepcion_datos=recepcion_datosn;
|
||||||
|
|
||||||
|
vbatt_too_high=vbatt_too_highn;
|
||||||
|
vbatt_high=vbatt_highn;
|
||||||
|
vbatt_low=vbatt_lown;
|
||||||
|
|
||||||
|
water_hot=water_hotn;
|
||||||
|
water_mild=water_mildn;
|
||||||
|
water_cold=water_coldn;
|
||||||
|
|
||||||
|
oil_hot=oil_hotn;
|
||||||
|
oil_mild=oil_mildn;
|
||||||
|
oil_cold=oil_coldn;
|
||||||
|
|
||||||
|
oil_pressure_too_high=oil_pressure_too_highn;
|
||||||
|
oil_pressure_high=oil_pressure_highn;
|
||||||
|
oil_pressure_low=oil_pressure_lown;
|
||||||
|
|
||||||
|
fuel_pressure_too_high=fuel_pressure_too_highn;
|
||||||
|
fuel_pressure_high=fuel_pressure_highn;
|
||||||
|
fuel_pressure_low=fuel_pressure_lown;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_rpm(){
|
||||||
|
return rpm_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_desplazamiento(){
|
||||||
|
return desplazamiento;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool data::get_modo_oscuro(){
|
||||||
|
return modo_oscuro;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_pantalla(){
|
||||||
|
return pantalla;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_rpm_display(){
|
||||||
|
return rpm_display;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_diff_rpm(){
|
||||||
|
return diff_rpm;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_vbatt_too_high(){
|
||||||
|
return vbatt_too_high;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_vbatt_high(){
|
||||||
|
return vbatt_high;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_vbatt_low(){
|
||||||
|
return vbatt_low;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_water_hot(){
|
||||||
|
return water_hot;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_water_mild(){
|
||||||
|
return water_mild;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_water_cold(){
|
||||||
|
return water_cold;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_oil_hot(){
|
||||||
|
return oil_hot;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_oil_mild(){
|
||||||
|
return oil_mild;
|
||||||
|
}
|
||||||
|
|
||||||
|
int data::get_oil_cold(){
|
||||||
|
return oil_cold;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_oil_pressure_too_high(){
|
||||||
|
return oil_pressure_too_high;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_oil_pressure_high(){
|
||||||
|
return oil_pressure_high;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_oil_pressure_low(){
|
||||||
|
return oil_pressure_low;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_fuel_pressure_too_high(){
|
||||||
|
return fuel_pressure_too_high;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_fuel_pressure_high(){
|
||||||
|
return fuel_pressure_high;
|
||||||
|
}
|
||||||
|
|
||||||
|
float data::get_fuel_pressure_low(){
|
||||||
|
return fuel_pressure_low;
|
||||||
|
}
|
||||||
|
int data::get_recepcion_datos(){
|
||||||
|
return recepcion_datos;
|
||||||
|
}
|
||||||
99
Pantalla/src/led_strip.cpp
Normal file
99
Pantalla/src/led_strip.cpp
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
/**
|
||||||
|
* @file led_strip.cpp
|
||||||
|
* @author Raúl Arcos Herrera
|
||||||
|
* @brief This file contains the implementation of the LED Strip class for Link G4+ ECU.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/led_strip.hpp"
|
||||||
|
|
||||||
|
void LedStrip::display_rpm(int rpm){
|
||||||
|
if(!launch){
|
||||||
|
if (rpm >= RPM_MAX) {
|
||||||
|
uint32_t ahora=millis();
|
||||||
|
|
||||||
|
if(ahora-last_parpadeo>T_PARPADEO){
|
||||||
|
last_parpadeo=ahora;
|
||||||
|
estado_parpadeo=!estado_parpadeo;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(estado_parpadeo){
|
||||||
|
for (int i = 0; i < NUM_PIXELS; i++) {
|
||||||
|
_ws2812b.setPixelColor(i, _ws2812b.Color(255, 0, 0));
|
||||||
|
}
|
||||||
|
_ws2812b.show();
|
||||||
|
} else {
|
||||||
|
_ws2812b.clear();
|
||||||
|
_ws2812b.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int numLeds = map(rpm, RPM_MIN, RPM_MAX, 0, NUM_PIXELS);
|
||||||
|
int sector1=NUM_PIXELS/3;
|
||||||
|
int sector2=2*sector1;
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM_PIXELS; i++) {
|
||||||
|
if (i < numLeds) {
|
||||||
|
if (i <sector1) {
|
||||||
|
_ws2812b.setPixelColor(i, _ws2812b.Color(0, 255, 0));
|
||||||
|
} else if (i < sector2) {
|
||||||
|
_ws2812b.setPixelColor(i, _ws2812b.Color(255, 255, 0));
|
||||||
|
} else {
|
||||||
|
_ws2812b.setPixelColor(i, _ws2812b.Color(255, 0, 0));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_ws2812b.setPixelColor(i, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ws2812b.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LedStrip::display_startup(){
|
||||||
|
_ws2812b.setBrightness(255);
|
||||||
|
uint32_t colors[3] = { _ws2812b.Color(255, 0, 0), _ws2812b.Color(0, 255, 0), _ws2812b.Color(0, 0, 255) };
|
||||||
|
|
||||||
|
for (int pass = 0; pass < 3; pass++) {
|
||||||
|
for (int i = 0; i <= NUM_PIXELS - 4; i++) {
|
||||||
|
_ws2812b.clear();
|
||||||
|
_ws2812b.show();
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
_ws2812b.setPixelColor(i + j, colors[pass]);
|
||||||
|
}
|
||||||
|
_ws2812b.show();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = NUM_PIXELS - 4; i >= 0; i--) {
|
||||||
|
_ws2812b.clear();
|
||||||
|
_ws2812b.show();
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
_ws2812b.setPixelColor(i + j, colors[pass]);
|
||||||
|
}
|
||||||
|
_ws2812b.show();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ws2812b.clear();
|
||||||
|
_ws2812b.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LedStrip::launch_control(bool estado){
|
||||||
|
|
||||||
|
if (launch==estado) return;
|
||||||
|
|
||||||
|
launch=estado;
|
||||||
|
|
||||||
|
if(launch){
|
||||||
|
for(int i=0;i<NUM_PIXELS;i++){
|
||||||
|
_ws2812b.setPixelColor(i, _ws2812b.Color(255, 255, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
_ws2812b.show();
|
||||||
|
} else {
|
||||||
|
_ws2812b.clear();
|
||||||
|
_ws2812b.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
82
Pantalla/src/led_strip_fl.cpp
Normal file
82
Pantalla/src/led_strip_fl.cpp
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
// #include "../include/led_strip.hpp"
|
||||||
|
|
||||||
|
// void LedStrip::display_warning(int warning){
|
||||||
|
// if(warning == STOP_CAR_WARNING){
|
||||||
|
// for(int i = 0; i < NUM_PIXELS; i++){
|
||||||
|
// _leds[i] = CRGB::Red;
|
||||||
|
// }
|
||||||
|
// FastLED.show();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void LedStrip::set_rpm(int rpm){
|
||||||
|
// if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) {
|
||||||
|
// display_rpm(rpm);
|
||||||
|
// xSemaphoreGive(_mutex);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void LedStrip::display_rpm(int rpm){
|
||||||
|
// if (rpm > RPM_MAX) {
|
||||||
|
// for (int i = 0; i < NUM_PIXELS; i++) {
|
||||||
|
// _leds[i] = CRGB::Red;
|
||||||
|
// }
|
||||||
|
// FastLED.show();
|
||||||
|
// delay(50);
|
||||||
|
// for (int i = 0; i < NUM_PIXELS; i++) {
|
||||||
|
// _leds[i] = CRGB::Black;
|
||||||
|
// }
|
||||||
|
// FastLED.show();
|
||||||
|
// delay(50);
|
||||||
|
// } else {
|
||||||
|
// int numLeds = map(rpm, RPM_MIN, RPM_MAX, 0, NUM_PIXELS);
|
||||||
|
|
||||||
|
// for (int i = 0; i < NUM_PIXELS; i++) {
|
||||||
|
// if (i < numLeds) {
|
||||||
|
// if (i < NUM_PIXELS / 3) {
|
||||||
|
// _leds[i] = CRGB::Green;
|
||||||
|
// } else if (i < 2 * NUM_PIXELS / 3) {
|
||||||
|
// _leds[i] = CRGB::Yellow;
|
||||||
|
// } else {
|
||||||
|
// _leds[i] = CRGB::Red;
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// _leds[i] = CRGB::Black;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// FastLED.show();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void LedStrip::display_startup(){
|
||||||
|
// FastLED.setBrightness(255);
|
||||||
|
// CRGB colors[3] = { CRGB::Red, CRGB::Green, CRGB::Blue };
|
||||||
|
|
||||||
|
// for (int pass = 0; pass < 3; pass++) {
|
||||||
|
// for (int i = 0; i <= NUM_PIXELS - 4; i++) {
|
||||||
|
// fill_solid(_leds, NUM_PIXELS, CRGB::Black);
|
||||||
|
// FastLED.show();
|
||||||
|
// for (int j = 0; j < 4; j++) {
|
||||||
|
// _leds[i + j] = colors[pass];
|
||||||
|
// }
|
||||||
|
// FastLED.show();
|
||||||
|
// delay(10);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for (int i = NUM_PIXELS - 4; i >= 0; i--) {
|
||||||
|
// fill_solid(_leds, NUM_PIXELS, CRGB::Black);
|
||||||
|
// FastLED.show();
|
||||||
|
// for (int j = 0; j < 4; j++) {
|
||||||
|
// _leds[i + j] = colors[pass];
|
||||||
|
// }
|
||||||
|
// FastLED.show();
|
||||||
|
// delay(10);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// fill_solid(_leds, NUM_PIXELS, CRGB::Black);
|
||||||
|
// FastLED.show();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void LedStrip::update(){
|
||||||
|
// display_rpm(_rpm);
|
||||||
|
// }
|
||||||
23
Pantalla/src/ui/desktop.ini
Normal file
23
Pantalla/src/ui/desktop.ini
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
[LocalizedFileNames]
|
||||||
|
ui_img_logo_volante_png.c=@ui_img_logo_volante_png.c,0
|
||||||
|
ui_events.cpp=@ui_events.cpp,0
|
||||||
|
ui_helpers.c=@ui_helpers.c,0
|
||||||
|
ui_comp_hook.c=@ui_comp_hook.c,0
|
||||||
|
ui.c=@ui.c,0
|
||||||
|
ui_font_warmup.c=@ui_font_warmup.c,0
|
||||||
|
ui_font_speedlabel.c=@ui_font_speedlabel.c,0
|
||||||
|
ui_font_speed.c=@ui_font_speed.c,0
|
||||||
|
ui_font_rpm.c=@ui_font_rpm.c,0
|
||||||
|
ui_themes.cpp=@ui_themes.cpp,0
|
||||||
|
ui_Screen2.c=@ui_Screen2.c,0
|
||||||
|
ui_settingscreen.c=@ui_settingscreen.c,0
|
||||||
|
ui_Screen1.c=@ui_Screen1.c,0
|
||||||
|
ui_bootscreen.c=@ui_bootscreen.c,0
|
||||||
|
ui_theme_manager.cpp=@ui_theme_manager.cpp,0
|
||||||
|
ui_font_offon.c=@ui_font_offon.c,0
|
||||||
|
ui_font_neutral.c=@ui_font_neutral.c,0
|
||||||
|
ui_font_labelt.c=@ui_font_labelt.c,0
|
||||||
|
ui_font_labeld2.c=@ui_font_labeld2.c,0
|
||||||
|
ui_font_labeld.c=@ui_font_labeld.c,0
|
||||||
|
ui_font_ajustesnames.c=@ui_font_ajustesnames.c,0
|
||||||
|
ui_font_ajustes.c=@ui_font_ajustes.c,0
|
||||||
50
Pantalla/src/ui/ui.c
Normal file
50
Pantalla/src/ui/ui.c
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
#include "../../include/ui/ui_helpers.h"
|
||||||
|
|
||||||
|
///////////////////// VARIABLES ////////////////////
|
||||||
|
|
||||||
|
// EVENTS
|
||||||
|
lv_obj_t * ui____initial_actions0;
|
||||||
|
|
||||||
|
// IMAGES AND IMAGE SETS
|
||||||
|
|
||||||
|
///////////////////// TEST LVGL SETTINGS ////////////////////
|
||||||
|
#if LV_COLOR_DEPTH != 16
|
||||||
|
#error "LV_COLOR_DEPTH should be 16bit to match SquareLine Studio's settings"
|
||||||
|
#endif
|
||||||
|
#if LV_COLOR_16_SWAP !=0
|
||||||
|
#error "LV_COLOR_16_SWAP should be 0 to match SquareLine Studio's settings"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
///////////////////// ANIMATIONS ////////////////////
|
||||||
|
|
||||||
|
///////////////////// FUNCTIONS ////////////////////
|
||||||
|
|
||||||
|
///////////////////// SCREENS ////////////////////
|
||||||
|
|
||||||
|
void ui_init(void)
|
||||||
|
{
|
||||||
|
lv_disp_t * dispp = lv_disp_get_default();
|
||||||
|
lv_theme_t * theme = lv_theme_default_init(dispp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED),
|
||||||
|
false, LV_FONT_DEFAULT);
|
||||||
|
lv_disp_set_theme(dispp, theme);
|
||||||
|
ui_bootscreen_screen_init();
|
||||||
|
ui_Screen1_screen_init();
|
||||||
|
ui_settingscreen_screen_init();
|
||||||
|
ui_Screen2_screen_init();
|
||||||
|
ui____initial_actions0 = lv_obj_create(NULL);
|
||||||
|
lv_disp_load_scr(ui_bootscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_destroy(void)
|
||||||
|
{
|
||||||
|
ui_bootscreen_screen_destroy();
|
||||||
|
ui_Screen1_screen_destroy();
|
||||||
|
ui_settingscreen_screen_destroy();
|
||||||
|
ui_Screen2_screen_destroy();
|
||||||
|
}
|
||||||
1535
Pantalla/src/ui/ui_Screen1.c
Normal file
1535
Pantalla/src/ui/ui_Screen1.c
Normal file
File diff suppressed because it is too large
Load diff
932
Pantalla/src/ui/ui_Screen2.c
Normal file
932
Pantalla/src/ui/ui_Screen2.c
Normal file
|
|
@ -0,0 +1,932 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
|
||||||
|
lv_obj_t * ui_Screen2 = NULL;
|
||||||
|
lv_obj_t * ui_aux1panel = NULL;
|
||||||
|
lv_obj_t * ui_aux1name = NULL;
|
||||||
|
lv_obj_t * ui_aux1 = NULL;
|
||||||
|
lv_obj_t * ui_aux1separator = NULL;
|
||||||
|
lv_obj_t * ui_aux3panel = NULL;
|
||||||
|
lv_obj_t * ui_aux3name = NULL;
|
||||||
|
lv_obj_t * ui_aux3 = NULL;
|
||||||
|
lv_obj_t * ui_aux3separator = NULL;
|
||||||
|
lv_obj_t * ui_aux4panel = NULL;
|
||||||
|
lv_obj_t * ui_aux4name = NULL;
|
||||||
|
lv_obj_t * ui_aux4 = NULL;
|
||||||
|
lv_obj_t * ui_aux4separator = NULL;
|
||||||
|
lv_obj_t * ui_aux5panel = NULL;
|
||||||
|
lv_obj_t * ui_aux5name = NULL;
|
||||||
|
lv_obj_t * ui_aux5 = NULL;
|
||||||
|
lv_obj_t * ui_aux5separator = NULL;
|
||||||
|
lv_obj_t * ui_aux6panel = NULL;
|
||||||
|
lv_obj_t * ui_aux6name = NULL;
|
||||||
|
lv_obj_t * ui_aux6 = NULL;
|
||||||
|
lv_obj_t * ui_aux6separator = NULL;
|
||||||
|
lv_obj_t * ui_aux7panel = NULL;
|
||||||
|
lv_obj_t * ui_aux7name = NULL;
|
||||||
|
lv_obj_t * ui_aux7 = NULL;
|
||||||
|
lv_obj_t * ui_aux7separator = NULL;
|
||||||
|
lv_obj_t * ui_aux8panel = NULL;
|
||||||
|
lv_obj_t * ui_aux8name = NULL;
|
||||||
|
lv_obj_t * ui_aux8 = NULL;
|
||||||
|
lv_obj_t * ui_aux8separator = NULL;
|
||||||
|
lv_obj_t * ui_dig1panel = NULL;
|
||||||
|
lv_obj_t * ui_dig1name = NULL;
|
||||||
|
lv_obj_t * ui_dig1 = NULL;
|
||||||
|
lv_obj_t * ui_dig1separator = NULL;
|
||||||
|
lv_obj_t * ui_throttlepanel = NULL;
|
||||||
|
lv_obj_t * ui_throttlename = NULL;
|
||||||
|
lv_obj_t * ui_throttle = NULL;
|
||||||
|
lv_obj_t * ui_throttleseparator = NULL;
|
||||||
|
lv_obj_t * ui_nousepanel = NULL;
|
||||||
|
lv_obj_t * ui_nousename = NULL;
|
||||||
|
lv_obj_t * ui_nouse = NULL;
|
||||||
|
lv_obj_t * ui_nouseseparator = NULL;
|
||||||
|
lv_obj_t * ui_lambdtrgapanel = NULL;
|
||||||
|
lv_obj_t * ui_lambdatrgname = NULL;
|
||||||
|
lv_obj_t * ui_lambdatrg = NULL;
|
||||||
|
lv_obj_t * ui_lambdatrgseparator = NULL;
|
||||||
|
lv_obj_t * ui_mappanel = NULL;
|
||||||
|
lv_obj_t * ui_mapname = NULL;
|
||||||
|
lv_obj_t * ui_map = NULL;
|
||||||
|
lv_obj_t * ui_mapseparator = NULL;
|
||||||
|
lv_obj_t * ui_brakepanel = NULL;
|
||||||
|
lv_obj_t * ui_brakename = NULL;
|
||||||
|
lv_obj_t * ui_brake = NULL;
|
||||||
|
lv_obj_t * ui_brakeseparator = NULL;
|
||||||
|
lv_obj_t * ui_botonshowajustes2 = NULL;
|
||||||
|
lv_obj_t * ui_ajustesboton2 = NULL;
|
||||||
|
lv_obj_t * ui_ajustesnombre2 = NULL;
|
||||||
|
// event funtions
|
||||||
|
void ui_event_botonshowajustes2(lv_event_t * e)
|
||||||
|
{
|
||||||
|
lv_event_code_t event_code = lv_event_get_code(e);
|
||||||
|
|
||||||
|
if(event_code == LV_EVENT_LONG_PRESSED) {
|
||||||
|
_ui_flag_modify(ui_ajustesboton2, LV_OBJ_FLAG_HIDDEN, _UI_MODIFY_FLAG_REMOVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_event_ajustesboton2(lv_event_t * e)
|
||||||
|
{
|
||||||
|
lv_event_code_t event_code = lv_event_get_code(e);
|
||||||
|
|
||||||
|
if(event_code == LV_EVENT_CLICKED) {
|
||||||
|
_ui_screen_change(&ui_settingscreen, LV_SCR_LOAD_ANIM_NONE, 0, 0, &ui_settingscreen_screen_init);
|
||||||
|
_ui_flag_modify(ui_ajustesboton2, LV_OBJ_FLAG_HIDDEN, _UI_MODIFY_FLAG_ADD);
|
||||||
|
abrirajustes(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// build funtions
|
||||||
|
|
||||||
|
void ui_Screen2_screen_init(void)
|
||||||
|
{
|
||||||
|
ui_Screen2 = lv_obj_create(NULL);
|
||||||
|
lv_obj_clear_flag(ui_Screen2, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
ui_object_set_themeable_style_property(ui_Screen2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_Screen2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
|
||||||
|
ui_aux1panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux1panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux1panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux1panel, 160);
|
||||||
|
lv_obj_set_y(ui_aux1panel, -144);
|
||||||
|
lv_obj_set_align(ui_aux1panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux1panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux1panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux1panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux1panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux1name = lv_label_create(ui_aux1panel);
|
||||||
|
lv_obj_set_width(ui_aux1name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux1name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux1name, 0);
|
||||||
|
lv_obj_set_y(ui_aux1name, -30);
|
||||||
|
lv_obj_set_align(ui_aux1name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux1name, "AUX 1");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux1name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux1 = lv_label_create(ui_aux1panel);
|
||||||
|
lv_obj_set_width(ui_aux1, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux1, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux1, 0);
|
||||||
|
lv_obj_set_y(ui_aux1, 17);
|
||||||
|
lv_obj_set_align(ui_aux1, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux1, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux1, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux1separator = lv_obj_create(ui_aux1panel);
|
||||||
|
lv_obj_set_width(ui_aux1separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux1separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux1separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux1separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux1separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux1separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux1separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux1separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux1separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux1separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux3panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux3panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux3panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux3panel, 283);
|
||||||
|
lv_obj_set_y(ui_aux3panel, -144);
|
||||||
|
lv_obj_set_align(ui_aux3panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux3panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux3panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux3panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux3panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux3name = lv_label_create(ui_aux3panel);
|
||||||
|
lv_obj_set_width(ui_aux3name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux3name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux3name, 0);
|
||||||
|
lv_obj_set_y(ui_aux3name, -30);
|
||||||
|
lv_obj_set_align(ui_aux3name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux3name, "AUX 3");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux3name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux3 = lv_label_create(ui_aux3panel);
|
||||||
|
lv_obj_set_width(ui_aux3, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux3, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux3, 0);
|
||||||
|
lv_obj_set_y(ui_aux3, 17);
|
||||||
|
lv_obj_set_align(ui_aux3, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux3, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux3, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux3separator = lv_obj_create(ui_aux3panel);
|
||||||
|
lv_obj_set_width(ui_aux3separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux3separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux3separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux3separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux3separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux3separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux3separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux3separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux3separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux3separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux4panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux4panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux4panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux4panel, 160);
|
||||||
|
lv_obj_set_y(ui_aux4panel, -46);
|
||||||
|
lv_obj_set_align(ui_aux4panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux4panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux4panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux4panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux4panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux4name = lv_label_create(ui_aux4panel);
|
||||||
|
lv_obj_set_width(ui_aux4name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux4name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux4name, 0);
|
||||||
|
lv_obj_set_y(ui_aux4name, -30);
|
||||||
|
lv_obj_set_align(ui_aux4name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux4name, "AUX 4");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux4name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux4 = lv_label_create(ui_aux4panel);
|
||||||
|
lv_obj_set_width(ui_aux4, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux4, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux4, 0);
|
||||||
|
lv_obj_set_y(ui_aux4, 17);
|
||||||
|
lv_obj_set_align(ui_aux4, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux4, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux4, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux4separator = lv_obj_create(ui_aux4panel);
|
||||||
|
lv_obj_set_width(ui_aux4separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux4separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux4separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux4separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux4separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux4separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux4separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux4separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux4separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux4separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux5panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux5panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux5panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux5panel, 283);
|
||||||
|
lv_obj_set_y(ui_aux5panel, -46);
|
||||||
|
lv_obj_set_align(ui_aux5panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux5panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux5panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux5panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux5panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux5name = lv_label_create(ui_aux5panel);
|
||||||
|
lv_obj_set_width(ui_aux5name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux5name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux5name, 0);
|
||||||
|
lv_obj_set_y(ui_aux5name, -30);
|
||||||
|
lv_obj_set_align(ui_aux5name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux5name, "AUX 5");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux5name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux5 = lv_label_create(ui_aux5panel);
|
||||||
|
lv_obj_set_width(ui_aux5, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux5, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux5, 0);
|
||||||
|
lv_obj_set_y(ui_aux5, 17);
|
||||||
|
lv_obj_set_align(ui_aux5, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux5, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux5, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux5separator = lv_obj_create(ui_aux5panel);
|
||||||
|
lv_obj_set_width(ui_aux5separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux5separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux5separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux5separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux5separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux5separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux5separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux5separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux5separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux5separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux6panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux6panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux6panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux6panel, 160);
|
||||||
|
lv_obj_set_y(ui_aux6panel, 51);
|
||||||
|
lv_obj_set_align(ui_aux6panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux6panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux6panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux6panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux6panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux6name = lv_label_create(ui_aux6panel);
|
||||||
|
lv_obj_set_width(ui_aux6name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux6name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux6name, 0);
|
||||||
|
lv_obj_set_y(ui_aux6name, -30);
|
||||||
|
lv_obj_set_align(ui_aux6name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux6name, "AUX 6");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux6name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux6 = lv_label_create(ui_aux6panel);
|
||||||
|
lv_obj_set_width(ui_aux6, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux6, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux6, 0);
|
||||||
|
lv_obj_set_y(ui_aux6, 17);
|
||||||
|
lv_obj_set_align(ui_aux6, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux6, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux6, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux6separator = lv_obj_create(ui_aux6panel);
|
||||||
|
lv_obj_set_width(ui_aux6separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux6separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux6separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux6separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux6separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux6separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux6separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux6separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux6separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux6separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux7panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux7panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux7panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux7panel, 283);
|
||||||
|
lv_obj_set_y(ui_aux7panel, 51);
|
||||||
|
lv_obj_set_align(ui_aux7panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux7panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux7panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux7panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux7panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux7name = lv_label_create(ui_aux7panel);
|
||||||
|
lv_obj_set_width(ui_aux7name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux7name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux7name, 0);
|
||||||
|
lv_obj_set_y(ui_aux7name, -30);
|
||||||
|
lv_obj_set_align(ui_aux7name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux7name, "AUX 7");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux7name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux7 = lv_label_create(ui_aux7panel);
|
||||||
|
lv_obj_set_width(ui_aux7, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux7, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux7, 0);
|
||||||
|
lv_obj_set_y(ui_aux7, 17);
|
||||||
|
lv_obj_set_align(ui_aux7, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux7, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux7, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux7separator = lv_obj_create(ui_aux7panel);
|
||||||
|
lv_obj_set_width(ui_aux7separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux7separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux7separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux7separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux7separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux7separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux7separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux7separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux7separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux7separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux8panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_aux8panel, 125);
|
||||||
|
lv_obj_set_height(ui_aux8panel, 100);
|
||||||
|
lv_obj_set_x(ui_aux8panel, 160);
|
||||||
|
lv_obj_set_y(ui_aux8panel, 149);
|
||||||
|
lv_obj_set_align(ui_aux8panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux8panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux8panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux8panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux8panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_aux8name = lv_label_create(ui_aux8panel);
|
||||||
|
lv_obj_set_width(ui_aux8name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux8name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux8name, 0);
|
||||||
|
lv_obj_set_y(ui_aux8name, -30);
|
||||||
|
lv_obj_set_align(ui_aux8name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux8name, "AUX 8");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux8name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux8 = lv_label_create(ui_aux8panel);
|
||||||
|
lv_obj_set_width(ui_aux8, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_aux8, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_aux8, 0);
|
||||||
|
lv_obj_set_y(ui_aux8, 17);
|
||||||
|
lv_obj_set_align(ui_aux8, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_aux8, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_aux8, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_aux8separator = lv_obj_create(ui_aux8panel);
|
||||||
|
lv_obj_set_width(ui_aux8separator, 70);
|
||||||
|
lv_obj_set_height(ui_aux8separator, 1);
|
||||||
|
lv_obj_set_x(ui_aux8separator, 0);
|
||||||
|
lv_obj_set_y(ui_aux8separator, -14);
|
||||||
|
lv_obj_set_align(ui_aux8separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_aux8separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_aux8separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_aux8separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_aux8separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_aux8separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_dig1panel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_dig1panel, 125);
|
||||||
|
lv_obj_set_height(ui_dig1panel, 100);
|
||||||
|
lv_obj_set_x(ui_dig1panel, 283);
|
||||||
|
lv_obj_set_y(ui_dig1panel, 149);
|
||||||
|
lv_obj_set_align(ui_dig1panel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_dig1panel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_dig1panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_dig1panel, lv_color_hex(0x9E3D3D), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_dig1panel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1panel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_dig1name = lv_label_create(ui_dig1panel);
|
||||||
|
lv_obj_set_width(ui_dig1name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_dig1name, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_dig1name, 0);
|
||||||
|
lv_obj_set_y(ui_dig1name, -30);
|
||||||
|
lv_obj_set_align(ui_dig1name, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_dig1name, "DIG 1");
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1name, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_dig1name, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_dig1 = lv_label_create(ui_dig1panel);
|
||||||
|
lv_obj_set_width(ui_dig1, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_dig1, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_dig1, 0);
|
||||||
|
lv_obj_set_y(ui_dig1, 17);
|
||||||
|
lv_obj_set_align(ui_dig1, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_dig1, "OFF");
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_dig1, &ui_font_offon, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_dig1separator = lv_obj_create(ui_dig1panel);
|
||||||
|
lv_obj_set_width(ui_dig1separator, 70);
|
||||||
|
lv_obj_set_height(ui_dig1separator, 1);
|
||||||
|
lv_obj_set_x(ui_dig1separator, 0);
|
||||||
|
lv_obj_set_y(ui_dig1separator, -14);
|
||||||
|
lv_obj_set_align(ui_dig1separator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_dig1separator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_dig1separator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_color(ui_dig1separator, lv_color_hex(0x232323), LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_bg_opa(ui_dig1separator, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_dig1separator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_throttlepanel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_throttlepanel, 250);
|
||||||
|
lv_obj_set_height(ui_throttlepanel, 100);
|
||||||
|
lv_obj_set_x(ui_throttlepanel, -240);
|
||||||
|
lv_obj_set_y(ui_throttlepanel, -144);
|
||||||
|
lv_obj_set_align(ui_throttlepanel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_throttlepanel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_throttlepanel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttlepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttlepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttlepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttlepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_throttlename = lv_label_create(ui_throttlepanel);
|
||||||
|
lv_obj_set_width(ui_throttlename, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_throttlename, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_throttlename, 0);
|
||||||
|
lv_obj_set_y(ui_throttlename, -32);
|
||||||
|
lv_obj_set_align(ui_throttlename, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_throttlename, "THROTTLE");
|
||||||
|
ui_object_set_themeable_style_property(ui_throttlename, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttlename, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_throttlename, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_throttle = lv_label_create(ui_throttlepanel);
|
||||||
|
lv_obj_set_width(ui_throttle, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_throttle, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_throttle, 0);
|
||||||
|
lv_obj_set_y(ui_throttle, 17);
|
||||||
|
lv_obj_set_align(ui_throttle, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_throttle, "-");
|
||||||
|
ui_object_set_themeable_style_property(ui_throttle, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttle, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_throttle, &ui_font_labeld2, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_throttleseparator = lv_obj_create(ui_throttlepanel);
|
||||||
|
lv_obj_set_width(ui_throttleseparator, 120);
|
||||||
|
lv_obj_set_height(ui_throttleseparator, 1);
|
||||||
|
lv_obj_set_x(ui_throttleseparator, 2);
|
||||||
|
lv_obj_set_y(ui_throttleseparator, -18);
|
||||||
|
lv_obj_set_align(ui_throttleseparator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_throttleseparator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_throttleseparator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttleseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_throttleseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_nousepanel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_nousepanel, 250);
|
||||||
|
lv_obj_set_height(ui_nousepanel, 100);
|
||||||
|
lv_obj_set_x(ui_nousepanel, -240);
|
||||||
|
lv_obj_set_y(ui_nousepanel, -46);
|
||||||
|
lv_obj_set_align(ui_nousepanel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_nousepanel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_nousepanel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_nousepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_nousepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_nousepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_nousepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_nousename = lv_label_create(ui_nousepanel);
|
||||||
|
lv_obj_set_width(ui_nousename, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_nousename, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_nousename, 0);
|
||||||
|
lv_obj_set_y(ui_nousename, -32);
|
||||||
|
lv_obj_set_align(ui_nousename, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_nousename, "-");
|
||||||
|
ui_object_set_themeable_style_property(ui_nousename, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_nousename, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_nousename, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_nouse = lv_label_create(ui_nousepanel);
|
||||||
|
lv_obj_set_width(ui_nouse, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_nouse, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_nouse, 0);
|
||||||
|
lv_obj_set_y(ui_nouse, 17);
|
||||||
|
lv_obj_set_align(ui_nouse, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_nouse, "-");
|
||||||
|
ui_object_set_themeable_style_property(ui_nouse, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_nouse, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_nouse, &ui_font_labeld2, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_nouseseparator = lv_obj_create(ui_nousepanel);
|
||||||
|
lv_obj_set_width(ui_nouseseparator, 120);
|
||||||
|
lv_obj_set_height(ui_nouseseparator, 1);
|
||||||
|
lv_obj_set_x(ui_nouseseparator, 2);
|
||||||
|
lv_obj_set_y(ui_nouseseparator, -18);
|
||||||
|
lv_obj_set_align(ui_nouseseparator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_nouseseparator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_nouseseparator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_nouseseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_nouseseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_lambdtrgapanel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_lambdtrgapanel, 250);
|
||||||
|
lv_obj_set_height(ui_lambdtrgapanel, 100);
|
||||||
|
lv_obj_set_x(ui_lambdtrgapanel, -240);
|
||||||
|
lv_obj_set_y(ui_lambdtrgapanel, 52);
|
||||||
|
lv_obj_set_align(ui_lambdtrgapanel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_lambdtrgapanel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_lambdtrgapanel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdtrgapanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdtrgapanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdtrgapanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdtrgapanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_lambdatrgname = lv_label_create(ui_lambdtrgapanel);
|
||||||
|
lv_obj_set_width(ui_lambdatrgname, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_lambdatrgname, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_lambdatrgname, 0);
|
||||||
|
lv_obj_set_y(ui_lambdatrgname, -32);
|
||||||
|
lv_obj_set_align(ui_lambdatrgname, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_lambdatrgname, "LAMBDA TARGET");
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdatrgname, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdatrgname, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_lambdatrgname, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_lambdatrg = lv_label_create(ui_lambdtrgapanel);
|
||||||
|
lv_obj_set_width(ui_lambdatrg, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_lambdatrg, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_lambdatrg, 0);
|
||||||
|
lv_obj_set_y(ui_lambdatrg, 17);
|
||||||
|
lv_obj_set_align(ui_lambdatrg, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_lambdatrg, "-");
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdatrg, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdatrg, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_lambdatrg, &ui_font_labeld2, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_lambdatrgseparator = lv_obj_create(ui_lambdtrgapanel);
|
||||||
|
lv_obj_set_width(ui_lambdatrgseparator, 120);
|
||||||
|
lv_obj_set_height(ui_lambdatrgseparator, 1);
|
||||||
|
lv_obj_set_x(ui_lambdatrgseparator, 2);
|
||||||
|
lv_obj_set_y(ui_lambdatrgseparator, -18);
|
||||||
|
lv_obj_set_align(ui_lambdatrgseparator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_lambdatrgseparator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_lambdatrgseparator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdatrgseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_lambdatrgseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_mappanel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_mappanel, 218);
|
||||||
|
lv_obj_set_height(ui_mappanel, 100);
|
||||||
|
lv_obj_set_x(ui_mappanel, -8);
|
||||||
|
lv_obj_set_y(ui_mappanel, -144);
|
||||||
|
lv_obj_set_align(ui_mappanel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_mappanel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_mappanel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_mappanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_mappanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_mappanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_mappanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_mapname = lv_label_create(ui_mappanel);
|
||||||
|
lv_obj_set_width(ui_mapname, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_mapname, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_mapname, 0);
|
||||||
|
lv_obj_set_y(ui_mapname, -32);
|
||||||
|
lv_obj_set_align(ui_mapname, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_mapname, "MAP");
|
||||||
|
ui_object_set_themeable_style_property(ui_mapname, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_mapname, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_mapname, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_map = lv_label_create(ui_mappanel);
|
||||||
|
lv_obj_set_width(ui_map, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_map, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_map, 0);
|
||||||
|
lv_obj_set_y(ui_map, 17);
|
||||||
|
lv_obj_set_align(ui_map, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_map, "-");
|
||||||
|
ui_object_set_themeable_style_property(ui_map, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_map, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_map, &ui_font_labeld2, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_mapseparator = lv_obj_create(ui_mappanel);
|
||||||
|
lv_obj_set_width(ui_mapseparator, 120);
|
||||||
|
lv_obj_set_height(ui_mapseparator, 1);
|
||||||
|
lv_obj_set_x(ui_mapseparator, 2);
|
||||||
|
lv_obj_set_y(ui_mapseparator, -18);
|
||||||
|
lv_obj_set_align(ui_mapseparator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_mapseparator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_mapseparator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_mapseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_mapseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_brakepanel = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_brakepanel, 250);
|
||||||
|
lv_obj_set_height(ui_brakepanel, 100);
|
||||||
|
lv_obj_set_x(ui_brakepanel, -240);
|
||||||
|
lv_obj_set_y(ui_brakepanel, 149);
|
||||||
|
lv_obj_set_align(ui_brakepanel, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_brakepanel, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_brakepanel, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakepanel, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_brakename = lv_label_create(ui_brakepanel);
|
||||||
|
lv_obj_set_width(ui_brakename, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_brakename, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_brakename, 0);
|
||||||
|
lv_obj_set_y(ui_brakename, -32);
|
||||||
|
lv_obj_set_align(ui_brakename, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_brakename, "BRAKE");
|
||||||
|
ui_object_set_themeable_style_property(ui_brakename, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakename, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_brakename, &ui_font_labelt, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_brake = lv_label_create(ui_brakepanel);
|
||||||
|
lv_obj_set_width(ui_brake, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_brake, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_x(ui_brake, 0);
|
||||||
|
lv_obj_set_y(ui_brake, 17);
|
||||||
|
lv_obj_set_align(ui_brake, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_brake, "-");
|
||||||
|
ui_object_set_themeable_style_property(ui_brake, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_brake, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_brake, &ui_font_labeld2, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_brakeseparator = lv_obj_create(ui_brakepanel);
|
||||||
|
lv_obj_set_width(ui_brakeseparator, 120);
|
||||||
|
lv_obj_set_height(ui_brakeseparator, 1);
|
||||||
|
lv_obj_set_x(ui_brakeseparator, 2);
|
||||||
|
lv_obj_set_y(ui_brakeseparator, -18);
|
||||||
|
lv_obj_set_align(ui_brakeseparator, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_clear_flag(ui_brakeseparator, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_brakeseparator, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakeseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_brakeseparator, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
|
||||||
|
ui_botonshowajustes2 = lv_btn_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_botonshowajustes2, 800);
|
||||||
|
lv_obj_set_height(ui_botonshowajustes2, 480);
|
||||||
|
lv_obj_set_x(ui_botonshowajustes2, 1);
|
||||||
|
lv_obj_set_y(ui_botonshowajustes2, 0);
|
||||||
|
lv_obj_set_align(ui_botonshowajustes2, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_add_flag(ui_botonshowajustes2, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags
|
||||||
|
lv_obj_clear_flag(ui_botonshowajustes2, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_botonshowajustes2, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_opa(ui_botonshowajustes2, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_ajustesboton2 = lv_obj_create(ui_Screen2);
|
||||||
|
lv_obj_set_width(ui_ajustesboton2, 150);
|
||||||
|
lv_obj_set_height(ui_ajustesboton2, 70);
|
||||||
|
lv_obj_set_x(ui_ajustesboton2, 303);
|
||||||
|
lv_obj_set_y(ui_ajustesboton2, -190);
|
||||||
|
lv_obj_set_align(ui_ajustesboton2, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_add_flag(ui_ajustesboton2, LV_OBJ_FLAG_HIDDEN); /// Flags
|
||||||
|
lv_obj_clear_flag(ui_ajustesboton2, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
lv_obj_set_style_radius(ui_ajustesboton2, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
ui_object_set_themeable_style_property(ui_ajustesboton2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_ajustesboton2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_ajustesboton2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_ajustesboton2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_border_width(ui_ajustesboton2, 4, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
ui_ajustesnombre2 = lv_label_create(ui_ajustesboton2);
|
||||||
|
lv_obj_set_width(ui_ajustesnombre2, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_height(ui_ajustesnombre2, LV_SIZE_CONTENT); /// 1
|
||||||
|
lv_obj_set_align(ui_ajustesnombre2, LV_ALIGN_CENTER);
|
||||||
|
lv_label_set_text(ui_ajustesnombre2, "Ajustes");
|
||||||
|
ui_object_set_themeable_style_property(ui_ajustesnombre2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_COLOR,
|
||||||
|
_ui_theme_color_texto);
|
||||||
|
ui_object_set_themeable_style_property(ui_ajustesnombre2, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_TEXT_OPA,
|
||||||
|
_ui_theme_alpha_texto);
|
||||||
|
lv_obj_set_style_text_font(ui_ajustesnombre2, &ui_font_ajustesnames, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
lv_obj_add_event_cb(ui_botonshowajustes2, ui_event_botonshowajustes2, LV_EVENT_ALL, NULL);
|
||||||
|
lv_obj_add_event_cb(ui_ajustesboton2, ui_event_ajustesboton2, LV_EVENT_ALL, NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_Screen2_screen_destroy(void)
|
||||||
|
{
|
||||||
|
if(ui_Screen2) lv_obj_del(ui_Screen2);
|
||||||
|
|
||||||
|
// NULL screen variables
|
||||||
|
ui_Screen2 = NULL;
|
||||||
|
ui_aux1panel = NULL;
|
||||||
|
ui_aux1name = NULL;
|
||||||
|
ui_aux1 = NULL;
|
||||||
|
ui_aux1separator = NULL;
|
||||||
|
ui_aux3panel = NULL;
|
||||||
|
ui_aux3name = NULL;
|
||||||
|
ui_aux3 = NULL;
|
||||||
|
ui_aux3separator = NULL;
|
||||||
|
ui_aux4panel = NULL;
|
||||||
|
ui_aux4name = NULL;
|
||||||
|
ui_aux4 = NULL;
|
||||||
|
ui_aux4separator = NULL;
|
||||||
|
ui_aux5panel = NULL;
|
||||||
|
ui_aux5name = NULL;
|
||||||
|
ui_aux5 = NULL;
|
||||||
|
ui_aux5separator = NULL;
|
||||||
|
ui_aux6panel = NULL;
|
||||||
|
ui_aux6name = NULL;
|
||||||
|
ui_aux6 = NULL;
|
||||||
|
ui_aux6separator = NULL;
|
||||||
|
ui_aux7panel = NULL;
|
||||||
|
ui_aux7name = NULL;
|
||||||
|
ui_aux7 = NULL;
|
||||||
|
ui_aux7separator = NULL;
|
||||||
|
ui_aux8panel = NULL;
|
||||||
|
ui_aux8name = NULL;
|
||||||
|
ui_aux8 = NULL;
|
||||||
|
ui_aux8separator = NULL;
|
||||||
|
ui_dig1panel = NULL;
|
||||||
|
ui_dig1name = NULL;
|
||||||
|
ui_dig1 = NULL;
|
||||||
|
ui_dig1separator = NULL;
|
||||||
|
ui_throttlepanel = NULL;
|
||||||
|
ui_throttlename = NULL;
|
||||||
|
ui_throttle = NULL;
|
||||||
|
ui_throttleseparator = NULL;
|
||||||
|
ui_nousepanel = NULL;
|
||||||
|
ui_nousename = NULL;
|
||||||
|
ui_nouse = NULL;
|
||||||
|
ui_nouseseparator = NULL;
|
||||||
|
ui_lambdtrgapanel = NULL;
|
||||||
|
ui_lambdatrgname = NULL;
|
||||||
|
ui_lambdatrg = NULL;
|
||||||
|
ui_lambdatrgseparator = NULL;
|
||||||
|
ui_mappanel = NULL;
|
||||||
|
ui_mapname = NULL;
|
||||||
|
ui_map = NULL;
|
||||||
|
ui_mapseparator = NULL;
|
||||||
|
ui_brakepanel = NULL;
|
||||||
|
ui_brakename = NULL;
|
||||||
|
ui_brake = NULL;
|
||||||
|
ui_brakeseparator = NULL;
|
||||||
|
ui_botonshowajustes2 = NULL;
|
||||||
|
ui_ajustesboton2 = NULL;
|
||||||
|
ui_ajustesnombre2 = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
41
Pantalla/src/ui/ui_bootscreen.c
Normal file
41
Pantalla/src/ui/ui_bootscreen.c
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
|
||||||
|
lv_obj_t * ui_bootscreen = NULL;
|
||||||
|
lv_obj_t * ui_logoboot = NULL;
|
||||||
|
// event funtions
|
||||||
|
|
||||||
|
// build funtions
|
||||||
|
|
||||||
|
void ui_bootscreen_screen_init(void)
|
||||||
|
{
|
||||||
|
ui_bootscreen = lv_obj_create(NULL);
|
||||||
|
lv_obj_clear_flag(ui_bootscreen, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
ui_object_set_themeable_style_property(ui_bootscreen, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_COLOR,
|
||||||
|
_ui_theme_color_fondo);
|
||||||
|
ui_object_set_themeable_style_property(ui_bootscreen, LV_PART_MAIN | LV_STATE_DEFAULT, LV_STYLE_BG_OPA,
|
||||||
|
_ui_theme_alpha_fondo);
|
||||||
|
|
||||||
|
ui_logoboot = lv_img_create(ui_bootscreen);
|
||||||
|
lv_img_set_src(ui_logoboot, &ui_img_logo_volante_png);
|
||||||
|
lv_obj_set_width(ui_logoboot, LV_SIZE_CONTENT); /// 660
|
||||||
|
lv_obj_set_height(ui_logoboot, LV_SIZE_CONTENT); /// 161
|
||||||
|
lv_obj_set_align(ui_logoboot, LV_ALIGN_CENTER);
|
||||||
|
lv_obj_add_flag(ui_logoboot, LV_OBJ_FLAG_ADV_HITTEST); /// Flags
|
||||||
|
lv_obj_clear_flag(ui_logoboot, LV_OBJ_FLAG_SCROLLABLE); /// Flags
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_bootscreen_screen_destroy(void)
|
||||||
|
{
|
||||||
|
if(ui_bootscreen) lv_obj_del(ui_bootscreen);
|
||||||
|
|
||||||
|
// NULL screen variables
|
||||||
|
ui_bootscreen = NULL;
|
||||||
|
ui_logoboot = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
5
Pantalla/src/ui/ui_comp_hook.c
Normal file
5
Pantalla/src/ui/ui_comp_hook.c
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
837
Pantalla/src/ui/ui_events.cpp
Normal file
837
Pantalla/src/ui/ui_events.cpp
Normal file
|
|
@ -0,0 +1,837 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
#include "../../include/ajustes.hpp"
|
||||||
|
#include "../../include/crowpanel_controller.hpp"
|
||||||
|
#include "../../include/data_processor.hpp"
|
||||||
|
#include "../../include/can.hpp"
|
||||||
|
|
||||||
|
extern CAN canController;
|
||||||
|
|
||||||
|
static int rpm=8000;
|
||||||
|
static int desp=0;
|
||||||
|
static bool modo_oscuro=true;
|
||||||
|
static int pantalla=0;
|
||||||
|
static int rpm_display=0;
|
||||||
|
static int diff_rpm=1200;
|
||||||
|
static int recepcion_datos=0;
|
||||||
|
|
||||||
|
static float vbatt_too_high=15.0;
|
||||||
|
static float vbatt_high=14.5;
|
||||||
|
static float vbatt_low=12.5;
|
||||||
|
|
||||||
|
static int water_hot=110;
|
||||||
|
static int water_mild=100;
|
||||||
|
static int water_cold=70;
|
||||||
|
|
||||||
|
static int oil_hot=110;
|
||||||
|
static int oil_mild=100;
|
||||||
|
static int oil_cold=70;
|
||||||
|
|
||||||
|
static float oil_pressure_too_high=4.0;
|
||||||
|
static float oil_pressure_high=3.0;
|
||||||
|
static float oil_pressure_low=1.0;
|
||||||
|
|
||||||
|
static float fuel_pressure_too_high=15.0;
|
||||||
|
static float fuel_pressure_high=12.0;
|
||||||
|
static float fuel_pressure_low=3.0;
|
||||||
|
|
||||||
|
void refresh_ui_values();
|
||||||
|
|
||||||
|
void set(){
|
||||||
|
rpm=get_rpm();
|
||||||
|
desp=get_desplazamiento();
|
||||||
|
modo_oscuro=get_modo_oscuro();
|
||||||
|
pantalla=get_pantalla();
|
||||||
|
rpm_display=get_rpm_display();
|
||||||
|
diff_rpm=get_diff_rpm();
|
||||||
|
recepcion_datos=get_recepcion_datos();
|
||||||
|
|
||||||
|
vbatt_too_high=get_vbatt_too_high();
|
||||||
|
vbatt_high=get_vbatt_high();
|
||||||
|
vbatt_low=get_vbatt_low();
|
||||||
|
|
||||||
|
water_hot=get_water_hot();
|
||||||
|
water_mild=get_water_mild();
|
||||||
|
water_cold=get_water_cold();
|
||||||
|
|
||||||
|
oil_hot=get_oil_hot();
|
||||||
|
oil_mild=get_oil_mild();
|
||||||
|
oil_cold=get_oil_cold();
|
||||||
|
|
||||||
|
oil_pressure_too_high=get_oil_pressure_too_high();
|
||||||
|
oil_pressure_high=get_oil_pressure_high();
|
||||||
|
oil_pressure_low=get_oil_pressure_low();
|
||||||
|
|
||||||
|
fuel_pressure_too_high=get_fuel_pressure_too_high();
|
||||||
|
fuel_pressure_high=get_fuel_pressure_high();
|
||||||
|
fuel_pressure_low=get_fuel_pressure_low();
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_all(){
|
||||||
|
update(
|
||||||
|
rpm,
|
||||||
|
desp,
|
||||||
|
modo_oscuro,
|
||||||
|
pantalla,
|
||||||
|
rpm_display,
|
||||||
|
diff_rpm,
|
||||||
|
recepcion_datos,
|
||||||
|
vbatt_too_high,
|
||||||
|
vbatt_high,
|
||||||
|
vbatt_low,
|
||||||
|
water_hot,
|
||||||
|
water_mild,
|
||||||
|
water_cold,
|
||||||
|
oil_hot,
|
||||||
|
oil_mild,
|
||||||
|
oil_cold,
|
||||||
|
oil_pressure_too_high,
|
||||||
|
oil_pressure_high,
|
||||||
|
oil_pressure_low,
|
||||||
|
fuel_pressure_too_high,
|
||||||
|
fuel_pressure_high,
|
||||||
|
fuel_pressure_low
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void abrirajustes(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
refresh_ui_values();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cerrarajustes(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
save();
|
||||||
|
DataProcessor::set_dataprocessor();
|
||||||
|
CrowPanelController::create_rpm_bar(((rpm/1000)*1000), desp);
|
||||||
|
lv_scr_load(ui_Screen1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void opcionesdrop(lv_event_t * e)
|
||||||
|
{
|
||||||
|
lv_obj_t * obj=lv_event_get_target(e);
|
||||||
|
int opcion=lv_dropdown_get_selected(obj);
|
||||||
|
|
||||||
|
lv_obj_add_flag(ui_settingsmain, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsrpm, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsvbatt, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingswatert, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsoilt, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsoilp, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsfuelp, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
|
||||||
|
switch(opcion){
|
||||||
|
case 0:
|
||||||
|
lv_obj_clear_flag(ui_settingsmain, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
lv_obj_clear_flag(ui_settingsrpm, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
lv_obj_clear_flag(ui_settingsvbatt, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
lv_obj_clear_flag(ui_settingswatert, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
lv_obj_clear_flag(ui_settingsoilt, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
lv_obj_clear_flag(ui_settingsoilp, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
lv_obj_clear_flag(ui_settingsfuelp, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void themesitch(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
lv_obj_t * obj=lv_event_get_target(e);
|
||||||
|
|
||||||
|
if(lv_obj_has_state(obj, LV_STATE_CHECKED)){
|
||||||
|
modo_oscuro=true;
|
||||||
|
ui_theme_set(1);
|
||||||
|
} else {
|
||||||
|
modo_oscuro=false;
|
||||||
|
ui_theme_set(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cambiarpantalla(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
lv_obj_t * obj=lv_event_get_target(e);
|
||||||
|
|
||||||
|
pantalla=0;
|
||||||
|
if(lv_dropdown_get_selected(obj)==0){
|
||||||
|
lv_scr_load(ui_Screen1);
|
||||||
|
} else {
|
||||||
|
lv_scr_load(ui_Screen2);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cambiardatos(lv_event_t * e)
|
||||||
|
{
|
||||||
|
lv_obj_t * obj=lv_event_get_target(e);
|
||||||
|
recepcion_datos=lv_dropdown_get_selected(obj);
|
||||||
|
|
||||||
|
if(recepcion_datos==0){
|
||||||
|
canController.stop_iracing_task();
|
||||||
|
canController.clear_rx_queue();
|
||||||
|
canController.start_listening_task();
|
||||||
|
} else {
|
||||||
|
canController.stop_listening_task();
|
||||||
|
canController.start_iracing_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessrpm_(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(rpm<=5000){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
rpm=modify_value(rpm, -50);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_rpmfinalvalue, rpm);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morerpm_(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(rpm>=14000){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
rpm=modify_value(rpm, 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_rpmfinalvalue, rpm);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessdesp(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(desp<=-45){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
desp=modify_value(desp, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_desplazamientovalue, desp);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moredesp(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(desp>=15){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
desp=modify_value(desp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_desplazamientovalue, desp);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void rpmdisplay(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
lv_obj_t * obj=lv_event_get_target(e);
|
||||||
|
|
||||||
|
lv_obj_add_flag(ui_barcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_tiraledsrpmcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
|
||||||
|
if(lv_dropdown_get_selected(obj)==0){
|
||||||
|
lv_obj_clear_flag(ui_barcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
rpm_display=0; // Barra
|
||||||
|
} else if (lv_dropdown_get_selected(obj)==1) {
|
||||||
|
lv_obj_clear_flag(ui_tiraledsrpmcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
rpm_display=1; // Leds
|
||||||
|
} else if (lv_dropdown_get_selected(obj)==2){
|
||||||
|
lv_obj_clear_flag(ui_barcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
rpm_display=2; // Barra lineal
|
||||||
|
} else {
|
||||||
|
lv_obj_clear_flag(ui_tiraledsrpmcontainer, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
rpm_display=3; // Leds lineal
|
||||||
|
}
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessdiffrpm(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(diff_rpm<=0){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
diff_rpm=modify_value(diff_rpm, -100);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_diffrpmvalue, diff_rpm);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morediffrpm(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
diff_rpm=modify_value(diff_rpm, 100);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_diffrpmvalue, diff_rpm);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessvbatttoohigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(vbatt_too_high, -0.1f);
|
||||||
|
|
||||||
|
if(nuevo<=vbatt_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
vbatt_too_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbatttoohighvalue, vbatt_too_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morevbatttoohigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
vbatt_too_high=modify_value(vbatt_too_high, 0.1f);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbatttoohighvalue, vbatt_too_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessvbatthigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(vbatt_high, -0.1f);
|
||||||
|
|
||||||
|
if(nuevo<=vbatt_low){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
vbatt_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbatthighvalue, vbatt_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morebvbatthigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(vbatt_high, 0.1f);
|
||||||
|
|
||||||
|
if(nuevo>=vbatt_too_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
vbatt_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbatthighvalue, vbatt_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessvbattlow(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(vbatt_low<=0){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
vbatt_low=modify_value(vbatt_low, -0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbattlowvalue, vbatt_low);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morevbattlow(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(vbatt_low, 0.1f);
|
||||||
|
|
||||||
|
if(nuevo>=vbatt_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
vbatt_low=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbattlowvalue, vbatt_low);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lesswaterhot(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(water_hot, -1);
|
||||||
|
|
||||||
|
if(nuevo<=water_mild){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
water_hot=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_waterhotvalue, water_hot);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void mroewaterhot(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
water_hot=modify_value(water_hot, 1);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_waterhotvalue, water_hot);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lesswatermild(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(water_mild, -1);
|
||||||
|
|
||||||
|
if(nuevo<=water_cold){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
water_mild=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_watermidvalue, water_mild);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morewatermild(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(water_mild, 1);
|
||||||
|
|
||||||
|
if(nuevo>=water_hot){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
water_mild=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_watermidvalue, water_mild);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lesswatercold(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(water_cold<=0){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
water_cold=modify_value(water_cold, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_watercoldvalue, water_cold);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morewatercold(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(water_cold, 1);
|
||||||
|
|
||||||
|
if(nuevo>=water_mild){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
water_cold=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_watercoldvalue, water_cold);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessoilhot(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(oil_hot, -1);
|
||||||
|
|
||||||
|
if(nuevo<=oil_mild){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_hot=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilhotvalue, oil_hot);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moreoilhot(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
oil_hot=modify_value(oil_hot, 1);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilhotvalue, oil_hot);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessoilmild(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(oil_mild, -1);
|
||||||
|
|
||||||
|
if(nuevo<=oil_cold){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_mild=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilmildvalue, oil_mild);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moreoilmild(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(oil_mild, 1);
|
||||||
|
|
||||||
|
if(nuevo>=oil_hot){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_mild=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilmildvalue, oil_mild);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessoilcold(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(oil_cold<=0){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_cold=modify_value(oil_cold, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilcoldvalue, oil_cold);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moreoilcold(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
int nuevo=modify_value(oil_cold, 1);
|
||||||
|
|
||||||
|
if(nuevo>=oil_mild){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_cold=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilcoldvalue, oil_cold);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessoilptoohigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(oil_pressure_too_high, -0.1f);
|
||||||
|
|
||||||
|
if(nuevo<=oil_pressure_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_pressure_too_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilptoohighvalue, oil_pressure_too_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moreoilptoohigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
oil_pressure_too_high=modify_value(oil_pressure_too_high, 0.1f);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilptoohighvalue, oil_pressure_too_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessoilphigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(oil_pressure_high, -0.1f);
|
||||||
|
|
||||||
|
if(nuevo<=oil_pressure_low){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_pressure_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilphighvalue, oil_pressure_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moreoilphigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(oil_pressure_high, 0.1f);
|
||||||
|
|
||||||
|
if(nuevo>=oil_pressure_too_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_pressure_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilphighvalue, oil_pressure_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessoilplow(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(oil_pressure_low<=0){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_pressure_low=modify_value(oil_pressure_low, -0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilplowvalue, oil_pressure_low);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void moreoilplow(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(oil_pressure_low, 0.1f);
|
||||||
|
|
||||||
|
if(nuevo>=oil_pressure_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
oil_pressure_low=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilplowvalue, oil_pressure_low);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessfuelptoohigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(fuel_pressure_too_high, -0.1f);
|
||||||
|
|
||||||
|
if(nuevo<=fuel_pressure_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
fuel_pressure_too_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelptoohighvalue, fuel_pressure_too_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morefuelptoohigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
fuel_pressure_too_high=modify_value(fuel_pressure_too_high, 0.1f);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelptoohighvalue, fuel_pressure_too_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessfuelphigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(fuel_pressure_high, -0.1f);
|
||||||
|
|
||||||
|
if(nuevo<=fuel_pressure_low){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
fuel_pressure_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelphighvalue, fuel_pressure_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morefuelphigh(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(fuel_pressure_high, 0.1f);
|
||||||
|
|
||||||
|
if(nuevo>=fuel_pressure_too_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
fuel_pressure_high=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelphighvalue, fuel_pressure_high);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lessfuelp(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
if(fuel_pressure_low<=0){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
fuel_pressure_low=modify_value(fuel_pressure_low, -0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelplowvalue, fuel_pressure_low);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void morefuelplow(lv_event_t * e)
|
||||||
|
{
|
||||||
|
set();
|
||||||
|
|
||||||
|
float nuevo=modify_value(fuel_pressure_low, 0.1f);
|
||||||
|
|
||||||
|
if(nuevo>=fuel_pressure_high){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
fuel_pressure_low=nuevo;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelplowvalue, fuel_pressure_low);
|
||||||
|
|
||||||
|
update_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void refresh_ui_values(){
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_rpmfinalvalue, rpm);
|
||||||
|
CrowPanelController::set_value_to_label(ui_desplazamientovalue, desp);
|
||||||
|
CrowPanelController::set_value_to_label(ui_diffrpmvalue, diff_rpm);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbatttoohighvalue, vbatt_too_high);
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbatthighvalue, vbatt_high);
|
||||||
|
CrowPanelController::set_value_to_label(ui_vbattlowvalue, vbatt_low);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_waterhotvalue, water_hot);
|
||||||
|
CrowPanelController::set_value_to_label(ui_watermidvalue, water_mild);
|
||||||
|
CrowPanelController::set_value_to_label(ui_watercoldvalue, water_cold);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilhotvalue, oil_hot);
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilmildvalue, oil_mild);
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilcoldvalue, oil_cold);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilptoohighvalue, oil_pressure_too_high);
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilphighvalue, oil_pressure_high);
|
||||||
|
CrowPanelController::set_value_to_label(ui_oilplowvalue, oil_pressure_low);
|
||||||
|
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelptoohighvalue, fuel_pressure_too_high);
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelphighvalue, fuel_pressure_high);
|
||||||
|
CrowPanelController::set_value_to_label(ui_fuelplowvalue, fuel_pressure_low);
|
||||||
|
|
||||||
|
if(modo_oscuro){
|
||||||
|
lv_obj_add_state(ui_modooscuoswitch, LV_STATE_CHECKED);
|
||||||
|
} else {
|
||||||
|
lv_obj_clear_state(ui_modooscuoswitch, LV_STATE_CHECKED);
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_dropdown_set_selected(ui_pantalladrop, pantalla);
|
||||||
|
lv_dropdown_set_selected(ui_rpmdisplaydrop, rpm_display);
|
||||||
|
lv_dropdown_set_selected(ui_recepciondatosdrop, recepcion_datos);
|
||||||
|
|
||||||
|
lv_dropdown_set_selected(ui_opciondrop, 0);
|
||||||
|
lv_obj_clear_flag(ui_settingsmain, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsrpm, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsvbatt, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingswatert, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsoilt, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsoilp, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_obj_add_flag(ui_settingsfuelp, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
18968
Pantalla/src/ui/ui_font_ajustes.c
Normal file
18968
Pantalla/src/ui/ui_font_ajustes.c
Normal file
File diff suppressed because it is too large
Load diff
4831
Pantalla/src/ui/ui_font_ajustesnames.c
Normal file
4831
Pantalla/src/ui/ui_font_ajustesnames.c
Normal file
File diff suppressed because it is too large
Load diff
10954
Pantalla/src/ui/ui_font_labeld.c
Normal file
10954
Pantalla/src/ui/ui_font_labeld.c
Normal file
File diff suppressed because it is too large
Load diff
7301
Pantalla/src/ui/ui_font_labeld2.c
Normal file
7301
Pantalla/src/ui/ui_font_labeld2.c
Normal file
File diff suppressed because it is too large
Load diff
1335
Pantalla/src/ui/ui_font_labelt.c
Normal file
1335
Pantalla/src/ui/ui_font_labelt.c
Normal file
File diff suppressed because it is too large
Load diff
2856
Pantalla/src/ui/ui_font_neutral.c
Normal file
2856
Pantalla/src/ui/ui_font_neutral.c
Normal file
File diff suppressed because it is too large
Load diff
951
Pantalla/src/ui/ui_font_offon.c
Normal file
951
Pantalla/src/ui/ui_font_offon.c
Normal file
|
|
@ -0,0 +1,951 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Size: 40 px
|
||||||
|
* Bpp: 1
|
||||||
|
* Opts: --bpp 1 --size 40 --font C:/Users/Álvaro/Desktop/G26_pantalla_v3/assets/Rajdhani-SemiBold.ttf -o C:/Users/Álvaro/Desktop/G26_pantalla_v3/assets\ui_font_offon.c --format lvgl -r 0x20-0x7f --no-compress --no-prefilter
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
|
||||||
|
#ifndef UI_FONT_OFFON
|
||||||
|
#define UI_FONT_OFFON 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UI_FONT_OFFON
|
||||||
|
|
||||||
|
/*-----------------
|
||||||
|
* BITMAPS
|
||||||
|
*----------------*/
|
||||||
|
|
||||||
|
/*Store the image of the glyphs*/
|
||||||
|
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
|
||||||
|
/* U+0020 " " */
|
||||||
|
0x0,
|
||||||
|
|
||||||
|
/* U+0021 "!" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x60, 0x0, 0xff, 0xff, 0xff,
|
||||||
|
|
||||||
|
/* U+0022 "\"" */
|
||||||
|
0xf1, 0xfc, 0x7f, 0x1f, 0xc7, 0xf1, 0xd8, 0x76,
|
||||||
|
0x1d, 0x86, 0x60, 0x80,
|
||||||
|
|
||||||
|
/* U+0023 "#" */
|
||||||
|
0x0, 0x70, 0x38, 0x1, 0xe0, 0xf0, 0x3, 0x81,
|
||||||
|
0xc0, 0x7, 0x3, 0x80, 0xe, 0x7, 0x0, 0x3c,
|
||||||
|
0x1e, 0xf, 0xff, 0xff, 0x9f, 0xff, 0xff, 0x3f,
|
||||||
|
0xff, 0xfe, 0x7, 0x83, 0x80, 0xe, 0x7, 0x0,
|
||||||
|
0x1c, 0xe, 0x0, 0x38, 0x1c, 0x0, 0xf0, 0x78,
|
||||||
|
0x1, 0xc0, 0xe0, 0x3, 0x81, 0xc0, 0x7, 0x3,
|
||||||
|
0x81, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xe7, 0xff,
|
||||||
|
0xff, 0xc0, 0xe0, 0x70, 0x3, 0xc1, 0xe0, 0x7,
|
||||||
|
0x3, 0x80, 0xe, 0x7, 0x0, 0x1c, 0xe, 0x0,
|
||||||
|
0x78, 0x38, 0x0,
|
||||||
|
|
||||||
|
/* U+0024 "$" */
|
||||||
|
0x0, 0x80, 0x1, 0xc0, 0x1, 0xc0, 0x1, 0xc0,
|
||||||
|
0x1, 0xc0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe,
|
||||||
|
0xf8, 0x1f, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0x6, 0xf0, 0x0, 0xf0, 0x0, 0xf8, 0x0,
|
||||||
|
0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0x0, 0x1f,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0x78, 0x1e,
|
||||||
|
0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x1, 0xc0,
|
||||||
|
0x1, 0xc0, 0x1, 0xc0, 0x1, 0xc0,
|
||||||
|
|
||||||
|
/* U+0025 "%" */
|
||||||
|
0x3f, 0x80, 0xe0, 0x3f, 0xe0, 0x70, 0x38, 0x38,
|
||||||
|
0x70, 0x1c, 0x1c, 0x38, 0xe, 0xe, 0x1c, 0x7,
|
||||||
|
0x7, 0x1c, 0x3, 0x83, 0x8e, 0x1, 0xc1, 0xce,
|
||||||
|
0x0, 0xe0, 0xe7, 0x0, 0x70, 0xf3, 0x80, 0x1f,
|
||||||
|
0xf3, 0x80, 0x7, 0xf1, 0xc0, 0x0, 0x1, 0xc0,
|
||||||
|
0x0, 0x0, 0xe0, 0x0, 0x0, 0xf1, 0xf8, 0x0,
|
||||||
|
0x71, 0xfe, 0x0, 0x39, 0xc3, 0x80, 0x38, 0xe1,
|
||||||
|
0xc0, 0x1c, 0x70, 0xe0, 0x1c, 0x38, 0x70, 0xe,
|
||||||
|
0x1c, 0x38, 0x7, 0xe, 0x1c, 0x7, 0x7, 0xe,
|
||||||
|
0x3, 0x83, 0x87, 0x3, 0x80, 0xff, 0x1, 0xc0,
|
||||||
|
0x3f, 0x0,
|
||||||
|
|
||||||
|
/* U+0026 "&" */
|
||||||
|
0x3, 0xf8, 0x0, 0xff, 0xc0, 0x1f, 0xfe, 0x3,
|
||||||
|
0xe1, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c,
|
||||||
|
0xf, 0x3, 0xc0, 0xf0, 0x3c, 0x0, 0x1, 0xe0,
|
||||||
|
0x0, 0x1f, 0x0, 0x0, 0xf8, 0x0, 0x3f, 0x80,
|
||||||
|
0x7, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x1f, 0xff,
|
||||||
|
0xf0, 0xf8, 0xf, 0x7, 0xc0, 0xf0, 0x7e, 0xf,
|
||||||
|
0x3, 0xf0, 0xf0, 0x1f, 0xf, 0x1, 0xf8, 0xf8,
|
||||||
|
0x3f, 0xc7, 0xff, 0xfe, 0x3f, 0xfb, 0xe1, 0xff,
|
||||||
|
0x1f,
|
||||||
|
|
||||||
|
/* U+0027 "'" */
|
||||||
|
0xff, 0xe6, 0x66, 0x60,
|
||||||
|
|
||||||
|
/* U+0028 "(" */
|
||||||
|
0xe, 0x3f, 0x7e, 0x78, 0xf0, 0xe0, 0xe0, 0xe0,
|
||||||
|
0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0,
|
||||||
|
0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0,
|
||||||
|
0xe0, 0xe0, 0xf0, 0x78, 0x7e, 0x3f, 0xf,
|
||||||
|
|
||||||
|
/* U+0029 ")" */
|
||||||
|
0x70, 0xfc, 0x7e, 0x1e, 0xf, 0x7, 0x7, 0x7,
|
||||||
|
0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7,
|
||||||
|
0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7,
|
||||||
|
0x7, 0x7, 0xf, 0x1e, 0x7e, 0xfc, 0x70,
|
||||||
|
|
||||||
|
/* U+002A "*" */
|
||||||
|
0x7, 0x0, 0x38, 0x1, 0xc0, 0xce, 0x67, 0xaf,
|
||||||
|
0x3f, 0xfc, 0x68, 0x0, 0xb0, 0x1d, 0xc0, 0xef,
|
||||||
|
0xe, 0x38, 0x30, 0x80,
|
||||||
|
|
||||||
|
/* U+002B "+" */
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0,
|
||||||
|
|
||||||
|
/* U+002C "," */
|
||||||
|
0xff, 0xff, 0xfe, 0xec, 0xc8,
|
||||||
|
|
||||||
|
/* U+002D "-" */
|
||||||
|
0xff, 0xff, 0xff, 0xe0,
|
||||||
|
|
||||||
|
/* U+002E "." */
|
||||||
|
0xff, 0xff, 0xff,
|
||||||
|
|
||||||
|
/* U+002F "/" */
|
||||||
|
0x0, 0x3c, 0x1, 0xe0, 0x7, 0x80, 0x1e, 0x0,
|
||||||
|
0xf0, 0x3, 0xc0, 0xe, 0x0, 0x78, 0x1, 0xe0,
|
||||||
|
0xf, 0x0, 0x3c, 0x0, 0xf0, 0x7, 0x80, 0x1e,
|
||||||
|
0x0, 0x70, 0x3, 0xc0, 0xf, 0x0, 0x38, 0x1,
|
||||||
|
0xe0, 0x7, 0x80, 0x3c, 0x0, 0xf0, 0x3, 0xc0,
|
||||||
|
0x1e, 0x0, 0x78, 0x1, 0xc0, 0x0,
|
||||||
|
|
||||||
|
/* U+0030 "0" */
|
||||||
|
0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xfe,
|
||||||
|
0x3f, 0xfc, 0x1f, 0xf8,
|
||||||
|
|
||||||
|
/* U+0031 "1" */
|
||||||
|
0x7, 0x8f, 0xdf, 0xff, 0xff, 0xff, 0x3e, 0x1e,
|
||||||
|
0xf, 0x7, 0x83, 0xc1, 0xe0, 0xf0, 0x78, 0x3c,
|
||||||
|
0x1e, 0xf, 0x7, 0x83, 0xc1, 0xe0, 0xf0, 0x78,
|
||||||
|
0x3c, 0x1e, 0xf, 0x7, 0x83, 0xc0,
|
||||||
|
|
||||||
|
/* U+0032 "2" */
|
||||||
|
0x1f, 0xf0, 0x7f, 0xf1, 0xff, 0xf7, 0xc1, 0xff,
|
||||||
|
0x1, 0xfe, 0x3, 0xfc, 0x7, 0xf8, 0xf, 0x0,
|
||||||
|
0x1e, 0x0, 0x7c, 0x0, 0xf8, 0x7, 0xe0, 0x1f,
|
||||||
|
0x80, 0x7e, 0x1, 0xf8, 0x7, 0xe0, 0x1f, 0x80,
|
||||||
|
0x7e, 0x1, 0xf0, 0x7, 0xc0, 0xf, 0x0, 0x1e,
|
||||||
|
0x0, 0x3c, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xfc,
|
||||||
|
|
||||||
|
/* U+0033 "3" */
|
||||||
|
0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0x1e, 0x3, 0xfe,
|
||||||
|
0x3, 0xf8, 0x3, 0xfe, 0x0, 0x1e, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xfe,
|
||||||
|
0x3f, 0xfc, 0x1f, 0xf8,
|
||||||
|
|
||||||
|
/* U+0034 "4" */
|
||||||
|
0x0, 0x3f, 0x0, 0xf, 0xe0, 0x1, 0xfc, 0x0,
|
||||||
|
0x7f, 0x80, 0xe, 0xf0, 0x3, 0xde, 0x0, 0xf3,
|
||||||
|
0xc0, 0x1e, 0x78, 0x7, 0x8f, 0x0, 0xf1, 0xe0,
|
||||||
|
0x3c, 0x3c, 0x7, 0x87, 0x81, 0xe0, 0xf0, 0x78,
|
||||||
|
0x1e, 0xf, 0x3, 0xc3, 0xc0, 0x78, 0x78, 0xf,
|
||||||
|
0x1e, 0x1, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xfe, 0x0, 0x1e, 0x0, 0x3, 0xc0, 0x0,
|
||||||
|
0x78, 0x0, 0xf, 0x0, 0x1, 0xe0,
|
||||||
|
|
||||||
|
/* U+0035 "5" */
|
||||||
|
0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf7, 0xf8, 0xff, 0xfc, 0xff, 0xfe,
|
||||||
|
0xf8, 0x1f, 0xf0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xfe,
|
||||||
|
0x3f, 0xfc, 0x1f, 0xf8,
|
||||||
|
|
||||||
|
/* U+0036 "6" */
|
||||||
|
0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xfe, 0xf8, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xff, 0xf8, 0xff, 0xfc,
|
||||||
|
0xff, 0xfe, 0xf0, 0x1f, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xfe,
|
||||||
|
0x3f, 0xfc, 0x1f, 0xf8,
|
||||||
|
|
||||||
|
/* U+0037 "7" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf0,
|
||||||
|
0x3, 0xe0, 0x7, 0x80, 0x1f, 0x0, 0x3e, 0x0,
|
||||||
|
0x78, 0x1, 0xf0, 0x3, 0xc0, 0xf, 0x80, 0x1f,
|
||||||
|
0x0, 0x3c, 0x0, 0xf8, 0x1, 0xe0, 0x3, 0xc0,
|
||||||
|
0xf, 0x80, 0x1e, 0x0, 0x7c, 0x0, 0xf0, 0x1,
|
||||||
|
0xe0, 0x7, 0xc0, 0xf, 0x0, 0x3e, 0x0, 0x78,
|
||||||
|
0x0,
|
||||||
|
|
||||||
|
/* U+0038 "8" */
|
||||||
|
0x1f, 0xfc, 0x1f, 0xff, 0x1f, 0xff, 0xdf, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x3, 0xde, 0x3, 0xcf,
|
||||||
|
0xff, 0xe1, 0xff, 0xc3, 0xff, 0xf9, 0xe0, 0x3d,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0039 "9" */
|
||||||
|
0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf8, 0xf, 0x7f, 0xff, 0x3f, 0xff, 0x1f, 0xff,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0x1f, 0x7f, 0xfe,
|
||||||
|
0x7f, 0xfc, 0x7f, 0xf8,
|
||||||
|
|
||||||
|
/* U+003A ":" */
|
||||||
|
0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf,
|
||||||
|
0xff, 0xff, 0xf0,
|
||||||
|
|
||||||
|
/* U+003B ";" */
|
||||||
|
0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf,
|
||||||
|
0xff, 0xff, 0xee, 0xcc, 0x80,
|
||||||
|
|
||||||
|
/* U+003C "<" */
|
||||||
|
0x0, 0x1, 0x0, 0x7, 0xc0, 0x1f, 0xe0, 0x7f,
|
||||||
|
0xe0, 0xff, 0x83, 0xfe, 0x3, 0xf8, 0x1, 0xe0,
|
||||||
|
0x0, 0xfc, 0x0, 0x7f, 0xc0, 0x7, 0xfe, 0x0,
|
||||||
|
0x7f, 0xe0, 0x7, 0xf8, 0x0, 0xfc, 0x0, 0xe,
|
||||||
|
|
||||||
|
/* U+003D "=" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
|
||||||
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
|
||||||
|
/* U+003E ">" */
|
||||||
|
0xc0, 0x0, 0x7c, 0x0, 0x3f, 0x80, 0x1f, 0xf8,
|
||||||
|
0x1, 0xff, 0x80, 0x1f, 0xf8, 0x0, 0xfc, 0x0,
|
||||||
|
0xf, 0x0, 0x3f, 0x80, 0xff, 0x83, 0xff, 0xf,
|
||||||
|
0xfc, 0xf, 0xf0, 0x7, 0xc0, 0x3, 0x0, 0x0,
|
||||||
|
|
||||||
|
/* U+003F "?" */
|
||||||
|
0x1f, 0xf0, 0x7f, 0xf1, 0xff, 0xf7, 0xc1, 0xff,
|
||||||
|
0x1, 0xfe, 0x3, 0xfc, 0x7, 0xf8, 0xf, 0x0,
|
||||||
|
0x3e, 0x0, 0xf8, 0x3, 0xe0, 0xf, 0x80, 0x3e,
|
||||||
|
0x0, 0xf8, 0x1, 0xe0, 0x3, 0xc0, 0x7, 0x80,
|
||||||
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0,
|
||||||
|
0xf0, 0x1, 0xe0, 0x3, 0xc0, 0x7, 0x80, 0xf,
|
||||||
|
0x0,
|
||||||
|
|
||||||
|
/* U+0040 "@" */
|
||||||
|
0x1, 0xff, 0xf8, 0x7, 0xff, 0xff, 0x7, 0x80,
|
||||||
|
0x3, 0xc7, 0x0, 0x0, 0x67, 0x0, 0x0, 0x3b,
|
||||||
|
0x0, 0x0, 0xd, 0x83, 0xff, 0x7, 0x83, 0xff,
|
||||||
|
0x83, 0xc3, 0xff, 0xc1, 0xe3, 0xe0, 0xe0, 0xf1,
|
||||||
|
0xe0, 0x70, 0x78, 0xf0, 0x38, 0x3c, 0x78, 0x1c,
|
||||||
|
0x1e, 0x3c, 0xe, 0xf, 0x1e, 0x7, 0x7, 0x8f,
|
||||||
|
0x3, 0x83, 0xc7, 0x81, 0xc1, 0xe3, 0xe1, 0xe0,
|
||||||
|
0xf0, 0xff, 0xf1, 0xd8, 0x3f, 0xff, 0xce, 0xf,
|
||||||
|
0x8f, 0xc3, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0,
|
||||||
|
0x70, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x7, 0xff,
|
||||||
|
0xc0, 0x0, 0xff, 0xe0, 0x0,
|
||||||
|
|
||||||
|
/* U+0041 "A" */
|
||||||
|
0x1, 0xf8, 0x0, 0x1f, 0x80, 0x3, 0xf8, 0x0,
|
||||||
|
0x3f, 0xc0, 0x3, 0xfc, 0x0, 0x3b, 0xc0, 0x7,
|
||||||
|
0x9e, 0x0, 0x79, 0xe0, 0x7, 0x9e, 0x0, 0x70,
|
||||||
|
0xe0, 0xf, 0xf, 0x0, 0xf0, 0xf0, 0xf, 0xf,
|
||||||
|
0x1, 0xe0, 0x78, 0x1e, 0x7, 0x81, 0xe0, 0x78,
|
||||||
|
0x1e, 0x7, 0x83, 0xff, 0xfc, 0x3f, 0xff, 0xc3,
|
||||||
|
0xff, 0xfc, 0x78, 0x3, 0xe7, 0x80, 0x1e, 0x78,
|
||||||
|
0x1, 0xe7, 0x80, 0x1e, 0xf0, 0x0, 0xff, 0x0,
|
||||||
|
0xf,
|
||||||
|
|
||||||
|
/* U+0042 "B" */
|
||||||
|
0xff, 0xf8, 0x7f, 0xfe, 0x3f, 0xff, 0x9e, 0x3,
|
||||||
|
0xef, 0x0, 0xf7, 0x80, 0x7b, 0xc0, 0x3d, 0xe0,
|
||||||
|
0x1e, 0xf0, 0xf, 0x78, 0x7, 0xbc, 0x7, 0xdf,
|
||||||
|
0xff, 0xcf, 0xff, 0x87, 0xff, 0xf3, 0xc0, 0x3d,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0,
|
||||||
|
0x3f, 0xff, 0xfe, 0xff, 0xfe, 0x7f, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0043 "C" */
|
||||||
|
0x1f, 0xfc, 0x1f, 0xff, 0x1f, 0xff, 0xdf, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x0, 0x3c, 0x0, 0x1e,
|
||||||
|
0x0, 0xf, 0x0, 0x7, 0x80, 0x3, 0xc0, 0x1,
|
||||||
|
0xe0, 0x0, 0xf0, 0x0, 0x78, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0044 "D" */
|
||||||
|
0xff, 0xfc, 0x7f, 0xff, 0x3f, 0xff, 0xde, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xfe,
|
||||||
|
0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0,
|
||||||
|
0x3f, 0xff, 0xfe, 0xff, 0xfe, 0x7f, 0xfc, 0x0,
|
||||||
|
|
||||||
|
/* U+0045 "E" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf0,
|
||||||
|
0x3, 0xc0, 0xf, 0x0, 0x3c, 0x0, 0xf0, 0x3,
|
||||||
|
0xc0, 0xf, 0x0, 0x3f, 0xfe, 0xff, 0xfb, 0xff,
|
||||||
|
0xef, 0x0, 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf,
|
||||||
|
0x0, 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf, 0x0,
|
||||||
|
0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0,
|
||||||
|
|
||||||
|
/* U+0046 "F" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf0,
|
||||||
|
0x3, 0xc0, 0xf, 0x0, 0x3c, 0x0, 0xf0, 0x3,
|
||||||
|
0xc0, 0xf, 0x0, 0x3c, 0x0, 0xff, 0xfb, 0xff,
|
||||||
|
0xef, 0xff, 0xbc, 0x0, 0xf0, 0x3, 0xc0, 0xf,
|
||||||
|
0x0, 0x3c, 0x0, 0xf0, 0x3, 0xc0, 0xf, 0x0,
|
||||||
|
0x3c, 0x0, 0xf0, 0x3, 0xc0, 0x0,
|
||||||
|
|
||||||
|
/* U+0047 "G" */
|
||||||
|
0x1f, 0xfc, 0x1f, 0xff, 0x1f, 0xff, 0xdf, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x0, 0x78, 0x0, 0x3c, 0x0, 0x1e,
|
||||||
|
0x0, 0xf, 0x7, 0xff, 0x83, 0xff, 0xc1, 0xff,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0048 "H" */
|
||||||
|
0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xfe, 0x0,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0,
|
||||||
|
0x1f, 0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xc0,
|
||||||
|
|
||||||
|
/* U+0049 "I" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
|
||||||
|
/* U+004A "J" */
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xfe,
|
||||||
|
0x3f, 0xfc, 0x1f, 0xf8,
|
||||||
|
|
||||||
|
/* U+004B "K" */
|
||||||
|
0xf0, 0x7, 0x9e, 0x1, 0xf3, 0xc0, 0x7c, 0x78,
|
||||||
|
0xf, 0xf, 0x3, 0xe1, 0xe0, 0xf8, 0x3c, 0x1e,
|
||||||
|
0x7, 0x87, 0x80, 0xf1, 0xf0, 0x1e, 0x3c, 0x3,
|
||||||
|
0xcf, 0x0, 0x7b, 0xe0, 0xf, 0x7c, 0x1, 0xff,
|
||||||
|
0xc0, 0x3f, 0xf8, 0x7, 0xe7, 0x80, 0xf8, 0x78,
|
||||||
|
0x1f, 0xf, 0x3, 0xc0, 0xf0, 0x78, 0x1f, 0xf,
|
||||||
|
0x1, 0xe1, 0xe0, 0x1e, 0x3c, 0x3, 0xe7, 0x80,
|
||||||
|
0x3c, 0xf0, 0x3, 0xde, 0x0, 0x78,
|
||||||
|
|
||||||
|
/* U+004C "L" */
|
||||||
|
0xf0, 0x1, 0xe0, 0x3, 0xc0, 0x7, 0x80, 0xf,
|
||||||
|
0x0, 0x1e, 0x0, 0x3c, 0x0, 0x78, 0x0, 0xf0,
|
||||||
|
0x1, 0xe0, 0x3, 0xc0, 0x7, 0x80, 0xf, 0x0,
|
||||||
|
0x1e, 0x0, 0x3c, 0x0, 0x78, 0x0, 0xf0, 0x1,
|
||||||
|
0xe0, 0x3, 0xc0, 0x7, 0x80, 0xf, 0x0, 0x1e,
|
||||||
|
0x0, 0x3c, 0x0, 0x7f, 0xfe, 0xff, 0xff, 0xff,
|
||||||
|
0xf8,
|
||||||
|
|
||||||
|
/* U+004D "M" */
|
||||||
|
0xfc, 0x0, 0x7f, 0xf8, 0x0, 0xff, 0xf8, 0x3,
|
||||||
|
0xff, 0xf0, 0x7, 0xff, 0xe0, 0xf, 0xff, 0xe0,
|
||||||
|
0x3f, 0xfd, 0xc0, 0x77, 0xfb, 0x80, 0xef, 0xf7,
|
||||||
|
0x83, 0xdf, 0xe7, 0x7, 0x3f, 0xce, 0xe, 0x7f,
|
||||||
|
0x9e, 0x3c, 0xff, 0x1c, 0x71, 0xfe, 0x39, 0xe3,
|
||||||
|
0xfc, 0x7b, 0x87, 0xf8, 0x77, 0xf, 0xf0, 0xfe,
|
||||||
|
0x1f, 0xe0, 0xf8, 0x3f, 0xc1, 0xf0, 0x7f, 0x83,
|
||||||
|
0xe0, 0xff, 0x0, 0x1, 0xfe, 0x0, 0x3, 0xfc,
|
||||||
|
0x0, 0x7, 0xf8, 0x0, 0xf, 0xf0, 0x0, 0x1f,
|
||||||
|
0xe0, 0x0, 0x3c,
|
||||||
|
|
||||||
|
/* U+004E "N" */
|
||||||
|
0xf0, 0x3, 0xfe, 0x0, 0xff, 0x80, 0x3f, 0xf0,
|
||||||
|
0xf, 0xfc, 0x3, 0xff, 0x80, 0xff, 0xe0, 0x3f,
|
||||||
|
0xfc, 0xf, 0xff, 0x83, 0xfd, 0xe0, 0xff, 0x7c,
|
||||||
|
0x3f, 0xcf, 0xf, 0xf1, 0xe3, 0xfc, 0x78, 0xff,
|
||||||
|
0xf, 0x3f, 0xc3, 0xef, 0xf0, 0x7b, 0xfc, 0x1f,
|
||||||
|
0xff, 0x3, 0xff, 0xc0, 0x7f, 0xf0, 0x1f, 0xfc,
|
||||||
|
0x3, 0xff, 0x0, 0xff, 0xc0, 0x1f, 0xf0, 0x7,
|
||||||
|
0xfc, 0x0, 0xf0,
|
||||||
|
|
||||||
|
/* U+004F "O" */
|
||||||
|
0x1f, 0xfc, 0x1f, 0xff, 0x1f, 0xff, 0xdf, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xfe,
|
||||||
|
0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0050 "P" */
|
||||||
|
0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xf0, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0x1f, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xf8,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
|
||||||
|
/* U+0051 "Q" */
|
||||||
|
0x1f, 0xfc, 0x1f, 0xff, 0x1f, 0xff, 0xdf, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xfe,
|
||||||
|
0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfc, 0x0,
|
||||||
|
0x3c, 0x0, 0xf, 0x0, 0x7, 0x80, 0x1, 0xe0,
|
||||||
|
0x0, 0xf8, 0x0, 0x18,
|
||||||
|
|
||||||
|
/* U+0052 "R" */
|
||||||
|
0xff, 0xf8, 0x7f, 0xfe, 0x3f, 0xff, 0x9e, 0x3,
|
||||||
|
0xcf, 0x0, 0xf7, 0x80, 0x7b, 0xc0, 0x3d, 0xe0,
|
||||||
|
0x1e, 0xf0, 0xf, 0x78, 0x7, 0xbc, 0x3, 0xde,
|
||||||
|
0x1, 0xef, 0x1, 0xf7, 0xff, 0xf3, 0xff, 0xf1,
|
||||||
|
0xff, 0xe0, 0xf0, 0xf0, 0x78, 0x3c, 0x3c, 0x1e,
|
||||||
|
0x1e, 0x7, 0x8f, 0x3, 0xc7, 0x80, 0xf3, 0xc0,
|
||||||
|
0x79, 0xe0, 0x1e, 0xf0, 0xf, 0x78, 0x7, 0xc0,
|
||||||
|
|
||||||
|
/* U+0053 "S" */
|
||||||
|
0xf, 0xfc, 0x1f, 0xff, 0x1f, 0xff, 0xdf, 0x1,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x0, 0x7c, 0x0, 0x3f, 0x80, 0xf,
|
||||||
|
0xfe, 0x7, 0xff, 0xc1, 0xff, 0xf8, 0x1f, 0xfc,
|
||||||
|
0x0, 0xff, 0x0, 0xf, 0x80, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0054 "T" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
0x3, 0xc0, 0x3, 0xc0,
|
||||||
|
|
||||||
|
/* U+0055 "U" */
|
||||||
|
0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xfe, 0x0,
|
||||||
|
0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f, 0xe0,
|
||||||
|
0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1, 0xfe,
|
||||||
|
0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xc0, 0x1f,
|
||||||
|
0xe0, 0xf, 0xf0, 0x7, 0xf8, 0x3, 0xfc, 0x1,
|
||||||
|
0xfe, 0x0, 0xff, 0x0, 0x7f, 0x80, 0x3f, 0xe0,
|
||||||
|
0x3e, 0xff, 0xfe, 0x3f, 0xfe, 0xf, 0xfe, 0x0,
|
||||||
|
|
||||||
|
/* U+0056 "V" */
|
||||||
|
0xf0, 0x1, 0xfe, 0x0, 0x7f, 0xc0, 0xf, 0x3c,
|
||||||
|
0x1, 0xe7, 0x80, 0x3c, 0xf0, 0xf, 0x1e, 0x1,
|
||||||
|
0xe1, 0xe0, 0x3c, 0x3c, 0x7, 0x87, 0x81, 0xe0,
|
||||||
|
0xf0, 0x3c, 0xf, 0x7, 0x81, 0xe0, 0xf0, 0x3c,
|
||||||
|
0x3c, 0x3, 0x87, 0x80, 0x78, 0xf0, 0xf, 0x1c,
|
||||||
|
0x1, 0xe7, 0x80, 0x1c, 0xf0, 0x3, 0xde, 0x0,
|
||||||
|
0x7b, 0x80, 0xf, 0xf0, 0x0, 0xfe, 0x0, 0x1f,
|
||||||
|
0xc0, 0x3, 0xf0, 0x0, 0x3e, 0x0,
|
||||||
|
|
||||||
|
/* U+0057 "W" */
|
||||||
|
0xf8, 0x7, 0xc0, 0x1e, 0xf0, 0xf, 0x80, 0x7d,
|
||||||
|
0xe0, 0x1f, 0x80, 0xfb, 0xc0, 0x3f, 0x1, 0xe7,
|
||||||
|
0xc0, 0xfe, 0x3, 0xcf, 0x81, 0xfc, 0x7, 0x8f,
|
||||||
|
0x3, 0xbc, 0xf, 0x1e, 0x7, 0x78, 0x3e, 0x3c,
|
||||||
|
0xe, 0x70, 0x7c, 0x78, 0x3c, 0xe0, 0xf0, 0xf8,
|
||||||
|
0x71, 0xc1, 0xe0, 0xf0, 0xe3, 0xc3, 0xc1, 0xe1,
|
||||||
|
0xc3, 0x87, 0x83, 0xc7, 0x87, 0xf, 0x7, 0x8f,
|
||||||
|
0xe, 0x3c, 0xf, 0x1c, 0x1e, 0x78, 0xe, 0x38,
|
||||||
|
0x3c, 0xf0, 0x1e, 0x70, 0x39, 0xe0, 0x3d, 0xe0,
|
||||||
|
0x73, 0xc0, 0x7b, 0x80, 0xe7, 0x0, 0xf7, 0x1,
|
||||||
|
0xfe, 0x1, 0xee, 0x1, 0xfc, 0x1, 0xfc, 0x3,
|
||||||
|
0xf8, 0x3, 0xf8, 0x7, 0xf0, 0x7, 0xe0, 0xf,
|
||||||
|
0xc0, 0xf, 0xc0, 0x1f, 0x80,
|
||||||
|
|
||||||
|
/* U+0058 "X" */
|
||||||
|
0xf8, 0x3, 0xef, 0x0, 0x79, 0xf0, 0x1f, 0x1e,
|
||||||
|
0x3, 0xc3, 0xe0, 0xf8, 0x3c, 0x1e, 0x3, 0xc7,
|
||||||
|
0xc0, 0x78, 0xf0, 0x7, 0xbc, 0x0, 0xf7, 0x80,
|
||||||
|
0xf, 0xe0, 0x1, 0xfc, 0x0, 0x1f, 0x0, 0x7,
|
||||||
|
0xf0, 0x0, 0xfe, 0x0, 0x3d, 0xe0, 0x7, 0xbc,
|
||||||
|
0x1, 0xe3, 0xc0, 0x3c, 0x78, 0xf, 0x7, 0x81,
|
||||||
|
0xe0, 0xf0, 0x78, 0xf, 0xf, 0x1, 0xe3, 0xc0,
|
||||||
|
0x1e, 0x78, 0x3, 0xfe, 0x0, 0x3c,
|
||||||
|
|
||||||
|
/* U+0059 "Y" */
|
||||||
|
0xf8, 0x1, 0xf7, 0x80, 0x1e, 0x7c, 0x3, 0xe3,
|
||||||
|
0xc0, 0x3c, 0x3e, 0x7, 0xc1, 0xe0, 0x78, 0x1f,
|
||||||
|
0xf, 0x80, 0xf0, 0xf0, 0xf, 0xf, 0x0, 0x79,
|
||||||
|
0xe0, 0x7, 0x9e, 0x0, 0x3f, 0xc0, 0x3, 0xfc,
|
||||||
|
0x0, 0x1f, 0x80, 0x1, 0xf8, 0x0, 0xf, 0x0,
|
||||||
|
0x0, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf, 0x0, 0x0, 0xf0, 0x0, 0xf, 0x0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, 0x0, 0xf,
|
||||||
|
0x0,
|
||||||
|
|
||||||
|
/* U+005A "Z" */
|
||||||
|
0xff, 0xff, 0x7f, 0xff, 0xbf, 0xff, 0xc0, 0x3,
|
||||||
|
0xe0, 0x1, 0xf0, 0x1, 0xf0, 0x0, 0xf8, 0x0,
|
||||||
|
0xf8, 0x0, 0xf8, 0x0, 0x7c, 0x0, 0x7c, 0x0,
|
||||||
|
0x3c, 0x0, 0x3e, 0x0, 0x3e, 0x0, 0x1f, 0x0,
|
||||||
|
0x1f, 0x0, 0x1f, 0x0, 0xf, 0x80, 0xf, 0x80,
|
||||||
|
0x7, 0x80, 0x7, 0xc0, 0x7, 0xc0, 0x3, 0xc0,
|
||||||
|
0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
||||||
|
|
||||||
|
/* U+005B "[" */
|
||||||
|
0xff, 0xff, 0xff, 0xe, 0x1c, 0x38, 0x70, 0xe1,
|
||||||
|
0xc3, 0x87, 0xe, 0x1c, 0x38, 0x70, 0xe1, 0xc3,
|
||||||
|
0x87, 0xe, 0x1c, 0x38, 0x70, 0xe1, 0xc3, 0x87,
|
||||||
|
0xf, 0xff, 0xff, 0x80,
|
||||||
|
|
||||||
|
/* U+005C "\\" */
|
||||||
|
0x70, 0x1, 0xe0, 0x7, 0x80, 0xf, 0x0, 0x3c,
|
||||||
|
0x0, 0xf0, 0x1, 0xe0, 0x7, 0x80, 0xe, 0x0,
|
||||||
|
0x3c, 0x0, 0xf0, 0x1, 0xc0, 0x7, 0x80, 0x1e,
|
||||||
|
0x0, 0x3c, 0x0, 0xf0, 0x1, 0xc0, 0x7, 0x80,
|
||||||
|
0x1e, 0x0, 0x38, 0x0, 0xf0, 0x3, 0xc0, 0x7,
|
||||||
|
0x0, 0x1e, 0x0, 0x78, 0x0, 0xf0,
|
||||||
|
|
||||||
|
/* U+005D "]" */
|
||||||
|
0x7f, 0xfd, 0xf8, 0x70, 0xe1, 0xc3, 0x87, 0xe,
|
||||||
|
0x1c, 0x38, 0x70, 0xe1, 0xc3, 0x87, 0xe, 0x1c,
|
||||||
|
0x38, 0x70, 0xe1, 0xc3, 0x87, 0xe, 0x1c, 0x38,
|
||||||
|
0x77, 0xff, 0xdf, 0x80,
|
||||||
|
|
||||||
|
/* U+005E "^" */
|
||||||
|
0x3, 0x80, 0x7, 0xe0, 0xf, 0xe0, 0xf, 0xf0,
|
||||||
|
0x1e, 0x70, 0x1e, 0x78, 0x3c, 0x38, 0x3c, 0x3c,
|
||||||
|
0x78, 0x1c, 0x78, 0x1e, 0xf0, 0xe, 0xf0, 0xf,
|
||||||
|
|
||||||
|
/* U+005F "_" */
|
||||||
|
0xff, 0xff, 0xff, 0xfc,
|
||||||
|
|
||||||
|
/* U+0060 "`" */
|
||||||
|
0xf8, 0xf0, 0xf0, 0xf0, 0xe0,
|
||||||
|
|
||||||
|
/* U+0061 "a" */
|
||||||
|
0x1f, 0xff, 0x3f, 0xff, 0x7f, 0xff, 0xf8, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xff, 0x3f, 0xff,
|
||||||
|
0x1f, 0xcf,
|
||||||
|
|
||||||
|
/* U+0062 "b" */
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf3, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0x1f, 0xff, 0xfe, 0xff, 0xfc,
|
||||||
|
0xff, 0xf8,
|
||||||
|
|
||||||
|
/* U+0063 "c" */
|
||||||
|
0x1f, 0xf9, 0xff, 0xdf, 0xff, 0xf0, 0xf, 0x0,
|
||||||
|
0x78, 0x3, 0xc0, 0x1e, 0x0, 0xf0, 0x7, 0x80,
|
||||||
|
0x3c, 0x1, 0xe0, 0xf, 0x0, 0x78, 0x3, 0xc0,
|
||||||
|
0x1e, 0x0, 0xf0, 0x7, 0xc0, 0x1f, 0xfe, 0x7f,
|
||||||
|
0xf1, 0xff, 0x80,
|
||||||
|
|
||||||
|
/* U+0064 "d" */
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x1f, 0xef, 0x3f, 0xff, 0x7f, 0xff, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xff, 0x3f, 0xff,
|
||||||
|
0x1f, 0xcf,
|
||||||
|
|
||||||
|
/* U+0065 "e" */
|
||||||
|
0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf8, 0x0, 0x7f, 0xff, 0x3f, 0xff,
|
||||||
|
0x1f, 0xff,
|
||||||
|
|
||||||
|
/* U+0066 "f" */
|
||||||
|
0x3, 0xf0, 0x7f, 0xf, 0xf1, 0xf0, 0x1e, 0x1,
|
||||||
|
0xe0, 0x1e, 0x1, 0xe0, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xf1, 0xe0, 0x1e, 0x1, 0xe0, 0x1e, 0x1, 0xe0,
|
||||||
|
0x1e, 0x1, 0xe0, 0x1e, 0x1, 0xe0, 0x1e, 0x1,
|
||||||
|
0xe0, 0x1e, 0x1, 0xe0, 0x1e, 0x1, 0xe0, 0x1e,
|
||||||
|
0x1, 0xe0, 0x1e, 0x0,
|
||||||
|
|
||||||
|
/* U+0067 "g" */
|
||||||
|
0x1f, 0xff, 0x3f, 0xff, 0x7f, 0xff, 0xf8, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf8, 0x1f,
|
||||||
|
0x7f, 0xff, 0x3f, 0xff, 0x1f, 0xcf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, 0x1f,
|
||||||
|
0x7f, 0xfe, 0x7f, 0xfc, 0x7f, 0xf8,
|
||||||
|
|
||||||
|
/* U+0068 "h" */
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf3, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf,
|
||||||
|
|
||||||
|
/* U+0069 "i" */
|
||||||
|
0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
|
||||||
|
|
||||||
|
/* U+006A "j" */
|
||||||
|
0x7, 0x83, 0xc1, 0xe0, 0xf0, 0x78, 0x0, 0x0,
|
||||||
|
0x0, 0x7, 0x83, 0xc1, 0xe0, 0xf0, 0x78, 0x3c,
|
||||||
|
0x1e, 0xf, 0x7, 0x83, 0xc1, 0xe0, 0xf0, 0x78,
|
||||||
|
0x3c, 0x1e, 0xf, 0x7, 0x83, 0xc1, 0xe0, 0xf0,
|
||||||
|
0x78, 0x3c, 0x1e, 0x1f, 0xff, 0x7f, 0x3f, 0x0,
|
||||||
|
|
||||||
|
/* U+006B "k" */
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x1e, 0xf0, 0x3e, 0xf0, 0x7c, 0xf0, 0x78,
|
||||||
|
0xf0, 0xf8, 0xf0, 0xf0, 0xf1, 0xf0, 0xf1, 0xe0,
|
||||||
|
0xf3, 0xc0, 0xf7, 0xc0, 0xf7, 0xc0, 0xf3, 0xc0,
|
||||||
|
0xf3, 0xe0, 0xf1, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8,
|
||||||
|
0xf0, 0x78, 0xf0, 0x7c, 0xf0, 0x3c, 0xf0, 0x3e,
|
||||||
|
0xf0, 0x1f,
|
||||||
|
|
||||||
|
/* U+006C "l" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
|
||||||
|
|
||||||
|
/* U+006D "m" */
|
||||||
|
0xf3, 0xf0, 0x7f, 0x1f, 0xff, 0xbf, 0xf3, 0xff,
|
||||||
|
0xff, 0xff, 0x7c, 0x1f, 0x81, 0xff, 0x1, 0xf0,
|
||||||
|
0x1f, 0xe0, 0x3c, 0x3, 0xfc, 0x7, 0x80, 0x7f,
|
||||||
|
0x80, 0xf0, 0xf, 0xf0, 0x1e, 0x1, 0xfe, 0x3,
|
||||||
|
0xc0, 0x3f, 0xc0, 0x78, 0x7, 0xf8, 0xf, 0x0,
|
||||||
|
0xff, 0x1, 0xe0, 0x1f, 0xe0, 0x3c, 0x3, 0xfc,
|
||||||
|
0x7, 0x80, 0x7f, 0x80, 0xf0, 0xf, 0xf0, 0x1e,
|
||||||
|
0x1, 0xfe, 0x3, 0xc0, 0x3f, 0xc0, 0x78, 0x7,
|
||||||
|
0xf8, 0xf, 0x0, 0xff, 0x1, 0xe0, 0x1e,
|
||||||
|
|
||||||
|
/* U+006E "n" */
|
||||||
|
0xf3, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf,
|
||||||
|
|
||||||
|
/* U+006F "o" */
|
||||||
|
0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xf8, 0x1e,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf8, 0x1e, 0x7f, 0xfe, 0x3f, 0xfc,
|
||||||
|
0x1f, 0xf8,
|
||||||
|
|
||||||
|
/* U+0070 "p" */
|
||||||
|
0xf3, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xf8, 0x1f,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf8, 0x1f, 0xff, 0xfe, 0xff, 0xfc,
|
||||||
|
0xf7, 0xf8, 0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
0xf0, 0x0, 0xf0, 0x0, 0xf0, 0x0,
|
||||||
|
|
||||||
|
/* U+0071 "q" */
|
||||||
|
0x1f, 0xff, 0x3f, 0xff, 0x7f, 0xff, 0xf8, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xff, 0x3f, 0xff,
|
||||||
|
0x1f, 0xcf, 0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
|
||||||
|
/* U+0072 "r" */
|
||||||
|
0xf3, 0xdf, 0xff, 0xff, 0x7c, 0xf, 0x1, 0xe0,
|
||||||
|
0x3c, 0x7, 0x80, 0xf0, 0x1e, 0x3, 0xc0, 0x78,
|
||||||
|
0xf, 0x1, 0xe0, 0x3c, 0x7, 0x80, 0xf0, 0x1e,
|
||||||
|
0x3, 0xc0, 0x78, 0xf, 0x0,
|
||||||
|
|
||||||
|
/* U+0073 "s" */
|
||||||
|
0x1f, 0xf9, 0xff, 0xe7, 0xff, 0xbe, 0x0, 0xf0,
|
||||||
|
0x3, 0xc0, 0xf, 0x80, 0x3f, 0x0, 0x7f, 0x0,
|
||||||
|
0xff, 0x1, 0xff, 0x1, 0xfe, 0x1, 0xf8, 0x1,
|
||||||
|
0xf0, 0x3, 0xc0, 0xf, 0x0, 0x3c, 0x1, 0xff,
|
||||||
|
0xff, 0xbf, 0xfe, 0xff, 0xe0,
|
||||||
|
|
||||||
|
/* U+0074 "t" */
|
||||||
|
0x1e, 0x1, 0xe0, 0x1e, 0x1, 0xe0, 0x1e, 0xf,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x1e, 0x1, 0xe0, 0x1e,
|
||||||
|
0x1, 0xe0, 0x1e, 0x1, 0xe0, 0x1e, 0x1, 0xe0,
|
||||||
|
0x1e, 0x1, 0xe0, 0x1e, 0x1, 0xe0, 0x1e, 0x1,
|
||||||
|
0xe0, 0x1f, 0x0, 0xff, 0x7, 0xf0, 0x3f,
|
||||||
|
|
||||||
|
/* U+0075 "u" */
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf,
|
||||||
|
0xf0, 0xf, 0xf8, 0x1f, 0x7f, 0xff, 0x3f, 0xff,
|
||||||
|
0x1f, 0xcf,
|
||||||
|
|
||||||
|
/* U+0076 "v" */
|
||||||
|
0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0x70, 0xe,
|
||||||
|
0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x38, 0x1c,
|
||||||
|
0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x38, 0x1c, 0x38,
|
||||||
|
0x1e, 0x78, 0x1e, 0x78, 0xe, 0x70, 0xe, 0x70,
|
||||||
|
0xf, 0xf0, 0xf, 0xf0, 0x7, 0xe0, 0x7, 0xe0,
|
||||||
|
0x7, 0xe0,
|
||||||
|
|
||||||
|
/* U+0077 "w" */
|
||||||
|
0xf0, 0x1e, 0x3, 0xfc, 0x7, 0x81, 0xff, 0x3,
|
||||||
|
0xe0, 0x7b, 0xe0, 0xfc, 0x1e, 0x78, 0x3f, 0x7,
|
||||||
|
0x9e, 0xf, 0xc1, 0xe7, 0x87, 0x70, 0xf1, 0xe1,
|
||||||
|
0xdc, 0x3c, 0x38, 0x73, 0x8f, 0xf, 0x1c, 0xe3,
|
||||||
|
0xc3, 0xcf, 0x38, 0xe0, 0xf3, 0x8e, 0x38, 0x1c,
|
||||||
|
0xe3, 0xde, 0x7, 0x38, 0x77, 0x81, 0xee, 0x1d,
|
||||||
|
0xe0, 0x7f, 0x7, 0x70, 0xf, 0xc1, 0xfc, 0x3,
|
||||||
|
0xf0, 0x3f, 0x0, 0xfc, 0xf, 0xc0, 0x3f, 0x3,
|
||||||
|
0xe0, 0x7, 0x80, 0xf8, 0x0,
|
||||||
|
|
||||||
|
/* U+0078 "x" */
|
||||||
|
0xf0, 0x1f, 0x78, 0x1e, 0x78, 0x3e, 0x3c, 0x3c,
|
||||||
|
0x3c, 0x78, 0x1e, 0x78, 0x1e, 0xf0, 0xf, 0xf0,
|
||||||
|
0xf, 0xe0, 0x7, 0xe0, 0x7, 0xe0, 0x7, 0xe0,
|
||||||
|
0xf, 0xf0, 0xf, 0xf0, 0x1e, 0x78, 0x3e, 0x78,
|
||||||
|
0x3c, 0x3c, 0x7c, 0x3c, 0x78, 0x1e, 0xf8, 0x1e,
|
||||||
|
0xf0, 0x1f,
|
||||||
|
|
||||||
|
/* U+0079 "y" */
|
||||||
|
0xf0, 0x7, 0xf8, 0x7, 0xbc, 0x3, 0xcf, 0x1,
|
||||||
|
0xe7, 0x80, 0xf3, 0xc0, 0xf1, 0xe0, 0x78, 0x78,
|
||||||
|
0x3c, 0x3c, 0x1c, 0x1e, 0x1e, 0x7, 0xf, 0x3,
|
||||||
|
0xc7, 0x81, 0xe7, 0x80, 0xf3, 0xc0, 0x3d, 0xe0,
|
||||||
|
0x1e, 0xe0, 0xf, 0xf0, 0x3, 0xf8, 0x1, 0xfc,
|
||||||
|
0x0, 0xfc, 0x0, 0x1e, 0x0, 0xf, 0x0, 0xf,
|
||||||
|
0x0, 0xf, 0x80, 0x7f, 0x80, 0x3f, 0x80, 0x1f,
|
||||||
|
0x80, 0x0,
|
||||||
|
|
||||||
|
/* U+007A "z" */
|
||||||
|
0xff, 0xfd, 0xff, 0xfb, 0xff, 0xf0, 0x3, 0xe0,
|
||||||
|
0xf, 0x80, 0x1f, 0x0, 0x7c, 0x0, 0xf0, 0x3,
|
||||||
|
0xe0, 0xf, 0x80, 0x1f, 0x0, 0x7c, 0x0, 0xf0,
|
||||||
|
0x3, 0xe0, 0xf, 0x80, 0x1e, 0x0, 0x7c, 0x1,
|
||||||
|
0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
|
||||||
|
|
||||||
|
/* U+007B "{" */
|
||||||
|
0x3, 0x81, 0xf0, 0xf8, 0x78, 0x1c, 0x7, 0x1,
|
||||||
|
0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c,
|
||||||
|
0xf, 0x7, 0x83, 0xc0, 0x78, 0xf, 0x1, 0xc0,
|
||||||
|
0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, 0x7,
|
||||||
|
0x1, 0xc0, 0x78, 0xf, 0x81, 0xf0, 0x38,
|
||||||
|
|
||||||
|
/* U+007C "|" */
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xfc,
|
||||||
|
|
||||||
|
/* U+007D "}" */
|
||||||
|
0xe0, 0x7c, 0x3e, 0x7, 0x81, 0xc0, 0xe0, 0x70,
|
||||||
|
0x38, 0x1c, 0xe, 0x7, 0x3, 0x81, 0xc0, 0xf0,
|
||||||
|
0x3e, 0xf, 0xf, 0x8f, 0x7, 0x3, 0x81, 0xc0,
|
||||||
|
0xe0, 0x70, 0x38, 0x1c, 0xe, 0x7, 0x7, 0x8f,
|
||||||
|
0x87, 0xc3, 0x80,
|
||||||
|
|
||||||
|
/* U+007E "~" */
|
||||||
|
0x7f, 0x3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xfe
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------
|
||||||
|
* GLYPH DESCRIPTION
|
||||||
|
*--------------------*/
|
||||||
|
|
||||||
|
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
|
||||||
|
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
|
||||||
|
{.bitmap_index = 0, .adv_w = 152, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1, .adv_w = 152, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 14, .adv_w = 220, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 17},
|
||||||
|
{.bitmap_index = 26, .adv_w = 430, .box_w = 23, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 101, .adv_w = 332, .box_w = 16, .box_h = 35, .ofs_x = 2, .ofs_y = -4},
|
||||||
|
{.bitmap_index = 171, .adv_w = 468, .box_w = 25, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 253, .adv_w = 390, .box_w = 20, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 318, .adv_w = 120, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 18},
|
||||||
|
{.bitmap_index = 322, .adv_w = 190, .box_w = 8, .box_h = 31, .ofs_x = 2, .ofs_y = -5},
|
||||||
|
{.bitmap_index = 353, .adv_w = 190, .box_w = 8, .box_h = 31, .ofs_x = 1, .ofs_y = -5},
|
||||||
|
{.bitmap_index = 384, .adv_w = 257, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 14},
|
||||||
|
{.bitmap_index = 404, .adv_w = 351, .box_w = 16, .box_h = 17, .ofs_x = 3, .ofs_y = 5},
|
||||||
|
{.bitmap_index = 438, .adv_w = 127, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = -4},
|
||||||
|
{.bitmap_index = 443, .adv_w = 200, .box_w = 9, .box_h = 3, .ofs_x = 2, .ofs_y = 11},
|
||||||
|
{.bitmap_index = 447, .adv_w = 127, .box_w = 4, .box_h = 6, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 450, .adv_w = 259, .box_w = 14, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 496, .adv_w = 338, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 548, .adv_w = 209, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 578, .adv_w = 312, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 627, .adv_w = 323, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 679, .adv_w = 341, .box_w = 19, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 741, .adv_w = 318, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 793, .adv_w = 330, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 845, .adv_w = 264, .box_w = 15, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 894, .adv_w = 341, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 950, .adv_w = 330, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1002, .adv_w = 127, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1013, .adv_w = 127, .box_w = 4, .box_h = 25, .ofs_x = 2, .ofs_y = -4},
|
||||||
|
{.bitmap_index = 1026, .adv_w = 348, .box_w = 17, .box_h = 15, .ofs_x = 3, .ofs_y = 6},
|
||||||
|
{.bitmap_index = 1058, .adv_w = 355, .box_w = 16, .box_h = 11, .ofs_x = 3, .ofs_y = 8},
|
||||||
|
{.bitmap_index = 1080, .adv_w = 355, .box_w = 17, .box_h = 15, .ofs_x = 3, .ofs_y = 6},
|
||||||
|
{.bitmap_index = 1112, .adv_w = 300, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1161, .adv_w = 479, .box_w = 25, .box_h = 27, .ofs_x = 3, .ofs_y = -2},
|
||||||
|
{.bitmap_index = 1246, .adv_w = 351, .box_w = 20, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1311, .adv_w = 353, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1367, .adv_w = 346, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1423, .adv_w = 355, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1479, .adv_w = 307, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1525, .adv_w = 291, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1571, .adv_w = 348, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1627, .adv_w = 367, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1683, .adv_w = 162, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1696, .adv_w = 328, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1748, .adv_w = 351, .box_w = 19, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1810, .adv_w = 288, .box_w = 15, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1859, .adv_w = 458, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1934, .adv_w = 373, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 1993, .adv_w = 353, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2049, .adv_w = 338, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2101, .adv_w = 361, .box_w = 17, .box_h = 32, .ofs_x = 3, .ofs_y = -6},
|
||||||
|
{.bitmap_index = 2169, .adv_w = 347, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2225, .adv_w = 351, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2281, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2333, .adv_w = 356, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2389, .adv_w = 328, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2451, .adv_w = 513, .box_w = 31, .box_h = 26, .ofs_x = 0, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2552, .adv_w = 337, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2614, .adv_w = 325, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2679, .adv_w = 324, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2735, .adv_w = 198, .box_w = 7, .box_h = 31, .ofs_x = 3, .ofs_y = -5},
|
||||||
|
{.bitmap_index = 2763, .adv_w = 259, .box_w = 14, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2809, .adv_w = 198, .box_w = 7, .box_h = 31, .ofs_x = 2, .ofs_y = -5},
|
||||||
|
{.bitmap_index = 2837, .adv_w = 316, .box_w = 16, .box_h = 12, .ofs_x = 2, .ofs_y = 15},
|
||||||
|
{.bitmap_index = 2861, .adv_w = 238, .box_w = 15, .box_h = 2, .ofs_x = 0, .ofs_y = -4},
|
||||||
|
{.bitmap_index = 2865, .adv_w = 184, .box_w = 7, .box_h = 5, .ofs_x = 2, .ofs_y = 24},
|
||||||
|
{.bitmap_index = 2870, .adv_w = 328, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2912, .adv_w = 332, .box_w = 16, .box_h = 29, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 2970, .adv_w = 259, .box_w = 13, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3005, .adv_w = 332, .box_w = 16, .box_h = 29, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3063, .adv_w = 316, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3105, .adv_w = 214, .box_w = 12, .box_h = 29, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3149, .adv_w = 329, .box_w = 16, .box_h = 27, .ofs_x = 2, .ofs_y = -6},
|
||||||
|
{.bitmap_index = 3203, .adv_w = 331, .box_w = 16, .box_h = 29, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3261, .adv_w = 149, .box_w = 4, .box_h = 29, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3276, .adv_w = 149, .box_w = 9, .box_h = 35, .ofs_x = -2, .ofs_y = -6},
|
||||||
|
{.bitmap_index = 3316, .adv_w = 292, .box_w = 16, .box_h = 29, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3374, .adv_w = 149, .box_w = 4, .box_h = 29, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3389, .adv_w = 504, .box_w = 27, .box_h = 21, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3460, .adv_w = 331, .box_w = 16, .box_h = 21, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3502, .adv_w = 323, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3544, .adv_w = 332, .box_w = 16, .box_h = 27, .ofs_x = 3, .ofs_y = -6},
|
||||||
|
{.bitmap_index = 3598, .adv_w = 328, .box_w = 16, .box_h = 27, .ofs_x = 2, .ofs_y = -6},
|
||||||
|
{.bitmap_index = 3652, .adv_w = 214, .box_w = 11, .box_h = 21, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3681, .adv_w = 278, .box_w = 14, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3718, .adv_w = 225, .box_w = 12, .box_h = 26, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3757, .adv_w = 331, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3799, .adv_w = 287, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3841, .adv_w = 442, .box_w = 26, .box_h = 21, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3910, .adv_w = 284, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 3952, .adv_w = 299, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -6},
|
||||||
|
{.bitmap_index = 4010, .adv_w = 276, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 4050, .adv_w = 197, .box_w = 10, .box_h = 31, .ofs_x = 1, .ofs_y = -5},
|
||||||
|
{.bitmap_index = 4089, .adv_w = 142, .box_w = 3, .box_h = 26, .ofs_x = 3, .ofs_y = 0},
|
||||||
|
{.bitmap_index = 4099, .adv_w = 197, .box_w = 9, .box_h = 31, .ofs_x = 1, .ofs_y = -5},
|
||||||
|
{.bitmap_index = 4134, .adv_w = 351, .box_w = 16, .box_h = 4, .ofs_x = 3, .ofs_y = 11}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------------
|
||||||
|
* CHARACTER MAPPING
|
||||||
|
*--------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*Collect the unicode lists and glyph_id offsets*/
|
||||||
|
static const lv_font_fmt_txt_cmap_t cmaps[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.range_start = 32, .range_length = 95, .glyph_id_start = 1,
|
||||||
|
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------
|
||||||
|
* ALL CUSTOM DATA
|
||||||
|
*--------------------*/
|
||||||
|
|
||||||
|
#if LVGL_VERSION_MAJOR == 8
|
||||||
|
/*Store all the custom data of the font*/
|
||||||
|
static lv_font_fmt_txt_glyph_cache_t cache;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LVGL_VERSION_MAJOR >= 8
|
||||||
|
static const lv_font_fmt_txt_dsc_t font_dsc = {
|
||||||
|
#else
|
||||||
|
static lv_font_fmt_txt_dsc_t font_dsc = {
|
||||||
|
#endif
|
||||||
|
.glyph_bitmap = glyph_bitmap,
|
||||||
|
.glyph_dsc = glyph_dsc,
|
||||||
|
.cmaps = cmaps,
|
||||||
|
.kern_dsc = NULL,
|
||||||
|
.kern_scale = 0,
|
||||||
|
.cmap_num = 1,
|
||||||
|
.bpp = 1,
|
||||||
|
.kern_classes = 0,
|
||||||
|
.bitmap_format = 0,
|
||||||
|
#if LVGL_VERSION_MAJOR == 8
|
||||||
|
.cache = &cache
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------
|
||||||
|
* PUBLIC FONT
|
||||||
|
*----------------*/
|
||||||
|
|
||||||
|
/*Initialize a public general font descriptor*/
|
||||||
|
#if LVGL_VERSION_MAJOR >= 8
|
||||||
|
const lv_font_t ui_font_offon = {
|
||||||
|
#else
|
||||||
|
lv_font_t ui_font_offon = {
|
||||||
|
#endif
|
||||||
|
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
|
||||||
|
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
|
||||||
|
.line_height = 37, /*The maximum line height required by the font*/
|
||||||
|
.base_line = 6, /*Baseline measured from the bottom of the line*/
|
||||||
|
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
|
||||||
|
.subpx = LV_FONT_SUBPX_NONE,
|
||||||
|
#endif
|
||||||
|
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
|
||||||
|
.underline_position = -3,
|
||||||
|
.underline_thickness = 2,
|
||||||
|
#endif
|
||||||
|
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
|
||||||
|
#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9
|
||||||
|
.fallback = NULL,
|
||||||
|
#endif
|
||||||
|
.user_data = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*#if UI_FONT_OFFON*/
|
||||||
|
|
||||||
1102
Pantalla/src/ui/ui_font_rpm.c
Normal file
1102
Pantalla/src/ui/ui_font_rpm.c
Normal file
File diff suppressed because it is too large
Load diff
15466
Pantalla/src/ui/ui_font_speed.c
Normal file
15466
Pantalla/src/ui/ui_font_speed.c
Normal file
File diff suppressed because it is too large
Load diff
1962
Pantalla/src/ui/ui_font_speedlabel.c
Normal file
1962
Pantalla/src/ui/ui_font_speedlabel.c
Normal file
File diff suppressed because it is too large
Load diff
2561
Pantalla/src/ui/ui_font_warmup.c
Normal file
2561
Pantalla/src/ui/ui_font_warmup.c
Normal file
File diff suppressed because it is too large
Load diff
353
Pantalla/src/ui/ui_helpers.c
Normal file
353
Pantalla/src/ui/ui_helpers.c
Normal file
|
|
@ -0,0 +1,353 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#include "../../include/ui/ui_helpers.h"
|
||||||
|
|
||||||
|
void _ui_bar_set_property(lv_obj_t * target, int id, int val)
|
||||||
|
{
|
||||||
|
if(id == _UI_BAR_PROPERTY_VALUE_WITH_ANIM) lv_bar_set_value(target, val, LV_ANIM_ON);
|
||||||
|
if(id == _UI_BAR_PROPERTY_VALUE) lv_bar_set_value(target, val, LV_ANIM_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_basic_set_property(lv_obj_t * target, int id, int val)
|
||||||
|
{
|
||||||
|
if(id == _UI_BASIC_PROPERTY_POSITION_X) lv_obj_set_x(target, val);
|
||||||
|
if(id == _UI_BASIC_PROPERTY_POSITION_Y) lv_obj_set_y(target, val);
|
||||||
|
if(id == _UI_BASIC_PROPERTY_WIDTH) lv_obj_set_width(target, val);
|
||||||
|
if(id == _UI_BASIC_PROPERTY_HEIGHT) lv_obj_set_height(target, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_dropdown_set_property(lv_obj_t * target, int id, int val)
|
||||||
|
{
|
||||||
|
if(id == _UI_DROPDOWN_PROPERTY_SELECTED) lv_dropdown_set_selected(target, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_image_set_property(lv_obj_t * target, int id, uint8_t * val)
|
||||||
|
{
|
||||||
|
if(id == _UI_IMAGE_PROPERTY_IMAGE) lv_img_set_src(target, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_label_set_property(lv_obj_t * target, int id, const char * val)
|
||||||
|
{
|
||||||
|
if(id == _UI_LABEL_PROPERTY_TEXT) lv_label_set_text(target, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_roller_set_property(lv_obj_t * target, int id, int val)
|
||||||
|
{
|
||||||
|
if(id == _UI_ROLLER_PROPERTY_SELECTED_WITH_ANIM) lv_roller_set_selected(target, val, LV_ANIM_ON);
|
||||||
|
if(id == _UI_ROLLER_PROPERTY_SELECTED) lv_roller_set_selected(target, val, LV_ANIM_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_slider_set_property(lv_obj_t * target, int id, int val)
|
||||||
|
{
|
||||||
|
if(id == _UI_SLIDER_PROPERTY_VALUE_WITH_ANIM) lv_slider_set_value(target, val, LV_ANIM_ON);
|
||||||
|
if(id == _UI_SLIDER_PROPERTY_VALUE) lv_slider_set_value(target, val, LV_ANIM_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_screen_change(lv_obj_t ** target, lv_scr_load_anim_t fademode, int spd, int delay, void (*target_init)(void))
|
||||||
|
{
|
||||||
|
if(*target == NULL)
|
||||||
|
target_init();
|
||||||
|
lv_scr_load_anim(*target, fademode, spd, delay, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_screen_delete(void (*target)(void))
|
||||||
|
{
|
||||||
|
if(target != NULL) {
|
||||||
|
target();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_arc_increment(lv_obj_t * target, int val)
|
||||||
|
{
|
||||||
|
int old = lv_arc_get_value(target);
|
||||||
|
lv_arc_set_value(target, old + val);
|
||||||
|
lv_event_send(target, LV_EVENT_VALUE_CHANGED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_bar_increment(lv_obj_t * target, int val, int anm)
|
||||||
|
{
|
||||||
|
int old = lv_bar_get_value(target);
|
||||||
|
lv_bar_set_value(target, old + val, anm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_slider_increment(lv_obj_t * target, int val, int anm)
|
||||||
|
{
|
||||||
|
int old = lv_slider_get_value(target);
|
||||||
|
lv_slider_set_value(target, old + val, anm);
|
||||||
|
lv_event_send(target, LV_EVENT_VALUE_CHANGED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_keyboard_set_target(lv_obj_t * keyboard, lv_obj_t * textarea)
|
||||||
|
{
|
||||||
|
lv_keyboard_set_textarea(keyboard, textarea);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_flag_modify(lv_obj_t * target, int32_t flag, int value)
|
||||||
|
{
|
||||||
|
if(value == _UI_MODIFY_FLAG_TOGGLE) {
|
||||||
|
if(lv_obj_has_flag(target, flag)) lv_obj_clear_flag(target, flag);
|
||||||
|
else lv_obj_add_flag(target, flag);
|
||||||
|
}
|
||||||
|
else if(value == _UI_MODIFY_FLAG_ADD) lv_obj_add_flag(target, flag);
|
||||||
|
else lv_obj_clear_flag(target, flag);
|
||||||
|
}
|
||||||
|
void _ui_state_modify(lv_obj_t * target, int32_t state, int value)
|
||||||
|
{
|
||||||
|
if(value == _UI_MODIFY_STATE_TOGGLE) {
|
||||||
|
if(lv_obj_has_state(target, state)) lv_obj_clear_state(target, state);
|
||||||
|
else lv_obj_add_state(target, state);
|
||||||
|
}
|
||||||
|
else if(value == _UI_MODIFY_STATE_ADD) lv_obj_add_state(target, state);
|
||||||
|
else lv_obj_clear_state(target, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_textarea_move_cursor(lv_obj_t * target, int val)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
if(val == UI_MOVE_CURSOR_UP) lv_textarea_cursor_up(target);
|
||||||
|
if(val == UI_MOVE_CURSOR_RIGHT) lv_textarea_cursor_right(target);
|
||||||
|
if(val == UI_MOVE_CURSOR_DOWN) lv_textarea_cursor_down(target);
|
||||||
|
if(val == UI_MOVE_CURSOR_LEFT) lv_textarea_cursor_left(target);
|
||||||
|
lv_obj_add_state(target, LV_STATE_FOCUSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*screen_destroy_cb_t)(void);
|
||||||
|
|
||||||
|
void scr_unloaded_delete_cb(lv_event_t * e)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
// Get the destroy callback from user_data
|
||||||
|
|
||||||
|
screen_destroy_cb_t destroy_cb = lv_event_get_user_data(e);
|
||||||
|
if(destroy_cb) {
|
||||||
|
|
||||||
|
destroy_cb(); // call the specific screen destroy function
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_opacity_set(lv_obj_t * target, int val)
|
||||||
|
{
|
||||||
|
lv_obj_set_style_opa(target, val, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_anim_callback_free_user_data(lv_anim_t * a)
|
||||||
|
{
|
||||||
|
lv_mem_free(a->user_data);
|
||||||
|
a->user_data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_x(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_obj_set_x(usr->target, v);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_y(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_obj_set_y(usr->target, v);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_width(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_obj_set_width(usr->target, v);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_height(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_obj_set_height(usr->target, v);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_opacity(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_obj_set_style_opa(usr->target, v, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_image_zoom(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_img_set_zoom(usr->target, v);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_image_angle(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
lv_img_set_angle(usr->target, v);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_anim_callback_set_image_frame(lv_anim_t * a, int32_t v)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
usr->val = v;
|
||||||
|
|
||||||
|
if(v < 0) v = 0;
|
||||||
|
if(v >= usr->imgset_size) v = usr->imgset_size - 1;
|
||||||
|
lv_img_set_src(usr->target, usr->imgset[v]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_x(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_obj_get_x_aligned(usr->target);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_y(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_obj_get_y_aligned(usr->target);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_width(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_obj_get_width(usr->target);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_height(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_obj_get_height(usr->target);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_opacity(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_obj_get_style_opa(usr->target, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_image_zoom(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_img_get_zoom(usr->target);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_image_angle(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return lv_img_get_angle(usr->target);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t _ui_anim_callback_get_image_frame(lv_anim_t * a)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data;
|
||||||
|
return usr->val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_arc_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix)
|
||||||
|
{
|
||||||
|
char buf[_UI_TEMPORARY_STRING_BUFFER_SIZE];
|
||||||
|
|
||||||
|
lv_snprintf(buf, sizeof(buf), "%s%d%s", prefix, (int)lv_arc_get_value(src), postfix);
|
||||||
|
|
||||||
|
lv_label_set_text(trg, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_slider_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix)
|
||||||
|
{
|
||||||
|
char buf[_UI_TEMPORARY_STRING_BUFFER_SIZE];
|
||||||
|
|
||||||
|
lv_snprintf(buf, sizeof(buf), "%s%d%s", prefix, (int)lv_slider_get_value(src), postfix);
|
||||||
|
|
||||||
|
lv_label_set_text(trg, buf);
|
||||||
|
}
|
||||||
|
void _ui_checked_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * txt_on, const char * txt_off)
|
||||||
|
{
|
||||||
|
if(lv_obj_has_state(src, LV_STATE_CHECKED)) lv_label_set_text(trg, txt_on);
|
||||||
|
else lv_label_set_text(trg, txt_off);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_spinbox_step(lv_obj_t * target, int val)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
if(val > 0) lv_spinbox_increment(target);
|
||||||
|
|
||||||
|
else lv_spinbox_decrement(target);
|
||||||
|
|
||||||
|
|
||||||
|
lv_event_send(target, LV_EVENT_VALUE_CHANGED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_switch_theme(int val)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef UI_THEME_ACTIVE
|
||||||
|
ui_theme_set(val);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
1684
Pantalla/src/ui/ui_img_logo_volante_png.c
Normal file
1684
Pantalla/src/ui/ui_img_logo_volante_png.c
Normal file
File diff suppressed because it is too large
Load diff
2701
Pantalla/src/ui/ui_settingscreen.c
Normal file
2701
Pantalla/src/ui/ui_settingscreen.c
Normal file
File diff suppressed because it is too large
Load diff
209
Pantalla/src/ui/ui_theme_manager.cpp
Normal file
209
Pantalla/src/ui/ui_theme_manager.cpp
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.4.3+
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: design
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
|
||||||
|
_ui_local_style_t* _ui_local_styles;
|
||||||
|
uint32_t _ui_local_style_count = 0;
|
||||||
|
|
||||||
|
|
||||||
|
inline void ui_object_set_local_style_property
|
||||||
|
(lv_obj_t* object_p, lv_style_selector_t selector, lv_style_prop_t property, ui_style_variable_t value ) {
|
||||||
|
if ( object_p!=NULL /*&& lv_obj_is_valid(object_p)*/ ) {
|
||||||
|
lv_obj_set_local_style_prop( object_p, property, _ui_style_value_convert( property, value ), selector );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Atomic function to set (and register) an LVGL local style-property for a given part+state (selector) of an object (widget) - can be used in many ways due to being atomic
|
||||||
|
void ui_object_set_themeable_style_property
|
||||||
|
(lv_obj_t* object_p, lv_style_selector_t selector, lv_style_prop_t property, const ui_theme_variable_t* theme_variable_p) {
|
||||||
|
static _ui_local_style_t* local_style_p;
|
||||||
|
static _ui_local_style_property_setting_t* property_setting_p;
|
||||||
|
|
||||||
|
if (object_p==NULL /*|| !lv_obj_is_valid(object_p)*/ || theme_variable_p==NULL) return;
|
||||||
|
local_style_p = _ui_local_style_create( theme_variable_p, true );
|
||||||
|
if (local_style_p == NULL) return;
|
||||||
|
property_setting_p = _ui_local_style_property_setting_create( local_style_p, object_p, selector, property );
|
||||||
|
if (property_setting_p == NULL) return;
|
||||||
|
|
||||||
|
lv_obj_set_local_style_prop( object_p, property, _ui_style_value_convert( property, ui_get_theme_value(theme_variable_p) ), selector ); //ui_object_set_local_style_property( object_p, selector, property, ui_get_theme_value(theme_variable_p) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//This function goes through all registered style-property settings and if theme is changed, sets all of them to the theme. (If called periodically, it can follow change of values automatically.)
|
||||||
|
void _ui_theme_set_variable_styles (uint8_t mode) {
|
||||||
|
static uint8_t ui_theme_idx_previous = -1;
|
||||||
|
static uint32_t i, j;
|
||||||
|
static _ui_local_style_property_setting_t* property_setting_p;
|
||||||
|
static ui_style_variable_t style_value;
|
||||||
|
static ui_style_variable_t* style_variable_p;
|
||||||
|
|
||||||
|
uint8_t ui_Theme_Changed = (ui_theme_idx != ui_theme_idx_previous); ui_theme_idx_previous = ui_theme_idx;
|
||||||
|
|
||||||
|
for (i = 0; i < _ui_local_style_count; ++i) {
|
||||||
|
|
||||||
|
style_variable_p = _ui_local_styles[i].style_variable_p;
|
||||||
|
if (_ui_local_styles[i].is_themeable) style_value = ui_get_theme_value( style_variable_p );
|
||||||
|
else style_value = *style_variable_p;
|
||||||
|
|
||||||
|
if (style_variable_p != _ui_local_styles[i].previous_pointer || style_value != _ui_local_styles[i].previous_value
|
||||||
|
|| mode == UI_VARIABLE_STYLES_MODE_INIT || ui_Theme_Changed) {
|
||||||
|
_ui_local_styles[i].previous_pointer = style_variable_p; _ui_local_styles[i].previous_value = style_value;
|
||||||
|
|
||||||
|
property_setting_p = _ui_local_styles[i].style_property_settings; //first item of linked list
|
||||||
|
for (j = 0; j < _ui_local_styles[i].style_property_setting_count; ++j) {
|
||||||
|
if (property_setting_p->object_p != NULL) {
|
||||||
|
ui_object_set_local_style_property (
|
||||||
|
property_setting_p->object_p, property_setting_p->selector, property_setting_p->property, style_value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (property_setting_p->next_p != NULL) property_setting_p = (_ui_local_style_property_setting_t*) property_setting_p->next_p; //get next item in linked-list for next round
|
||||||
|
else break; //this shouldn't happen, but if it does, it's assumed end of the list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ui_style_variable_t ui_get_theme_value(const ui_theme_variable_t* var) {
|
||||||
|
return var[ui_theme_idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
lv_style_value_t _ui_style_value_convert (lv_style_prop_t property, ui_style_variable_t value) {
|
||||||
|
static lv_style_value_t Style_Value; //LVGL would produce artefacts if both .num and .color were set for the local style to add:
|
||||||
|
//static lv_style_const_prop_t ValueConvert_Table [_LV_STYLE_NUM_BUILT_IN_PROPS] = { [LV_STYLE_BG_COLOR] = LV_STYLE_CONST_BG_COLOR(1), [LV_STYLE_BG_OPA] = LV_STYLE_CONST_BG_OPA(1) };
|
||||||
|
if (property==LV_STYLE_BG_COLOR || property==LV_STYLE_BG_GRAD_COLOR || property==LV_STYLE_BG_IMG_RECOLOR || property==LV_STYLE_BORDER_COLOR
|
||||||
|
|| property==LV_STYLE_OUTLINE_COLOR || property==LV_STYLE_SHADOW_COLOR || property==LV_STYLE_IMG_RECOLOR || property==LV_STYLE_LINE_COLOR
|
||||||
|
|| property==LV_STYLE_ARC_COLOR || property==LV_STYLE_TEXT_COLOR) {
|
||||||
|
Style_Value.color = lv_color_hex(value);
|
||||||
|
}
|
||||||
|
else if (property==LV_STYLE_BG_GRAD || property==LV_STYLE_BG_IMG_SRC || property==LV_STYLE_ARC_IMG_SRC || property==LV_STYLE_TEXT_FONT
|
||||||
|
|| property==LV_STYLE_COLOR_FILTER_DSC || property==LV_STYLE_ANIM || property==LV_STYLE_TRANSITION) {
|
||||||
|
Style_Value.ptr = (void*)(uintptr_t) value;
|
||||||
|
}
|
||||||
|
else Style_Value.num = value;
|
||||||
|
return Style_Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//auto-update dynamic local style array with existing/new style-variable (1st dimension)
|
||||||
|
_ui_local_style_t* _ui_local_style_create (const ui_style_variable_t* style_variable_p, bool is_themeable) {
|
||||||
|
static uint32_t i;
|
||||||
|
static _ui_local_style_t* local_style_p;
|
||||||
|
|
||||||
|
for (i = 0; i < _ui_local_style_count; ++i) { //Find existing local style
|
||||||
|
if (_ui_local_styles[i].style_variable_p == style_variable_p) return &_ui_local_styles[i];
|
||||||
|
}
|
||||||
|
//If not found, create new local style
|
||||||
|
_ui_local_styles = (_ui_local_style_t*) lv_mem_realloc( _ui_local_styles, (_ui_local_style_count + 1) * sizeof(_ui_local_style_t) );
|
||||||
|
LV_ASSERT_MALLOC( _ui_local_styles );
|
||||||
|
if (_ui_local_styles == NULL) return NULL;
|
||||||
|
//Reset new local style
|
||||||
|
local_style_p = &_ui_local_styles[ _ui_local_style_count ];
|
||||||
|
local_style_p->style_variable_p = (ui_style_variable_t*) style_variable_p;
|
||||||
|
local_style_p->is_themeable = is_themeable;
|
||||||
|
local_style_p->previous_pointer = NULL;
|
||||||
|
local_style_p->previous_value = -1;
|
||||||
|
local_style_p->style_property_setting_count = 0;
|
||||||
|
local_style_p->style_property_settings = NULL;
|
||||||
|
/*#ifdef LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD
|
||||||
|
local_style_p->garbage_collector_couter = 0;
|
||||||
|
#endif*/
|
||||||
|
|
||||||
|
++_ui_local_style_count;
|
||||||
|
return local_style_p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _ui_local_style_property_setting_delete (lv_event_t* event) { * (lv_obj_t**) lv_event_get_user_data( event ) = NULL; }
|
||||||
|
|
||||||
|
//auto-update dynamic local style-array's 2nd dimension (object part+state style-property settings for a given style-variable)
|
||||||
|
_ui_local_style_property_setting_t* _ui_local_style_property_setting_create
|
||||||
|
(_ui_local_style_t* local_style_p, lv_obj_t* object_p, lv_style_selector_t selector, lv_style_prop_t property) {
|
||||||
|
static uint32_t i; //auto-update
|
||||||
|
static _ui_local_style_property_setting_t *style_property_setting_p, *empty_style_property_setting_p;
|
||||||
|
|
||||||
|
/*#ifdef LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD
|
||||||
|
style_property_setting_p = local_style_p->style_property_settings; //first item of linked list
|
||||||
|
if (style_property_setting_p != NULL) { //checking might be unnecessary if count is properly initialized to 0
|
||||||
|
if (local_style_p->garbage_collector_couter > 0) --local_style_p->garbage_collector_couter; //avoid calling garbage collector every time
|
||||||
|
else if (LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD > 0) {
|
||||||
|
local_style_p->garbage_collector_couter = LV_SQUARELINE_THEME__EXPLICIT_GARBAGE_COLLECTOR_PERIOD - 1;
|
||||||
|
for (i = 0; i < local_style_p->style_property_setting_count; ++i) {
|
||||||
|
if (style_property_setting_p->object_p != NULL) { //check only valid object entry (skip already emptied positions{
|
||||||
|
#if ( defined(LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE) && LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE ) //Not recommended inside explicit garbage collector.
|
||||||
|
if ( style_property_setting_p->validcheck_counter > 0 ) --style_property_setting_p->validcheck_counter; //avoids calling complex lv_obj_is_valid() many times
|
||||||
|
else { //check objects with expired positive vaidity check
|
||||||
|
if ( lv_obj_is_valid( style_property_setting_p->object_p ) ) style_property_setting_p->validcheck_counter = LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE;
|
||||||
|
else style_property_setting_p->object_p = NULL; //free up an entry of a deleted widget
|
||||||
|
}
|
||||||
|
#else //this is the recommended variant inside explicit garbage collector:
|
||||||
|
if ( !lv_obj_is_valid( style_property_setting_p->object_p ) ) style_property_setting_p->object_p = NULL; //free up an entry of a deleted widget
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (style_property_setting_p->next_p != NULL) style_property_setting_p = (_ui_local_style_property_setting_t*) style_property_setting_p->next_p; //get next item in linked-list for next round
|
||||||
|
else break; //this shouldn't happen
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif*/
|
||||||
|
style_property_setting_p = local_style_p->style_property_settings; //first item of linked list
|
||||||
|
empty_style_property_setting_p = NULL;
|
||||||
|
if (style_property_setting_p != NULL) { //checking might be unnecessary if count is properly initialized to 0
|
||||||
|
for (i = 0; i < local_style_p->style_property_setting_count; ++i) {
|
||||||
|
if (empty_style_property_setting_p == NULL) { //search and register one empty position that might be needed for a newly created entry
|
||||||
|
if (style_property_setting_p->object_p == NULL) empty_style_property_setting_p = style_property_setting_p; //if found empty position, register it
|
||||||
|
/*#ifdef LV_SQUARELINE_THEME__IMPLICIT_GARBAGE_COLLECTOR
|
||||||
|
else { //if not, check for possible empty positions of deleted objects (garbage-collection)
|
||||||
|
#if ( defined(LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE) && LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE ) //for slow hardware, adding this and setting to 5..10 in lv_conf.h might make it faster
|
||||||
|
if ( style_property_setting_p->validcheck_counter > 0 ) --style_property_setting_p->validcheck_counter; //avoids calling complex lv_obj_is_valid() many times
|
||||||
|
else { //check objects with expired positive vaidity check
|
||||||
|
if ( lv_obj_is_valid( style_property_setting_p->object_p ) ) style_property_setting_p->validcheck_counter = LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE;
|
||||||
|
else { //free up an entry of a deleted widget
|
||||||
|
style_property_setting_p->object_p = NULL;
|
||||||
|
empty_style_property_setting_p = style_property_setting_p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if ( !lv_obj_is_valid( style_property_setting_p->object_p ) ) { //free up an entry of a deleted widget
|
||||||
|
style_property_setting_p->object_p = NULL;
|
||||||
|
empty_style_property_setting_p = style_property_setting_p;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif*/
|
||||||
|
}
|
||||||
|
if (style_property_setting_p->object_p == object_p && style_property_setting_p->selector == selector
|
||||||
|
&& style_property_setting_p->property == property) { //setting found in the list (created already), so returning it
|
||||||
|
return style_property_setting_p;
|
||||||
|
}
|
||||||
|
if (style_property_setting_p->next_p != NULL) style_property_setting_p = (_ui_local_style_property_setting_t*) style_property_setting_p->next_p; //get next item in linked-list for next round
|
||||||
|
else break; //this shouldn't happen, but if it does, create a new element
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//If not found, create new local style-property (can be inside the array at freed-up places of deleted objects too)
|
||||||
|
if (empty_style_property_setting_p == NULL) { //allocate new
|
||||||
|
empty_style_property_setting_p = (_ui_local_style_property_setting_t*) lv_mem_alloc( sizeof(_ui_local_style_property_setting_t) );
|
||||||
|
LV_ASSERT_MALLOC( empty_style_property_setting_p );
|
||||||
|
if (empty_style_property_setting_p == NULL) return NULL;
|
||||||
|
if (style_property_setting_p != NULL) style_property_setting_p->next_p = (void*) empty_style_property_setting_p; //create link from last item to the new
|
||||||
|
else local_style_p->style_property_settings = empty_style_property_setting_p; //(except if creating first item)
|
||||||
|
style_property_setting_p = empty_style_property_setting_p; //take the new item pointer for initialization
|
||||||
|
style_property_setting_p->next_p = NULL; //signify the end of the linked list, just in case
|
||||||
|
++local_style_p->style_property_setting_count;
|
||||||
|
}
|
||||||
|
else { //reuse empty
|
||||||
|
style_property_setting_p = empty_style_property_setting_p;
|
||||||
|
}
|
||||||
|
style_property_setting_p->object_p = object_p; lv_obj_add_event_cb( object_p, _ui_local_style_property_setting_delete, LV_EVENT_DELETE, &style_property_setting_p->object_p );
|
||||||
|
style_property_setting_p->selector = selector;
|
||||||
|
style_property_setting_p->property = property;
|
||||||
|
/*#ifdef LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE
|
||||||
|
style_property_setting_p->validcheck_counter = LV_SQUARELINE_THEME__OBJECT_VALIDITY_CACHE; //0
|
||||||
|
#endif*/
|
||||||
|
return style_property_setting_p;
|
||||||
|
}
|
||||||
|
|
||||||
28
Pantalla/src/ui/ui_themes.cpp
Normal file
28
Pantalla/src/ui/ui_themes.cpp
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
// This file was generated by SquareLine Studio
|
||||||
|
// SquareLine Studio version: SquareLine Studio 1.6.0
|
||||||
|
// LVGL version: 8.3.11
|
||||||
|
// Project name: G26_v3
|
||||||
|
|
||||||
|
#include "../../include/ui/ui.h"
|
||||||
|
|
||||||
|
|
||||||
|
const ui_theme_variable_t _ui_theme_color_fondo[3] = {0x232323, 0x232323, 0xE9E9E9};
|
||||||
|
const ui_theme_variable_t _ui_theme_alpha_fondo[3] = {255, 255, 255};
|
||||||
|
|
||||||
|
const ui_theme_variable_t _ui_theme_color_texto[3] = {0xD2D2D2, 0xD2D2D2, 0x202020};
|
||||||
|
const ui_theme_variable_t _ui_theme_alpha_texto[3] = {255, 255, 255};
|
||||||
|
|
||||||
|
const ui_theme_variable_t _ui_theme_color_fbarra[3] = {0x3A3A3A, 0x3A3A3A, 0xAAAAAA};
|
||||||
|
const ui_theme_variable_t _ui_theme_alpha_fbarra[3] = {255, 255, 255};
|
||||||
|
|
||||||
|
const ui_theme_variable_t _ui_theme_color_barrar[3] = {0x422727, 0x422727, 0xBC5C5C};
|
||||||
|
const ui_theme_variable_t _ui_theme_alpha_barrar[3] = {255, 255, 255};
|
||||||
|
uint8_t ui_theme_idx = UI_THEME_OSCURO;
|
||||||
|
|
||||||
|
|
||||||
|
void ui_theme_set(uint8_t theme_idx)
|
||||||
|
{
|
||||||
|
ui_theme_idx = theme_idx;
|
||||||
|
_ui_theme_set_variable_styles(UI_VARIABLE_STYLES_MODE_FOLLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
from django.contrib import admin
|
|
||||||
from .models import Documento, Factura
|
|
||||||
|
|
||||||
@admin.register(Documento)
|
|
||||||
class DocumentoAdmin(admin.ModelAdmin):
|
|
||||||
# Columnas principales
|
|
||||||
list_display = ('nombre', 'categoria', 'tipo', 'subido_por', 'fecha_subida')
|
|
||||||
|
|
||||||
# Filtros por área técnica, tipo de documento y temporada del documento
|
|
||||||
list_filter = ('categoria', 'tipo', 'temporada')
|
|
||||||
|
|
||||||
# Buscador de documentos por su nombre o descripción
|
|
||||||
search_fields = ('nombre', 'descripcion')
|
|
||||||
|
|
||||||
# Para asignar a que temporada pertenece el documento
|
|
||||||
filter_horizontal = ('temporada',)
|
|
||||||
|
|
||||||
# Automatización: para rellenar el creador del nuevo documento de manera automática
|
|
||||||
def save_model(self, request, obj, form, change):
|
|
||||||
if not obj.subido_por:
|
|
||||||
obj.subido_por = request.user
|
|
||||||
super().save_model(request, obj, form, change)
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Factura)
|
|
||||||
class FacturaAdmin(admin.ModelAdmin):
|
|
||||||
# Herncia de Documento
|
|
||||||
list_display = ('nombre', 'empresa', 'importe', 'categoria', 'subido_por', 'fecha_subida')
|
|
||||||
|
|
||||||
list_filter = ('categoria', 'temporada')
|
|
||||||
search_fields = ('nombre', 'empresa', 'descripcion')
|
|
||||||
|
|
||||||
filter_horizontal = ('temporada',)
|
|
||||||
|
|
||||||
# Mantenemos la misma automatización
|
|
||||||
def save_model(self, request, obj, form, change):
|
|
||||||
if not obj.subido_por:
|
|
||||||
obj.subido_por = request.user
|
|
||||||
super().save_model(request, obj, form, change)
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
from django.apps import AppConfig
|
|
||||||
|
|
||||||
|
|
||||||
class DocumentosConfig(AppConfig):
|
|
||||||
name = 'documentos'
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-02-17 11:36
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('temporadas', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Documento',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('titulo', models.CharField(max_length=100, verbose_name='Título del documento')),
|
|
||||||
('archivo', models.FileField(upload_to='ingenieria_docs/')),
|
|
||||||
('categoria', models.CharField(choices=[('aerodinamica', 'Aerodinámica'), ('chasis', 'Chasis'), ('suspension', 'Suspensión'), ('motor', 'Motor/Powertrain'), ('electronica', 'Electrónica'), ('general', 'General / Normativa')], max_length=20)),
|
|
||||||
('tipo', models.CharField(choices=[('diseno', 'Diseño / CAD'), ('simulacion', 'Simulación'), ('informe', 'Informe Técnico'), ('factura', 'Factura / Presupuesto'), ('otro', 'Otro')], default='informe', max_length=20)),
|
|
||||||
('descripcion', models.TextField(blank=True, null=True, verbose_name='Descripción o notas')),
|
|
||||||
('fecha_subida', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('subido_por', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='documentos_subidos', to=settings.AUTH_USER_MODEL)),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Documento Técnico',
|
|
||||||
'verbose_name_plural': 'Documentos de Ingeniería',
|
|
||||||
'ordering': ['-fecha_subida'],
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-03-06 19:29
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('documentos', '0001_initial'),
|
|
||||||
('temporadas', '0002_temporada_miembros'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Factura',
|
|
||||||
fields=[
|
|
||||||
('documento_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='documentos.documento')),
|
|
||||||
('empresa', models.CharField(max_length=100, verbose_name='Nombre de la empresa')),
|
|
||||||
('importe', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Importe (€)')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Factura',
|
|
||||||
'verbose_name_plural': 'Facturas',
|
|
||||||
},
|
|
||||||
bases=('documentos.documento',),
|
|
||||||
),
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='documento',
|
|
||||||
options={'ordering': ['-fecha_subida'], 'verbose_name': 'Documento', 'verbose_name_plural': 'Documentos'},
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='documento',
|
|
||||||
name='titulo',
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='documento',
|
|
||||||
name='nombre',
|
|
||||||
field=models.CharField(default='Documento antiguo', max_length=100, verbose_name='Nombre del documento'),
|
|
||||||
preserve_default=False,
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='documento',
|
|
||||||
name='categoria',
|
|
||||||
field=models.CharField(choices=[('aerodinamica', 'Aerodinámica'), ('chasis', 'Chasis'), ('business', 'Business & Operations'), ('e_powertrain', 'E-Powertrain'), ('electronica', 'Electrónica'), ('sdf', 'SDF'), ('motor_transmision', 'Motor & Transmisión'), ('software', 'Software'), ('normativa', 'General / Normativa')], max_length=20),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='documento',
|
|
||||||
name='descripcion',
|
|
||||||
field=models.TextField(blank=True, null=True, verbose_name='Descripción del documento'),
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='documento',
|
|
||||||
name='temporada',
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='documento',
|
|
||||||
name='tipo',
|
|
||||||
field=models.CharField(choices=[('fabricacion', 'Fabricación'), ('diseno', 'Diseño / CAD'), ('concepto', 'Concepto'), ('simulacion', 'Simulación'), ('dossier_patrocinado', 'Dossier Patrocinio'), ('informe', 'Informe'), ('tutorial', 'Tutorial'), ('otro', 'Otro')], default='informe', max_length=20),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='documento',
|
|
||||||
name='temporada',
|
|
||||||
field=models.ManyToManyField(related_name='documentos_asociados', to='temporadas.temporada'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-06-30 16:00
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('documentos', '0002_factura_alter_documento_options_and_more'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='factura',
|
|
||||||
name='estado',
|
|
||||||
field=models.CharField(choices=[('pendiente', 'Pendiente'), ('aceptada', 'Aceptada'), ('rechazada', 'Rechazada')], default='pendiente', max_length=20),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
from django.db import models
|
|
||||||
from users.models import CustomUser
|
|
||||||
from temporadas.models import Temporada
|
|
||||||
import os
|
|
||||||
|
|
||||||
class Documento(models.Model):
|
|
||||||
# Opciones de categorías (puedes añadir más)
|
|
||||||
CATEGORIAS = (
|
|
||||||
('aerodinamica', 'Aerodinámica'),
|
|
||||||
('chasis', 'Chasis'),
|
|
||||||
('business', 'Business & Operations'),
|
|
||||||
('e_powertrain', 'E-Powertrain'),
|
|
||||||
('electronica', 'Electrónica'),
|
|
||||||
('sdf', 'SDF'),
|
|
||||||
('motor_transmision', 'Motor & Transmisión'),
|
|
||||||
('software', 'Software'),
|
|
||||||
('normativa', 'General / Normativa'),
|
|
||||||
)
|
|
||||||
|
|
||||||
TIPO_DOC = (
|
|
||||||
('fabricacion', 'Fabricación'),
|
|
||||||
('diseno', 'Diseño / CAD'),
|
|
||||||
('concepto', 'Concepto'),
|
|
||||||
('simulacion', 'Simulación'),
|
|
||||||
('dossier_patrocinado', 'Dossier Patrocinio'),
|
|
||||||
('informe', 'Informe'),
|
|
||||||
('tutorial', 'Tutorial'),
|
|
||||||
('otro', 'Otro'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# CAMPOS
|
|
||||||
nombre = models.CharField(max_length=100, verbose_name="Nombre del documento")
|
|
||||||
|
|
||||||
# Aquí definimos dónde se guardan los archivos.
|
|
||||||
# upload_to='ingenieria/' creará esa carpeta automáticamente.
|
|
||||||
archivo = models.FileField(upload_to='ingenieria_docs/')
|
|
||||||
|
|
||||||
categoria = models.CharField(max_length=20, choices=CATEGORIAS)
|
|
||||||
tipo = models.CharField(max_length=20, choices=TIPO_DOC, default='informe')
|
|
||||||
descripcion = models.TextField(blank=True, null=True, verbose_name="Descripción del documento")
|
|
||||||
fecha_subida = models.DateTimeField(auto_now_add=True)
|
|
||||||
|
|
||||||
# RELACIONES
|
|
||||||
# Relacion Documento - Temporadas (Relación 1..* a 1..* )
|
|
||||||
temporada = models.ManyToManyField(Temporada, related_name="documentos_asociados")
|
|
||||||
|
|
||||||
# 2. Relación 1 a N con el Usuario (Miembros)
|
|
||||||
subido_por = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, related_name="documentos_subidos")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Documento"
|
|
||||||
verbose_name_plural = "Documentos"
|
|
||||||
ordering = ['-fecha_subida']
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"{self.nombre} ({self.get_categoria_display()})"
|
|
||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
|
||||||
# Esto borra el archivo físico del disco duro cuando borras la entrada en la base de datos
|
|
||||||
if self.archivo:
|
|
||||||
if os.path.isfile(self.archivo.path):
|
|
||||||
os.remove(self.archivo.path)
|
|
||||||
super().delete(*args, **kwargs)
|
|
||||||
|
|
||||||
ESTADO_FACTURA = [
|
|
||||||
('pendiente', 'Pendiente'),
|
|
||||||
('aceptada', 'Aceptada'),
|
|
||||||
('rechazada', 'Rechazada'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Herencia de la clase Factura: Factura hereda de Documento
|
|
||||||
class Factura(Documento):
|
|
||||||
# Al heredar de Documento, ya tiene nombre, archivo, categoria, etc.
|
|
||||||
empresa = models.CharField(max_length=100, verbose_name="Nombre de la empresa")
|
|
||||||
importe = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Importe (€)")
|
|
||||||
estado = models.CharField(max_length=20, choices=ESTADO_FACTURA, default='pendiente')
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Factura"
|
|
||||||
verbose_name_plural = "Facturas"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"Factura {self.empresa} - {self.importe}€"
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
from django.shortcuts import render
|
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
"""
|
|
||||||
ASGI config for gades_manager project.
|
|
||||||
|
|
||||||
It exposes the ASGI callable as a module-level variable named ``application``.
|
|
||||||
|
|
||||||
For more information on this file, see
|
|
||||||
https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from django.core.asgi import get_asgi_application
|
|
||||||
|
|
||||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gades_manager.settings')
|
|
||||||
|
|
||||||
application = get_asgi_application()
|
|
||||||
|
|
@ -1,141 +0,0 @@
|
||||||
"""
|
|
||||||
Django settings for gades_manager project.
|
|
||||||
|
|
||||||
Generated by 'django-admin startproject' using Django 6.0.2.
|
|
||||||
|
|
||||||
For more information on this file, see
|
|
||||||
https://docs.djangoproject.com/en/6.0/topics/settings/
|
|
||||||
|
|
||||||
For the full list of settings and their values, see
|
|
||||||
https://docs.djangoproject.com/en/6.0/ref/settings/
|
|
||||||
"""
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
||||||
|
|
||||||
|
|
||||||
# Quick-start development settings - unsuitable for production
|
|
||||||
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/
|
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
|
||||||
SECRET_KEY = 'django-insecure-mwlyo^0ax9u9ts5(hw(e&vlgmr$nbla-3az0d%s(lymmp5^)$-'
|
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
|
||||||
DEBUG = True
|
|
||||||
|
|
||||||
ALLOWED_HOSTS = []
|
|
||||||
|
|
||||||
|
|
||||||
# Application definition
|
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
|
||||||
'users',
|
|
||||||
'temporadas',
|
|
||||||
'documentos',
|
|
||||||
'gestion',
|
|
||||||
'pruebas',
|
|
||||||
'django.contrib.admin',
|
|
||||||
'django.contrib.auth',
|
|
||||||
'django.contrib.contenttypes',
|
|
||||||
'django.contrib.sessions',
|
|
||||||
'django.contrib.messages',
|
|
||||||
'django.contrib.staticfiles',
|
|
||||||
]
|
|
||||||
|
|
||||||
MIDDLEWARE = [
|
|
||||||
'django.middleware.security.SecurityMiddleware',
|
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
||||||
'django.middleware.common.CommonMiddleware',
|
|
||||||
'django.middleware.csrf.CsrfViewMiddleware',
|
|
||||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
|
||||||
]
|
|
||||||
|
|
||||||
ROOT_URLCONF = 'gades_manager.urls'
|
|
||||||
|
|
||||||
TEMPLATES = [
|
|
||||||
{
|
|
||||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
|
||||||
'DIRS': [BASE_DIR / 'templates'],
|
|
||||||
'APP_DIRS': True,
|
|
||||||
'OPTIONS': {
|
|
||||||
'context_processors': [
|
|
||||||
'django.template.context_processors.debug',
|
|
||||||
'django.template.context_processors.request',
|
|
||||||
'django.contrib.auth.context_processors.auth',
|
|
||||||
'django.contrib.messages.context_processors.messages',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
WSGI_APPLICATION = 'gades_manager.wsgi.application'
|
|
||||||
|
|
||||||
|
|
||||||
# Database
|
|
||||||
# https://docs.djangoproject.com/en/6.0/ref/settings/#databases
|
|
||||||
|
|
||||||
DATABASES = {
|
|
||||||
'default': {
|
|
||||||
'ENGINE': 'django.db.backends.mysql',
|
|
||||||
'NAME': 'formula_gades_bd', # El nombre exacto que pusiste en Workbench
|
|
||||||
'USER': 'root',
|
|
||||||
'PASSWORD': 'admin1234', # ¡La que apuntaste en el papel!
|
|
||||||
'HOST': 'localhost', # Significa "este ordenador"
|
|
||||||
'PORT': '3306',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Password validation
|
|
||||||
# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators
|
|
||||||
|
|
||||||
AUTH_PASSWORD_VALIDATORS = [
|
|
||||||
{
|
|
||||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
# Internationalization
|
|
||||||
# https://docs.djangoproject.com/en/6.0/topics/i18n/
|
|
||||||
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
|
||||||
|
|
||||||
TIME_ZONE = 'UTC'
|
|
||||||
|
|
||||||
USE_I18N = True
|
|
||||||
|
|
||||||
USE_TZ = True
|
|
||||||
|
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
|
||||||
# https://docs.djangoproject.com/en/6.0/howto/static-files/
|
|
||||||
|
|
||||||
STATIC_URL = '/static/'
|
|
||||||
|
|
||||||
STATICFILES_DIRS = [
|
|
||||||
BASE_DIR / "static",
|
|
||||||
]
|
|
||||||
|
|
||||||
AUTH_USER_MODEL = 'users.CustomUser'
|
|
||||||
|
|
||||||
MEDIA_URL = '/media/' # La URL pública (ej: tudominio.com/media/archivo.pdf)
|
|
||||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # La carpeta física en tu ordenador
|
|
||||||
|
|
||||||
LOGIN_URL = 'login'
|
|
||||||
LOGIN_REDIRECT_URL = 'inicio'
|
|
||||||
LOGOUT_REDIRECT_URL = 'login'
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
"""
|
|
||||||
URL configuration for gades_manager project.
|
|
||||||
|
|
||||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
|
||||||
https://docs.djangoproject.com/en/6.0/topics/http/urls/
|
|
||||||
Examples:
|
|
||||||
Function views
|
|
||||||
1. Add an import: from my_app import views
|
|
||||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
|
||||||
Class-based views
|
|
||||||
1. Add an import: from other_app.views import Home
|
|
||||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
|
||||||
Including another URLconf
|
|
||||||
1. Import the include() function: from django.urls import include, path
|
|
||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
|
||||||
"""
|
|
||||||
|
|
||||||
from django.contrib import admin
|
|
||||||
from django.urls import path
|
|
||||||
from django.contrib.auth import views as auth_views
|
|
||||||
from gestion import views
|
|
||||||
from users import views as users_views
|
|
||||||
from temporadas import views as temporadas_views
|
|
||||||
from pruebas import views as pruebas_views
|
|
||||||
|
|
||||||
urlpatterns = [
|
|
||||||
path('admin/', admin.site.urls),
|
|
||||||
path('', views.inicio, name='inicio'),
|
|
||||||
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
|
|
||||||
path('logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'),
|
|
||||||
path('mi-perfil/', users_views.mi_perfil, name='mi_perfil'),
|
|
||||||
path('miembros/', users_views.listado_miembros, name='listado_miembros'),
|
|
||||||
path('gestion/usuarios/', users_views.gestion_usuarios, name='gestion_usuarios'),
|
|
||||||
path('gestion/usuarios/<int:pk>/editar/', users_views.editar_usuario, name='editar_usuario'),
|
|
||||||
path('gestion/usuarios/<int:pk>/eliminar/', users_views.eliminar_usuario, name='eliminar_usuario'),
|
|
||||||
path('gestion/temporadas/', temporadas_views.gestion_temporadas, name='gestion_temporadas'),
|
|
||||||
path('gestion/temporadas/crear/', temporadas_views.crear_temporada, name='crear_temporada'),
|
|
||||||
path('gestion/temporadas/<int:pk>/editar/', temporadas_views.editar_temporada, name='editar_temporada'),
|
|
||||||
path('gestion/temporadas/<int:pk>/eliminar/', temporadas_views.eliminar_temporada, name='eliminar_temporada'),
|
|
||||||
path('gestion/contabilidad/', views.contabilidad, name='contabilidad'),
|
|
||||||
path('gestion/contabilidad/gasto/anadir/', views.anadir_gasto, name='anadir_gasto'),
|
|
||||||
path('gestion/contabilidad/ingreso/anadir/', views.anadir_ingreso, name='anadir_ingreso'),
|
|
||||||
path('gestion/contabilidad/factura/<int:pk>/aceptar/', views.aceptar_factura, name='aceptar_factura'),
|
|
||||||
path('gestion/contabilidad/factura/<int:pk>/rechazar/', views.rechazar_factura, name='rechazar_factura'),
|
|
||||||
path('patrocinios/', views.patrocinios, name='patrocinios'),
|
|
||||||
path('patrocinios/proponer/', views.proponer_patrocinio, name='proponer_patrocinio'),
|
|
||||||
path('patrocinios/<int:pk>/editar/', views.editar_patrocinio, name='editar_patrocinio'),
|
|
||||||
path('patrocinios/<int:pk>/estado/', views.cambiar_estado_patrocinio, name='cambiar_estado_patrocinio'),
|
|
||||||
path('pruebas/', pruebas_views.listado_pruebas, name='listado_pruebas'),
|
|
||||||
path('pruebas/nueva/', pruebas_views.crear_prueba, name='crear_prueba'),
|
|
||||||
path('pruebas/<int:pk>/', pruebas_views.detalle_prueba, name='detalle_prueba'),
|
|
||||||
path('pruebas/<int:pk>/editar/', pruebas_views.editar_prueba, name='editar_prueba'),
|
|
||||||
path('pruebas/<int:pk>/eliminar/', pruebas_views.eliminar_prueba, name='eliminar_prueba'),
|
|
||||||
path('pruebas/<int:pk>/csv/subir/', pruebas_views.subir_csv, name='subir_csv'),
|
|
||||||
]
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
"""
|
|
||||||
WSGI config for gades_manager project.
|
|
||||||
|
|
||||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
|
||||||
|
|
||||||
For more information on this file, see
|
|
||||||
https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from django.core.wsgi import get_wsgi_application
|
|
||||||
|
|
||||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gades_manager.settings')
|
|
||||||
|
|
||||||
application = get_wsgi_application()
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
from django.contrib import admin
|
|
||||||
from .models import Patrocinio, Pieza, Gasto, Ingreso
|
|
||||||
|
|
||||||
# INLINES
|
|
||||||
class PiezaInline(admin.TabularInline):
|
|
||||||
model = Pieza
|
|
||||||
extra = 1
|
|
||||||
|
|
||||||
# PANEL PARA ADMINISTRACIÓN
|
|
||||||
@admin.register(Patrocinio)
|
|
||||||
class PatrocinioAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('empresa', 'estado', 'tipo_patrocinio', 'importe_economico', 'temporada', 'contacto_equipo')
|
|
||||||
|
|
||||||
# Para editar el estado y pasar de En contacto a Aceptado o Denagado desde la lista, sin tener que hacerlo manual
|
|
||||||
list_editable = ('estado',)
|
|
||||||
|
|
||||||
list_filter = ('estado', 'tipo_patrocinio', 'temporada')
|
|
||||||
search_fields = ('empresa', 'persona_contacto', 'email_contacto')
|
|
||||||
|
|
||||||
# Metemos las piezas en el patrocinio, por si hiciera falta
|
|
||||||
inlines = [PiezaInline]
|
|
||||||
|
|
||||||
@admin.register(Pieza)
|
|
||||||
class PiezaAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('nombre', 'cantidad', 'patrocinio')
|
|
||||||
search_fields = ('nombre', 'patrocinio__empresa')
|
|
||||||
|
|
||||||
# CONTABILIDAD (Gastos e Ingresos)
|
|
||||||
@admin.register(Gasto)
|
|
||||||
class GastoAdmin(admin.ModelAdmin):
|
|
||||||
# Heredamos los campos de Contabilidad
|
|
||||||
list_display = ('concepto', 'importe', 'categoria', 'fecha', 'temporada')
|
|
||||||
list_filter = ('categoria', 'temporada')
|
|
||||||
search_fields = ('concepto', 'observaciones')
|
|
||||||
|
|
||||||
# Barra de navegación por fecha de gasto
|
|
||||||
date_hierarchy = 'fecha'
|
|
||||||
|
|
||||||
@admin.register(Ingreso)
|
|
||||||
class IngresoAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('concepto', 'importe', 'categoria', 'fecha', 'temporada')
|
|
||||||
list_filter = ('categoria', 'temporada')
|
|
||||||
search_fields = ('concepto', 'observaciones')
|
|
||||||
|
|
||||||
# Barra de navegación por fecha de ingreso
|
|
||||||
date_hierarchy = 'fecha'
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
from django.apps import AppConfig
|
|
||||||
|
|
||||||
|
|
||||||
class GestionConfig(AppConfig):
|
|
||||||
name = 'gestion'
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
from django import forms
|
|
||||||
from .models import Gasto, Ingreso, Patrocinio
|
|
||||||
|
|
||||||
|
|
||||||
class GastoForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Gasto
|
|
||||||
fields = ['concepto', 'importe', 'categoria', 'observaciones']
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
for field in self.fields.values():
|
|
||||||
field.widget.attrs['class'] = 'form-control'
|
|
||||||
|
|
||||||
|
|
||||||
class IngresoForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Ingreso
|
|
||||||
fields = ['concepto', 'importe', 'categoria', 'observaciones']
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
for field in self.fields.values():
|
|
||||||
field.widget.attrs['class'] = 'form-control'
|
|
||||||
|
|
||||||
|
|
||||||
class PatrocinioForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Patrocinio
|
|
||||||
fields = ['empresa', 'email_contacto', 'persona_contacto', 'tipo_patrocinio']
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
for field in self.fields.values():
|
|
||||||
field.widget.attrs['class'] = 'form-control'
|
|
||||||
|
|
||||||
|
|
||||||
class PatrocinioEditForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Patrocinio
|
|
||||||
fields = ['empresa', 'email_contacto', 'persona_contacto', 'tipo_patrocinio', 'estado', 'importe_economico']
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
for field in self.fields.values():
|
|
||||||
field.widget.attrs['class'] = 'form-control'
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-02-19 10:14
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('temporadas', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Factura',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('nombre', models.CharField(max_length=100, verbose_name='Concepto de la factura')),
|
|
||||||
('empresa', models.CharField(max_length=100, verbose_name='Empresa / Proveedor')),
|
|
||||||
('categoria', models.CharField(choices=[('aerodinamica', 'Aerodinámica'), ('chasis', 'Chasis'), ('business', 'Business & Operations'), ('epowertrain', 'E-Powertrain'), ('electronica', 'Electrónica'), ('sdf', 'SDF'), ('motor_transmision', 'Motor & Transmisión'), ('software', 'Software'), ('general', 'General')], max_length=30)),
|
|
||||||
('descripcion', models.TextField(blank=True, null=True, verbose_name='Breve descripción')),
|
|
||||||
('archivo', models.FileField(upload_to='facturas/', verbose_name='Foto o PDF de la factura')),
|
|
||||||
('subido_por', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Usuario que la sube')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Patrocinador',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('empresa', models.CharField(max_length=100, verbose_name='Nombre de la Empresa')),
|
|
||||||
('email_contacto', models.EmailField(max_length=254, verbose_name='Correo de contacto')),
|
|
||||||
('tipo_empresa', models.CharField(max_length=30, verbose_name='Tipo de la Empresa')),
|
|
||||||
('tipo_patrocinio', models.CharField(choices=[('economico', 'Económico'), ('piezas/materiales', 'Piezas/Materiales'), ('mixto', 'Mixto (Dinero y Piezas)')], max_length=30)),
|
|
||||||
('detalle_piezas', models.TextField(blank=True, help_text='Detallar qué se ofrece si es en especies', null=True)),
|
|
||||||
('estado', models.CharField(choices=[('en contacto', 'En contacto'), ('aceptado', 'Aceptado / Activo'), ('denegado', 'Denegado')], default='contacto', max_length=20)),
|
|
||||||
('contacto_equipo', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Miembro al cargo')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-03-06 19:29
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('gestion', '0001_initial'),
|
|
||||||
('temporadas', '0002_temporada_miembros'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='patrocinador',
|
|
||||||
name='contacto_equipo',
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='patrocinador',
|
|
||||||
name='temporada',
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Gasto',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('concepto', models.CharField(max_length=150)),
|
|
||||||
('importe', models.DecimalField(decimal_places=2, max_digits=10)),
|
|
||||||
('fecha', models.DateField()),
|
|
||||||
('observaciones', models.TextField(blank=True, null=True)),
|
|
||||||
('categoria', models.CharField(choices=[('aerodinamica', 'Aerodinámica'), ('chasis', 'Chasis'), ('business', 'Business & Operations'), ('e_powertrain', 'E-Powertrain'), ('electronica', 'Electrónica'), ('sdf', 'SDF'), ('motor_transmision', 'Motor & Transmisión'), ('software', 'Software'), ('general', 'General')], max_length=30, verbose_name='Área del gasto')),
|
|
||||||
('doc_justificativo', models.FileField(blank=True, null=True, upload_to='contabilidad/gastos/', verbose_name='Ticket o Factura (PDF/IMG)')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='%(class)s_registrados', to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Gasto',
|
|
||||||
'verbose_name_plural': 'Gastos',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Ingreso',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('concepto', models.CharField(max_length=150)),
|
|
||||||
('importe', models.DecimalField(decimal_places=2, max_digits=10)),
|
|
||||||
('fecha', models.DateField()),
|
|
||||||
('observaciones', models.TextField(blank=True, null=True)),
|
|
||||||
('categoria', models.CharField(choices=[('patrocinador', 'Patrocinador'), ('donación', 'Donación'), ('premio', 'Premio'), ('recaudación', 'Recaudación'), ('Cuotas', 'Cuotas'), ('Ventas', 'ventas')], max_length=30, verbose_name='Categoria del Ingreso')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='%(class)s_registrados', to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Ingreso',
|
|
||||||
'verbose_name_plural': 'Ingresos',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Patrocinio',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('empresa', models.CharField(max_length=100, verbose_name='Nombre de la Empresa')),
|
|
||||||
('persona_contacto', models.CharField(blank=True, max_length=100, null=True, verbose_name='Persona de contacto')),
|
|
||||||
('email_contacto', models.EmailField(max_length=254, verbose_name='Correo de contacto')),
|
|
||||||
('tipo_patrocinio', models.CharField(choices=[('economico', 'Económico'), ('piezas/materiales', 'Piezas/Materiales'), ('mixto', 'Mixto (Dinero y Piezas)')], max_length=30)),
|
|
||||||
('estado', models.CharField(choices=[('en_contacto', 'En contacto'), ('aceptado', 'Aceptado / Activo'), ('denegado', 'Denegado')], default='en_contacto', max_length=20)),
|
|
||||||
('importe_economico', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='Importe (€)')),
|
|
||||||
('fecha_contacto', models.DateField(auto_now_add=True)),
|
|
||||||
('contacto_equipo', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='patrocinios_gestionados', to=settings.AUTH_USER_MODEL, verbose_name='Persona al cargo del Patrocinio')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='patrocinios', to='temporadas.temporada', verbose_name='Temporada del patrocinio')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Patrocinio',
|
|
||||||
'verbose_name_plural': 'Patrocinios',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Pieza',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('nombre', models.CharField(max_length=100, verbose_name='Nombre de la pieza/material')),
|
|
||||||
('cantidad', models.PositiveIntegerField(default=1)),
|
|
||||||
('patrocinio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='piezas', to='gestion.patrocinio')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='Factura',
|
|
||||||
),
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='Patrocinador',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
from django.db import models
|
|
||||||
from django.conf import settings
|
|
||||||
from temporadas.models import Temporada
|
|
||||||
|
|
||||||
|
|
||||||
class Patrocinio(models.Model):
|
|
||||||
|
|
||||||
TIPO_PATROCINIO = (
|
|
||||||
('economico', 'Económico'),
|
|
||||||
('piezas/materiales', 'Piezas/Materiales'),
|
|
||||||
('mixto', 'Mixto (Dinero y Piezas)'),
|
|
||||||
)
|
|
||||||
|
|
||||||
ESTADOS = (
|
|
||||||
('en_contacto', 'En contacto'),
|
|
||||||
('aceptado', 'Aceptado / Activo'),
|
|
||||||
('denegado', 'Denegado'),
|
|
||||||
)
|
|
||||||
|
|
||||||
empresa = models.CharField(max_length=100, verbose_name="Nombre de la Empresa")
|
|
||||||
persona_contacto = models.CharField(max_length=100, blank=True, null=True, verbose_name="Persona de contacto")
|
|
||||||
email_contacto = models.EmailField(verbose_name="Correo de contacto")
|
|
||||||
tipo_patrocinio = models.CharField(max_length=30, choices=TIPO_PATROCINIO)
|
|
||||||
estado = models.CharField(max_length=20, choices=ESTADOS, default='en_contacto')
|
|
||||||
|
|
||||||
# Si el patrocinio es únicamente material, se quedará en 0. Si es económico o mixto, se rellena
|
|
||||||
importe_economico = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name="Importe (€)")
|
|
||||||
|
|
||||||
fecha_contacto = models.DateField(auto_now_add=True)
|
|
||||||
# Relaciones
|
|
||||||
temporada = models.ForeignKey(Temporada, on_delete=models.CASCADE, related_name="patrocinios", verbose_name="Temporada del patrocinio")
|
|
||||||
contacto_equipo = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name="patrocinios_gestionados", verbose_name="Persona al cargo del Patrocinio")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Patrocinio"
|
|
||||||
verbose_name_plural = "Patrocinios"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"{self.empresa} ({self.get_estado_display()})"
|
|
||||||
|
|
||||||
class Pieza(models.Model):
|
|
||||||
nombre = models.CharField(max_length=100, verbose_name="Nombre de la pieza/material")
|
|
||||||
cantidad = models.PositiveIntegerField(default=1)
|
|
||||||
|
|
||||||
# COMPOSICIÓN ESTRICTA: Si se borra el Patrocinio, se borran las Piezas irremediablemente (CASCADE)
|
|
||||||
patrocinio = models.ForeignKey(Patrocinio, on_delete=models.CASCADE, related_name="piezas")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"{self.cantidad}x {self.nombre} (De: {self.patrocinio.empresa})"
|
|
||||||
|
|
||||||
class Contabilidad(models.Model):
|
|
||||||
concepto = models.CharField(max_length=150)
|
|
||||||
importe = models.DecimalField(max_digits=10, decimal_places=2)
|
|
||||||
fecha = models.DateField()
|
|
||||||
observaciones = models.TextField(blank=True, null=True)
|
|
||||||
|
|
||||||
# Relación con Temporada. PROTECT evita que borres una temporada si tiene contabilidad asociada (por temas legales)
|
|
||||||
temporada = models.ForeignKey(Temporada, on_delete=models.PROTECT, related_name="%(class)s_registrados")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
abstract = True #marcamos la clase como abstracta
|
|
||||||
ordering = ['-fecha']
|
|
||||||
|
|
||||||
|
|
||||||
class Gasto(Contabilidad):
|
|
||||||
|
|
||||||
CATEGORIAS_GASTOS = (
|
|
||||||
('aerodinamica', 'Aerodinámica'),
|
|
||||||
('chasis', 'Chasis'),
|
|
||||||
('business', 'Business & Operations'),
|
|
||||||
('e_powertrain', 'E-Powertrain'),
|
|
||||||
('electronica', 'Electrónica'),
|
|
||||||
('sdf', 'SDF'),
|
|
||||||
('motor_transmision', 'Motor & Transmisión'),
|
|
||||||
('software', 'Software'),
|
|
||||||
('general', 'General'),
|
|
||||||
)
|
|
||||||
# Hereda concepto, importe, fecha, observaciones y temporada automáticamente
|
|
||||||
categoria = models.CharField(max_length=30, choices=CATEGORIAS_GASTOS, verbose_name="Área del gasto")
|
|
||||||
doc_justificativo = models.FileField(upload_to='contabilidad/gastos/', blank=True, null=True, verbose_name="Ticket o Factura (PDF/IMG)")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Gasto"
|
|
||||||
verbose_name_plural = "Gastos"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"[-{self.importe}€] {self.concepto} ({self.temporada})"
|
|
||||||
|
|
||||||
class Ingreso(Contabilidad):
|
|
||||||
CATEGORIAS_INGRESO = (
|
|
||||||
('patrocinador', 'Patrocinador'),
|
|
||||||
('donación', 'Donación'),
|
|
||||||
('premio', 'Premio'),
|
|
||||||
('recaudación', 'Recaudación'),
|
|
||||||
('Cuotas', 'Cuotas'),
|
|
||||||
('Ventas', 'ventas'),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Hereda concepto, importe, fecha, observaciones y temporada automáticamente
|
|
||||||
categoria = models.CharField(max_length=30, choices=CATEGORIAS_INGRESO, verbose_name="Categoria del Ingreso")
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Ingreso"
|
|
||||||
verbose_name_plural = "Ingresos"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"[+{self.importe}€] {self.concepto} ({self.temporada})"
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
||||||
|
|
@ -1,202 +0,0 @@
|
||||||
from django.shortcuts import render, redirect, get_object_or_404
|
|
||||||
from django.contrib import messages
|
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from django.views.decorators.http import require_POST
|
|
||||||
from django.db.models import Sum
|
|
||||||
from datetime import date
|
|
||||||
|
|
||||||
from temporadas.models import Temporada
|
|
||||||
from documentos.models import Factura
|
|
||||||
from users.decorators import require_rol
|
|
||||||
from .models import Gasto, Ingreso, Patrocinio
|
|
||||||
from .forms import GastoForm, IngresoForm, PatrocinioForm, PatrocinioEditForm
|
|
||||||
|
|
||||||
# Categorías válidas en Gasto (Documento usa 'normativa' en su lugar de 'general')
|
|
||||||
_CATEGORIAS_GASTO_VALIDAS = {c[0] for c in Gasto.CATEGORIAS_GASTOS}
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
def inicio(request):
|
|
||||||
temporada_activa = Temporada.objects.filter(actual=True).first()
|
|
||||||
return render(request, 'index.html', {'temporada_actual': temporada_activa})
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
def contabilidad(request):
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
|
|
||||||
gastos = []
|
|
||||||
ingresos = []
|
|
||||||
facturas_pendientes = []
|
|
||||||
total_gastos = 0
|
|
||||||
total_ingresos = 0
|
|
||||||
presupuesto_inicial = 0
|
|
||||||
presupuesto_actual = 0
|
|
||||||
|
|
||||||
if temporada_actual:
|
|
||||||
gastos = Gasto.objects.filter(temporada=temporada_actual)
|
|
||||||
ingresos = Ingreso.objects.filter(temporada=temporada_actual)
|
|
||||||
facturas_pendientes = Factura.objects.filter(
|
|
||||||
temporada=temporada_actual, estado='pendiente'
|
|
||||||
)
|
|
||||||
|
|
||||||
total_gastos = gastos.aggregate(total=Sum('importe'))['total'] or 0
|
|
||||||
total_ingresos = ingresos.aggregate(total=Sum('importe'))['total'] or 0
|
|
||||||
presupuesto_inicial = temporada_actual.presupuesto
|
|
||||||
presupuesto_actual = presupuesto_inicial - total_gastos + total_ingresos
|
|
||||||
|
|
||||||
return render(request, 'contabilidad.html', {
|
|
||||||
'temporada_actual': temporada_actual,
|
|
||||||
'gastos': gastos,
|
|
||||||
'ingresos': ingresos,
|
|
||||||
'facturas_pendientes': facturas_pendientes,
|
|
||||||
'total_gastos': total_gastos,
|
|
||||||
'total_ingresos': total_ingresos,
|
|
||||||
'presupuesto_inicial': presupuesto_inicial,
|
|
||||||
'presupuesto_actual': presupuesto_actual,
|
|
||||||
'gasto_form': GastoForm(),
|
|
||||||
'ingreso_form': IngresoForm(),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
@require_POST
|
|
||||||
def anadir_gasto(request):
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
if not temporada_actual:
|
|
||||||
messages.error(request, 'No hay temporada activa.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
form = GastoForm(request.POST)
|
|
||||||
if form.is_valid():
|
|
||||||
gasto = form.save(commit=False)
|
|
||||||
gasto.fecha = date.today()
|
|
||||||
gasto.temporada = temporada_actual
|
|
||||||
gasto.save()
|
|
||||||
messages.success(request, 'Gasto añadido correctamente.')
|
|
||||||
else:
|
|
||||||
messages.error(request, 'Error al añadir el gasto. Revisa los datos.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
@require_POST
|
|
||||||
def anadir_ingreso(request):
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
if not temporada_actual:
|
|
||||||
messages.error(request, 'No hay temporada activa.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
form = IngresoForm(request.POST)
|
|
||||||
if form.is_valid():
|
|
||||||
ingreso = form.save(commit=False)
|
|
||||||
ingreso.fecha = date.today()
|
|
||||||
ingreso.temporada = temporada_actual
|
|
||||||
ingreso.save()
|
|
||||||
messages.success(request, 'Ingreso añadido correctamente.')
|
|
||||||
else:
|
|
||||||
messages.error(request, 'Error al añadir el ingreso. Revisa los datos.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
@require_POST
|
|
||||||
def aceptar_factura(request, pk):
|
|
||||||
factura = get_object_or_404(Factura, pk=pk)
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
if not temporada_actual:
|
|
||||||
messages.error(request, 'No hay temporada activa.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
categoria = factura.categoria if factura.categoria in _CATEGORIAS_GASTO_VALIDAS else 'general'
|
|
||||||
Gasto.objects.create(
|
|
||||||
concepto=factura.nombre,
|
|
||||||
importe=factura.importe,
|
|
||||||
fecha=date.today(),
|
|
||||||
categoria=categoria,
|
|
||||||
temporada=temporada_actual,
|
|
||||||
observaciones=f'Factura de {factura.empresa}',
|
|
||||||
doc_justificativo=factura.archivo,
|
|
||||||
)
|
|
||||||
factura.estado = 'aceptada'
|
|
||||||
factura.save()
|
|
||||||
messages.success(request, f'Factura de {factura.empresa} aceptada y registrada como gasto.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
@require_POST
|
|
||||||
def rechazar_factura(request, pk):
|
|
||||||
factura = get_object_or_404(Factura, pk=pk)
|
|
||||||
factura.estado = 'rechazada'
|
|
||||||
factura.save()
|
|
||||||
messages.success(request, f'Factura de {factura.empresa} rechazada.')
|
|
||||||
return redirect('contabilidad')
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
def patrocinios(request):
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
pendientes = []
|
|
||||||
aceptados = []
|
|
||||||
denegados = []
|
|
||||||
if temporada_actual:
|
|
||||||
qs = Patrocinio.objects.filter(temporada=temporada_actual).select_related('contacto_equipo')
|
|
||||||
pendientes = qs.filter(estado='en_contacto')
|
|
||||||
aceptados = qs.filter(estado='aceptado')
|
|
||||||
denegados = qs.filter(estado='denegado')
|
|
||||||
return render(request, 'patrocinios.html', {
|
|
||||||
'temporada_actual': temporada_actual,
|
|
||||||
'pendientes': pendientes,
|
|
||||||
'aceptados': aceptados,
|
|
||||||
'denegados': denegados,
|
|
||||||
'form': PatrocinioForm(),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
@require_POST
|
|
||||||
def proponer_patrocinio(request):
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
if not temporada_actual:
|
|
||||||
messages.error(request, 'No hay temporada activa. No se puede proponer un patrocinio.')
|
|
||||||
return redirect('patrocinios')
|
|
||||||
|
|
||||||
form = PatrocinioForm(request.POST)
|
|
||||||
if form.is_valid():
|
|
||||||
empresa = form.cleaned_data['empresa'].strip()
|
|
||||||
if Patrocinio.objects.filter(empresa__iexact=empresa, temporada=temporada_actual).exists():
|
|
||||||
messages.error(request, f'Ya existe un patrocinio con "{empresa}" en la temporada actual.')
|
|
||||||
else:
|
|
||||||
patrocinio = form.save(commit=False)
|
|
||||||
patrocinio.estado = 'en_contacto'
|
|
||||||
patrocinio.temporada = temporada_actual
|
|
||||||
patrocinio.contacto_equipo = request.user
|
|
||||||
patrocinio.save()
|
|
||||||
messages.success(request, f'Patrocinio de "{empresa}" propuesto correctamente.')
|
|
||||||
else:
|
|
||||||
messages.error(request, 'Error en el formulario. Revisa los datos.')
|
|
||||||
return redirect('patrocinios')
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
def editar_patrocinio(request, pk):
|
|
||||||
patrocinio = get_object_or_404(Patrocinio, pk=pk)
|
|
||||||
form = PatrocinioEditForm(request.POST or None, instance=patrocinio)
|
|
||||||
if request.method == 'POST' and form.is_valid():
|
|
||||||
form.save()
|
|
||||||
messages.success(request, 'Patrocinio actualizado correctamente.')
|
|
||||||
return redirect('patrocinios')
|
|
||||||
return render(request, 'editar_patrocinio.html', {'form': form, 'patrocinio': patrocinio})
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
@require_POST
|
|
||||||
def cambiar_estado_patrocinio(request, pk):
|
|
||||||
patrocinio = get_object_or_404(Patrocinio, pk=pk)
|
|
||||||
nuevo_estado = request.POST.get('estado')
|
|
||||||
if nuevo_estado in ('aceptado', 'denegado', 'en_contacto'):
|
|
||||||
patrocinio.estado = nuevo_estado
|
|
||||||
patrocinio.save()
|
|
||||||
messages.success(request, f'Estado de "{patrocinio.empresa}" actualizado.')
|
|
||||||
return redirect('patrocinios')
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
"""Django's command-line utility for administrative tasks."""
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""Run administrative tasks."""
|
|
||||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gades_manager.settings')
|
|
||||||
try:
|
|
||||||
from django.core.management import execute_from_command_line
|
|
||||||
except ImportError as exc:
|
|
||||||
raise ImportError(
|
|
||||||
"Couldn't import Django. Are you sure it's installed and "
|
|
||||||
"available on your PYTHONPATH environment variable? Did you "
|
|
||||||
"forget to activate a virtual environment?"
|
|
||||||
) from exc
|
|
||||||
execute_from_command_line(sys.argv)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 118 KiB |
|
|
@ -1,50 +0,0 @@
|
||||||
from django.contrib import admin
|
|
||||||
from .models import Prueba, Telemetria, Variable
|
|
||||||
|
|
||||||
# INLINES
|
|
||||||
# Usamos inlines que nos sirve para cuando se este creando un registro de Telemetría, podremos añadir sus Variables en la misma pantalla sin tener que ir a otro menú
|
|
||||||
class VariableInline(admin.TabularInline):
|
|
||||||
model = Variable
|
|
||||||
extra = 1
|
|
||||||
|
|
||||||
class TelemetriaInline(admin.TabularInline):
|
|
||||||
model = Telemetria
|
|
||||||
extra = 0
|
|
||||||
|
|
||||||
# PANELES DE ADMINISTRACIÓN
|
|
||||||
@admin.register(Prueba)
|
|
||||||
class PruebaAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('nombre', 'categoria', 'fecha_inicio', 'temporada', 'realizado_por')
|
|
||||||
|
|
||||||
# Filtros para encontrar los test dado una temporada y una área técnica
|
|
||||||
list_filter = ('categoria', 'temporada')
|
|
||||||
|
|
||||||
# Buscador de texto
|
|
||||||
search_fields = ('nombre', 'descripcion', 'resultados')
|
|
||||||
|
|
||||||
# Una barra de navegación en la parte superior, para poder hacer clic en un año y en un mes y mostrar todos los datos de ese me
|
|
||||||
date_hierarchy = 'fecha_inicio'
|
|
||||||
|
|
||||||
# Mostramos los archivos de telemetría directamente dentro del test
|
|
||||||
inlines = [TelemetriaInline]
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Telemetria)
|
|
||||||
class TelemetriaAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('nombre', 'prueba', 'fecha_subida')
|
|
||||||
|
|
||||||
# Filtra test de telemetría basandose en la temporada o área tecnica de su test correspondiente
|
|
||||||
list_filter = ('prueba__temporada', 'prueba__categoria')
|
|
||||||
|
|
||||||
# Buscador del nombre de la telemetría o por el nombre de la prueba
|
|
||||||
search_fields = ('nombre', 'prueba__nombre')
|
|
||||||
|
|
||||||
# Mostramos las variables de su telemetría
|
|
||||||
inlines = [VariableInline]
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Variable)
|
|
||||||
class VariableAdmin(admin.ModelAdmin):
|
|
||||||
# Aunque se pueden crear desde el Inline, dejamos su tabla propia por si fuese necesario, por prevenir
|
|
||||||
list_display = ('nombre', 'unidad_medida', 'telemetria')
|
|
||||||
search_fields = ('nombre', 'telemetria__nombre')
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
from django.apps import AppConfig
|
|
||||||
|
|
||||||
|
|
||||||
class PruebasConfig(AppConfig):
|
|
||||||
name = 'pruebas'
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
from django import forms
|
|
||||||
from .models import Prueba, Telemetria
|
|
||||||
|
|
||||||
|
|
||||||
class PruebaForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Prueba
|
|
||||||
fields = ['nombre', 'descripcion', 'fecha_inicio', 'fecha_fin', 'categoria', 'resultados', 'temporada']
|
|
||||||
widgets = {
|
|
||||||
'fecha_inicio': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
|
|
||||||
'fecha_fin': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class TelemetriaForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Telemetria
|
|
||||||
fields = ['nombre', 'archivo_csv']
|
|
||||||
widgets = {
|
|
||||||
'nombre': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
|
|
||||||
'archivo_csv': forms.ClearableFileInput(attrs={'class': 'form-control form-control-sm'}),
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-02-19 10:14
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('temporadas', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='TestGeneral',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('nombre', models.CharField(max_length=150, verbose_name='Nombre del Test')),
|
|
||||||
('descripcion', models.TextField(verbose_name='Objetivo / Descripción del test')),
|
|
||||||
('fecha_inicio', models.DateField()),
|
|
||||||
('fecha_fin', models.DateField()),
|
|
||||||
('categoria', models.CharField(choices=[('aerodinamica', 'Aerodinámica'), ('chasis', 'Chasis'), ('business', 'Business & Operations'), ('epowertrain', 'E-Powertrain'), ('electronica', 'Electrónica'), ('sdf', 'SDF'), ('motor_transmision', 'Motor & Transmisión'), ('general', 'General')], default='general', max_length=30)),
|
|
||||||
('resultados', models.TextField(blank=True, null=True, verbose_name='Conclusiones y Resultados')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Test General',
|
|
||||||
'verbose_name_plural': 'Tests Generales',
|
|
||||||
'ordering': ['-fecha_inicio'],
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
# Generated by Django 6.0.2 on 2026-03-06 19:29
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('pruebas', '0001_initial'),
|
|
||||||
('temporadas', '0002_temporada_miembros'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Prueba',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('nombre', models.CharField(max_length=150, verbose_name='Nombre del Test')),
|
|
||||||
('descripcion', models.TextField(verbose_name='Objetivo / Descripción de la prueba')),
|
|
||||||
('fecha_inicio', models.DateField()),
|
|
||||||
('fecha_fin', models.DateField()),
|
|
||||||
('categoria', models.CharField(choices=[('aerodinamica', 'Aerodinámica'), ('chasis', 'Chasis'), ('epowertrain', 'E-Powertrain'), ('electronica', 'Electrónica'), ('sdf', 'SDF'), ('motor_transmision', 'Motor & Transmisión'), ('software', 'Software'), ('general', 'General')], default='general', max_length=30)),
|
|
||||||
('resultados', models.TextField(blank=True, null=True, verbose_name='Conclusiones y Resultados')),
|
|
||||||
('realizado_por', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pruebas_realizadas', to=settings.AUTH_USER_MODEL, verbose_name='Realizado por')),
|
|
||||||
('temporada', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pruebas', to='temporadas.temporada')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Prueba',
|
|
||||||
'verbose_name_plural': 'Pruebas',
|
|
||||||
'ordering': ['-fecha_inicio'],
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Telemetria',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('nombre', models.CharField(max_length=100, verbose_name='Nombre del registro')),
|
|
||||||
('archivo_csv', models.FileField(upload_to='telemetria/archivos_csv/', verbose_name='Archivo de Datos (CSV)')),
|
|
||||||
('fecha_subida', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('prueba', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='archivos_telemetria', to='pruebas.prueba')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Registro de Telemetría',
|
|
||||||
'verbose_name_plural': 'Registros de Telemetría',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Variable',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('nombre', models.CharField(max_length=50, verbose_name='Nombre ')),
|
|
||||||
('unidad_medida', models.CharField(blank=True, max_length=20, null=True, verbose_name='Unidad de medida')),
|
|
||||||
('descripcion', models.TextField(blank=True, null=True)),
|
|
||||||
('telemetria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='variables', to='pruebas.telemetria')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Variable de Telemetría',
|
|
||||||
'verbose_name_plural': 'Variables de Telemetría',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='TestGeneral',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
from django.db import models
|
|
||||||
from django.conf import settings
|
|
||||||
from temporadas.models import Temporada
|
|
||||||
import os
|
|
||||||
|
|
||||||
class Prueba(models.Model):
|
|
||||||
CATEGORIAS_TEST = (
|
|
||||||
('aerodinamica', 'Aerodinámica'),
|
|
||||||
('chasis', 'Chasis'),
|
|
||||||
('epowertrain', 'E-Powertrain'),
|
|
||||||
('electronica', 'Electrónica'),
|
|
||||||
('sdf', 'SDF'),
|
|
||||||
('motor_transmision', 'Motor & Transmisión'),
|
|
||||||
('software', 'Software'),
|
|
||||||
('general', 'General'),
|
|
||||||
)
|
|
||||||
|
|
||||||
nombre = models.CharField(max_length=150, verbose_name="Nombre del Test")
|
|
||||||
descripcion = models.TextField(verbose_name="Objetivo / Descripción de la prueba")
|
|
||||||
|
|
||||||
fecha_inicio = models.DateField()
|
|
||||||
fecha_fin = models.DateField()
|
|
||||||
|
|
||||||
categoria = models.CharField(max_length=30, choices=CATEGORIAS_TEST, default='general')
|
|
||||||
resultados = models.TextField(blank=True, null=True, verbose_name="Conclusiones y Resultados")
|
|
||||||
|
|
||||||
# Relaciones
|
|
||||||
# Relacion con Temporada
|
|
||||||
temporada = models.ForeignKey(Temporada, on_delete=models.CASCADE, related_name="pruebas")
|
|
||||||
#Relacion con Usuario
|
|
||||||
realizado_por = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name="pruebas_realizadas", verbose_name="Realizado por")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Prueba"
|
|
||||||
verbose_name_plural = "Pruebas"
|
|
||||||
ordering = ['-fecha_inicio']
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"{self.nombre} ({self.fecha_inicio})"
|
|
||||||
|
|
||||||
class Telemetria(models.Model):
|
|
||||||
nombre = models.CharField(max_length=100, verbose_name="Nombre del registro")
|
|
||||||
archivo_csv = models.FileField(upload_to='telemetria/archivos_csv/', verbose_name="Archivo de Datos (CSV)")
|
|
||||||
fecha_subida = models.DateTimeField(auto_now_add=True)
|
|
||||||
|
|
||||||
# La telemetría se obtiene durante una Prueba en pista
|
|
||||||
prueba = models.ForeignKey(Prueba, on_delete=models.CASCADE, related_name="archivos_telemetria")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Registro de Telemetría"
|
|
||||||
verbose_name_plural = "Registros de Telemetría"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"Telemetría: {self.nombre} (De: {self.prueba.nombre})"
|
|
||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
|
||||||
# Borra el archivo físico del disco duro cuando borras la entrada en la base de datos
|
|
||||||
if self.archivo_csv:
|
|
||||||
if os.path.isfile(self.archivo_csv.path):
|
|
||||||
os.remove(self.archivo_csv.path)
|
|
||||||
super().delete(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class Variable(models.Model):
|
|
||||||
nombre = models.CharField(max_length=50, verbose_name="Nombre ")
|
|
||||||
unidad_medida = models.CharField(max_length=20, verbose_name="Unidad de medida", blank=True, null=True)
|
|
||||||
descripcion = models.TextField(blank=True, null=True)
|
|
||||||
|
|
||||||
# COMPOSICIÓN
|
|
||||||
telemetria = models.ForeignKey(Telemetria, on_delete=models.CASCADE, related_name="variables")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Variable de Telemetría"
|
|
||||||
verbose_name_plural = "Variables de Telemetría"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
unidad = f" [{self.unidad_medida}]" if self.unidad_medida else ""
|
|
||||||
return f"{self.nombre}{unidad} (De: {self.telemetria.nombre})"
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
from django.shortcuts import render, redirect, get_object_or_404
|
|
||||||
from django.contrib import messages
|
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from django.views.decorators.http import require_POST
|
|
||||||
from users.decorators import require_rol
|
|
||||||
from temporadas.models import Temporada
|
|
||||||
from .models import Prueba
|
|
||||||
from .forms import PruebaForm, TelemetriaForm
|
|
||||||
|
|
||||||
|
|
||||||
def puede_subir_csv(user):
|
|
||||||
return user.rol == 'directiva' or user.especialidad == 'software'
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
def listado_pruebas(request):
|
|
||||||
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
||||||
temporada_id = request.GET.get('temporada') or (temporada_actual.pk if temporada_actual else None)
|
|
||||||
categoria = request.GET.get('categoria')
|
|
||||||
|
|
||||||
pruebas = Prueba.objects.all()
|
|
||||||
if temporada_id:
|
|
||||||
pruebas = pruebas.filter(temporada_id=temporada_id)
|
|
||||||
if categoria:
|
|
||||||
pruebas = pruebas.filter(categoria=categoria)
|
|
||||||
|
|
||||||
return render(request, 'listado_pruebas.html', {
|
|
||||||
'pruebas': pruebas,
|
|
||||||
'temporadas': Temporada.objects.all(),
|
|
||||||
'categorias': Prueba.CATEGORIAS_TEST,
|
|
||||||
'temporada_seleccionada': str(temporada_id) if temporada_id else '',
|
|
||||||
'categoria_seleccionada': categoria or '',
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
def detalle_prueba(request, pk):
|
|
||||||
prueba = get_object_or_404(Prueba, pk=pk)
|
|
||||||
puede_editar = request.user.rol == 'directiva' or (
|
|
||||||
request.user.rol == 'jefe_area' and prueba.realizado_por_id == request.user.id
|
|
||||||
)
|
|
||||||
return render(request, 'detalle_prueba.html', {
|
|
||||||
'prueba': prueba,
|
|
||||||
'puede_editar': puede_editar,
|
|
||||||
'puede_subir_csv': puede_subir_csv(request.user),
|
|
||||||
'form_csv': TelemetriaForm(),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva', 'jefe_area')
|
|
||||||
def crear_prueba(request):
|
|
||||||
form = PruebaForm(request.POST or None)
|
|
||||||
if request.method == 'POST' and form.is_valid():
|
|
||||||
prueba = form.save(commit=False)
|
|
||||||
prueba.realizado_por = request.user
|
|
||||||
prueba.save()
|
|
||||||
messages.success(request, 'Test creado correctamente.')
|
|
||||||
return redirect('listado_pruebas')
|
|
||||||
return render(request, 'editar_prueba.html', {'form': form, 'prueba': None})
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva', 'jefe_area')
|
|
||||||
def editar_prueba(request, pk):
|
|
||||||
prueba = get_object_or_404(Prueba, pk=pk)
|
|
||||||
if request.user.rol == 'jefe_area' and prueba.realizado_por_id != request.user.id:
|
|
||||||
messages.error(request, 'Solo puedes editar los tests que tú has creado.')
|
|
||||||
return redirect('detalle_prueba', pk=prueba.pk)
|
|
||||||
|
|
||||||
form = PruebaForm(request.POST or None, instance=prueba)
|
|
||||||
if request.method == 'POST' and form.is_valid():
|
|
||||||
form.save()
|
|
||||||
messages.success(request, 'Test actualizado correctamente.')
|
|
||||||
return redirect('detalle_prueba', pk=prueba.pk)
|
|
||||||
return render(request, 'editar_prueba.html', {'form': form, 'prueba': prueba})
|
|
||||||
|
|
||||||
|
|
||||||
@require_rol('directiva')
|
|
||||||
@require_POST
|
|
||||||
def eliminar_prueba(request, pk):
|
|
||||||
prueba = get_object_or_404(Prueba, pk=pk)
|
|
||||||
prueba.delete()
|
|
||||||
messages.success(request, f'Test "{prueba.nombre}" eliminado.')
|
|
||||||
return redirect('listado_pruebas')
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
@require_POST
|
|
||||||
def subir_csv(request, pk):
|
|
||||||
prueba = get_object_or_404(Prueba, pk=pk)
|
|
||||||
if not puede_subir_csv(request.user):
|
|
||||||
messages.error(request, 'No tienes permiso para subir archivos de telemetría.')
|
|
||||||
return redirect('detalle_prueba', pk=prueba.pk)
|
|
||||||
|
|
||||||
form = TelemetriaForm(request.POST, request.FILES)
|
|
||||||
if form.is_valid():
|
|
||||||
telemetria = form.save(commit=False)
|
|
||||||
telemetria.prueba = prueba
|
|
||||||
telemetria.save()
|
|
||||||
messages.success(request, 'Archivo de telemetría subido correctamente.')
|
|
||||||
else:
|
|
||||||
messages.error(request, 'No se pudo subir el archivo. Revisa el formulario.')
|
|
||||||
return redirect('detalle_prueba', pk=prueba.pk)
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 79 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 9.3 MiB |
|
|
@ -1,111 +0,0 @@
|
||||||
{% load static %}
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>{% block title %}Intranet | Formula Gades{% endblock title %}</title>
|
|
||||||
|
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="{% static 'css/estilos.css' %}">
|
|
||||||
|
|
||||||
{% block extra_head %}{% endblock extra_head %}
|
|
||||||
<style>
|
|
||||||
html, body { overflow: hidden; height: 100%; }
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body class="bg-light text-dark d-flex flex-column min-vh-100">
|
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-xl navbar-dark bg-dark sticky-top shadow-sm">
|
|
||||||
<div class="container-fluid px-4">
|
|
||||||
<a class="navbar-brand d-flex align-items-center" href="{% url 'inicio' %}">
|
|
||||||
<img src="{% static 'images/logo_gades.png' %}" alt="Logo Gades" height="40" class="me-2">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
|
||||||
<span class="navbar-toggler-icon"></span>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<div class="collapse navbar-collapse" id="navbarNav">
|
|
||||||
<ul class="navbar-nav ms-auto align-items-center">
|
|
||||||
|
|
||||||
<li class="nav-item dropdown px-2">
|
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="areasDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
Áreas Técnicas
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="areasDropdown">
|
|
||||||
<li><a class="dropdown-menu-item dropdown-item" href="#">Aerodinámica</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Chasis</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Bussiness & Operation</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">E_Powertrain</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Electrónica</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">SDF</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Motor & Transmisión</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Software</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item px-2">
|
|
||||||
<a class="nav-link" href="{% url 'listado_pruebas' %}">Pruebas</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item px-2">
|
|
||||||
<a class="nav-link" href="{% url 'patrocinios' %}">Patrocinios</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item px-2">
|
|
||||||
<a class="nav-link" href="{% url 'listado_miembros' %}">Miembros</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{% if user.is_authenticated and user.rol == 'directiva' %}
|
|
||||||
<li class="nav-item px-2">
|
|
||||||
<a class="nav-link text-warning" href="{% url 'contabilidad' %}">Contabilidad</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item dropdown px-2">
|
|
||||||
<a class="nav-link dropdown-toggle text-warning" href="#" id="gestionDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
Gestión
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="gestionDropdown">
|
|
||||||
<li><a class="dropdown-item" href="{% url 'gestion_usuarios' %}">Gestión de Usuarios</a></li>
|
|
||||||
<li><a class="dropdown-item" href="{% url 'gestion_temporadas' %}">Gestión de Temporadas</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<li class="nav-item dropdown ms-3 border-start ps-3">
|
|
||||||
<a class="nav-link dropdown-toggle d-flex align-items-center" href="#" id="userDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<div class="bg-secondary rounded-circle d-flex align-items-center justify-content-center text-white fw-bold shadow-sm" style="width: 35px; height: 35px;">
|
|
||||||
{{ user.first_name|slice:":1"|upper }}
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userDropdown">
|
|
||||||
<li><span class="dropdown-item-text fw-bold text-muted">Hola, {{ user.first_name }}</span></li>
|
|
||||||
<li><hr class="dropdown-divider"></li>
|
|
||||||
<li><a class="dropdown-item" href="{% url 'mi_perfil' %}">Mi Perfil</a></li>
|
|
||||||
<li>
|
|
||||||
<form method="post" action="{% url 'logout' %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<button type="submit" class="dropdown-item text-danger">Cerrar Sesión</button>
|
|
||||||
</form>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<main class="container-fluid py-3 px-4 flex-grow-1 d-flex flex-column" style="min-height: 0;">
|
|
||||||
{% block content %}
|
|
||||||
{% endblock content %}
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer class="bg-dark text-white text-center py-2 mt-auto border-top border-secondary">
|
|
||||||
<p class="mb-0 small">© 2026 Formula Gades - Universidad de Cádiz. Todos los derechos reservados.</p>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
|
||||||
|
|
||||||
{% block extra_js %}{% endblock extra_js %}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,247 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
|
|
||||||
{% block title %}Contabilidad | Gades Manager{% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #ffc107;">
|
|
||||||
<h1 class="display-6 fw-bold mb-1">Contabilidad</h1>
|
|
||||||
<p class="text-white-50 mb-0">
|
|
||||||
{% if temporada_actual %}{{ temporada_actual.nombre }}{% else %}Sin temporada activa{% endif %}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if messages %}
|
|
||||||
<div class="row mb-2 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
{% for message in messages %}
|
|
||||||
<div class="alert alert-{% if message.tags == 'error' %}danger{% else %}success{% endif %} py-2 small mb-1">{{ message }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if not temporada_actual %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="alert alert-warning">No hay ninguna temporada activa. Activa una temporada desde <a href="{% url 'gestion_temporadas' %}">Gestión de Temporadas</a>.</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{# ── Bloque 1: 4 tarjetas resumen ── #}
|
|
||||||
<div class="row g-3 mb-3 flex-shrink-0">
|
|
||||||
<div class="col-6 col-md-3">
|
|
||||||
<div class="card border-0 shadow-sm text-center h-100" style="border-top: 4px solid #0d6efd !important;">
|
|
||||||
<div class="card-body py-3">
|
|
||||||
<p class="text-secondary small mb-1">Presupuesto Inicial</p>
|
|
||||||
<h4 class="fw-bold text-primary mb-0">{{ presupuesto_inicial|floatformat:2 }} €</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-6 col-md-3">
|
|
||||||
<div class="card border-0 shadow-sm text-center h-100" style="border-top: 4px solid #198754 !important;">
|
|
||||||
<div class="card-body py-3">
|
|
||||||
<p class="text-secondary small mb-1">Total Ingresos</p>
|
|
||||||
<h4 class="fw-bold text-success mb-0">+{{ total_ingresos|floatformat:2 }} €</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-6 col-md-3">
|
|
||||||
<div class="card border-0 shadow-sm text-center h-100" style="border-top: 4px solid #dc3545 !important;">
|
|
||||||
<div class="card-body py-3">
|
|
||||||
<p class="text-secondary small mb-1">Total Gastos</p>
|
|
||||||
<h4 class="fw-bold text-danger mb-0">-{{ total_gastos|floatformat:2 }} €</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-6 col-md-3">
|
|
||||||
<div class="card border-0 shadow-sm text-center h-100"
|
|
||||||
style="border-top: 4px solid {% if presupuesto_actual >= 0 %}#198754{% else %}#dc3545{% endif %} !important;">
|
|
||||||
<div class="card-body py-3">
|
|
||||||
<p class="text-secondary small mb-1">Presupuesto Actual</p>
|
|
||||||
<h4 class="fw-bold {% if presupuesto_actual >= 0 %}text-success{% else %}text-danger{% endif %} mb-0">
|
|
||||||
{{ presupuesto_actual|floatformat:2 }} €
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{# ── Bloque 2: Gastos | Ingresos ── #}
|
|
||||||
<div class="row g-3 mb-3" style="overflow-y: auto; max-height: 340px;">
|
|
||||||
|
|
||||||
{# Columna Gastos #}
|
|
||||||
<div class="col-12 col-md-6">
|
|
||||||
<div class="card border-0 shadow-sm h-100">
|
|
||||||
<div class="card-body p-3">
|
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
||||||
<h6 class="fw-bold mb-0 text-danger">Gastos</h6>
|
|
||||||
<button class="btn btn-sm btn-outline-danger" data-bs-toggle="modal" data-bs-target="#modalGasto">+ Añadir</button>
|
|
||||||
</div>
|
|
||||||
<div style="max-height: 220px; overflow-y: auto;">
|
|
||||||
{% if gastos %}
|
|
||||||
<ul class="list-group list-group-flush">
|
|
||||||
{% for gasto in gastos %}
|
|
||||||
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-start">
|
|
||||||
<div>
|
|
||||||
<div class="fw-semibold small">{{ gasto.concepto }}</div>
|
|
||||||
<div class="text-secondary" style="font-size:0.75rem;">{{ gasto.get_categoria_display }} · {{ gasto.fecha|date:"d/m/Y" }}</div>
|
|
||||||
</div>
|
|
||||||
<span class="badge bg-danger rounded-pill ms-2">-{{ gasto.importe|floatformat:2 }} €</span>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
<p class="text-secondary small text-center py-3 mb-0">Sin gastos registrados.</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{# Columna Ingresos #}
|
|
||||||
<div class="col-12 col-md-6">
|
|
||||||
<div class="card border-0 shadow-sm h-100">
|
|
||||||
<div class="card-body p-3">
|
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
||||||
<h6 class="fw-bold mb-0 text-success">Ingresos</h6>
|
|
||||||
<button class="btn btn-sm btn-outline-success" data-bs-toggle="modal" data-bs-target="#modalIngreso">+ Añadir</button>
|
|
||||||
</div>
|
|
||||||
<div style="max-height: 220px; overflow-y: auto;">
|
|
||||||
{% if ingresos %}
|
|
||||||
<ul class="list-group list-group-flush">
|
|
||||||
{% for ingreso in ingresos %}
|
|
||||||
<li class="list-group-item px-0 py-2 d-flex justify-content-between align-items-start">
|
|
||||||
<div>
|
|
||||||
<div class="fw-semibold small">{{ ingreso.concepto }}</div>
|
|
||||||
<div class="text-secondary" style="font-size:0.75rem;">{{ ingreso.get_categoria_display }} · {{ ingreso.fecha|date:"d/m/Y" }}</div>
|
|
||||||
</div>
|
|
||||||
<span class="badge bg-success rounded-pill ms-2">+{{ ingreso.importe|floatformat:2 }} €</span>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
<p class="text-secondary small text-center py-3 mb-0">Sin ingresos registrados.</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{# ── Bloque 3: Facturas pendientes ── #}
|
|
||||||
<div class="row flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="card border-0 shadow-sm">
|
|
||||||
<div class="card-body p-3">
|
|
||||||
<h6 class="fw-bold mb-3">Facturas Pendientes</h6>
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="table table-hover align-middle mb-0">
|
|
||||||
<thead class="table-dark">
|
|
||||||
<tr>
|
|
||||||
<th>Nombre</th>
|
|
||||||
<th>Empresa</th>
|
|
||||||
<th>Importe</th>
|
|
||||||
<th>Categoría</th>
|
|
||||||
<th>Acciones</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for factura in facturas_pendientes %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ factura.nombre }}</td>
|
|
||||||
<td>{{ factura.empresa }}</td>
|
|
||||||
<td class="fw-semibold">{{ factura.importe|floatformat:2 }} €</td>
|
|
||||||
<td>{{ factura.get_categoria_display }}</td>
|
|
||||||
<td class="d-flex gap-2">
|
|
||||||
<form method="post" action="{% url 'aceptar_factura' factura.pk %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<button type="submit" class="btn btn-sm btn-success fw-bold">Aceptar</button>
|
|
||||||
</form>
|
|
||||||
<form method="post" action="{% url 'rechazar_factura' factura.pk %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<button type="submit" class="btn btn-sm btn-outline-danger">Rechazar</button>
|
|
||||||
</form>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% empty %}
|
|
||||||
<tr>
|
|
||||||
<td colspan="5" class="text-center text-secondary py-3">No hay facturas pendientes.</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endif %}{# end if temporada_actual #}
|
|
||||||
|
|
||||||
{# ── Modal Añadir Gasto ── #}
|
|
||||||
<div class="modal fade" id="modalGasto" tabindex="-1" aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title">Añadir Gasto</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
<form method="post" action="{% url 'anadir_gasto' %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="modal-body">
|
|
||||||
{% for field in gasto_form %}
|
|
||||||
<div class="mb-3">
|
|
||||||
<label class="form-label fw-semibold">{{ field.label }}</label>
|
|
||||||
{{ field }}
|
|
||||||
{% for error in field.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
|
||||||
<button type="submit" class="btn btn-danger fw-bold">Guardar Gasto</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{# ── Modal Añadir Ingreso ── #}
|
|
||||||
<div class="modal fade" id="modalIngreso" tabindex="-1" aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title">Añadir Ingreso</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
<form method="post" action="{% url 'anadir_ingreso' %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="modal-body">
|
|
||||||
{% for field in ingreso_form %}
|
|
||||||
<div class="mb-3">
|
|
||||||
<label class="form-label fw-semibold">{{ field.label }}</label>
|
|
||||||
{{ field }}
|
|
||||||
{% for error in field.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
|
||||||
<button type="submit" class="btn btn-success fw-bold">Guardar Ingreso</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
|
|
||||||
{% block title %}{{ prueba.nombre }} | Gades Manager{% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="bg-dark text-white p-3 rounded-3 shadow-sm d-flex justify-content-between align-items-center" style="border-left: 5px solid #0d6efd;">
|
|
||||||
<div>
|
|
||||||
<h1 class="display-6 fw-bold mb-1">{{ prueba.nombre }}</h1>
|
|
||||||
<p class="text-white-50 mb-0">{{ prueba.get_categoria_display }} · Temporada {{ prueba.temporada.nombre }}</p>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
{% if puede_editar %}
|
|
||||||
<a href="{% url 'editar_prueba' prueba.pk %}" class="btn btn-outline-light fw-bold">Editar</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if user.rol == 'directiva' %}
|
|
||||||
<button type="button" class="btn btn-outline-danger fw-bold" data-bs-toggle="modal" data-bs-target="#eliminarModal">Eliminar</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-4" style="overflow-y: auto;">
|
|
||||||
|
|
||||||
{% if messages %}
|
|
||||||
<div class="col-12">
|
|
||||||
{% for message in messages %}
|
|
||||||
<div class="alert alert-success py-2 small mb-0">{{ message }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="col-12 col-lg-8">
|
|
||||||
<div class="card border-0 shadow-sm">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
<h5 class="fw-semibold">Objetivo / Descripción</h5>
|
|
||||||
<p>{{ prueba.descripcion }}</p>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col-6"><strong>Fecha inicio:</strong> {{ prueba.fecha_inicio|date:"d/m/Y" }}</div>
|
|
||||||
<div class="col-6"><strong>Fecha fin:</strong> {{ prueba.fecha_fin|date:"d/m/Y" }}</div>
|
|
||||||
</div>
|
|
||||||
<p><strong>Realizado por:</strong> {{ prueba.realizado_por.first_name|default:"—" }}</p>
|
|
||||||
|
|
||||||
{% if prueba.resultados %}
|
|
||||||
<h5 class="fw-semibold mt-4">Conclusiones y Resultados</h5>
|
|
||||||
<p>{{ prueba.resultados }}</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-12 col-lg-4">
|
|
||||||
<div class="card border-0 shadow-sm">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
<h5 class="fw-semibold mb-3">Archivos de telemetría</h5>
|
|
||||||
<ul class="list-group list-group-flush mb-3">
|
|
||||||
{% for telemetria in prueba.archivos_telemetria.all %}
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center px-0">
|
|
||||||
<a href="{{ telemetria.archivo_csv.url }}">{{ telemetria.nombre }}</a>
|
|
||||||
<span class="text-secondary small">{{ telemetria.fecha_subida|date:"d/m/Y" }}</span>
|
|
||||||
</li>
|
|
||||||
{% empty %}
|
|
||||||
<li class="list-group-item px-0 text-secondary small">No hay archivos subidos todavía.</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
{% if puede_subir_csv %}
|
|
||||||
<form method="post" action="{% url 'subir_csv' prueba.pk %}" enctype="multipart/form-data">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="mb-2">
|
|
||||||
<label class="form-label small fw-semibold">Nombre</label>
|
|
||||||
{{ form_csv.nombre }}
|
|
||||||
</div>
|
|
||||||
<div class="mb-2">
|
|
||||||
<label class="form-label small fw-semibold">Archivo CSV</label>
|
|
||||||
{{ form_csv.archivo_csv }}
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn btn-sm btn-primary fw-bold">Subir CSV</button>
|
|
||||||
</form>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if user.rol == 'directiva' %}
|
|
||||||
<div class="modal fade" id="eliminarModal" tabindex="-1" aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title">Confirmar eliminación</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
¿Seguro que quieres eliminar el test <strong>{{ prueba.nombre }}</strong>? Esta acción no se puede deshacer.
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
|
||||||
<form method="post" action="{% url 'eliminar_prueba' prueba.pk %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<button type="submit" class="btn btn-danger fw-bold">Eliminar</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
|
|
||||||
{% block title %}Editar Patrocinio | Gades Manager{% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #0d6efd;">
|
|
||||||
<h1 class="display-6 fw-bold mb-1">Editar Patrocinio</h1>
|
|
||||||
<p class="text-white-50 mb-0">{{ patrocinio.empresa }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-4" style="overflow-y: auto;">
|
|
||||||
<div class="col-12 col-lg-6">
|
|
||||||
<div class="card border-0 shadow-sm">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
<h5 class="card-title fw-bold mb-3">Datos del Patrocinio</h5>
|
|
||||||
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
|
|
||||||
{% for field in form %}
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ field.id_for_label }}" class="form-label fw-semibold">{{ field.label }}</label>
|
|
||||||
{{ field }}
|
|
||||||
{% for error in field.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<div class="d-flex gap-2 mt-4">
|
|
||||||
<button type="submit" class="btn btn-primary fw-bold px-4">Guardar Cambios</button>
|
|
||||||
<a href="{% url 'patrocinios' %}" class="btn btn-outline-secondary px-4">Cancelar</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
|
|
||||||
{% block title %}{% if prueba %}Editar Test{% else %}Nuevo Test{% endif %} | Gades Manager{% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #0d6efd;">
|
|
||||||
<h1 class="display-6 fw-bold mb-1">{% if prueba %}Editar Test{% else %}Nuevo Test{% endif %}</h1>
|
|
||||||
<p class="text-white-50 mb-0">{% if prueba %}{{ prueba.nombre }}{% else %}Rellena los datos del nuevo test.{% endif %}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-4" style="overflow-y: auto;">
|
|
||||||
<div class="col-12 col-lg-8">
|
|
||||||
<div class="card border-0 shadow-sm">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ form.nombre.id_for_label }}" class="form-label fw-semibold">Nombre del test</label>
|
|
||||||
<input type="text" name="nombre" id="{{ form.nombre.id_for_label }}"
|
|
||||||
class="form-control {% if form.nombre.errors %}is-invalid{% endif %}"
|
|
||||||
value="{{ form.nombre.value|default:'' }}" placeholder="Ej: Test de frenada">
|
|
||||||
{% for error in form.nombre.errors %}
|
|
||||||
<div class="invalid-feedback">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ form.descripcion.id_for_label }}" class="form-label fw-semibold">Objetivo / Descripción</label>
|
|
||||||
<textarea name="descripcion" id="{{ form.descripcion.id_for_label }}" rows="3"
|
|
||||||
class="form-control {% if form.descripcion.errors %}is-invalid{% endif %}">{{ form.descripcion.value|default:'' }}</textarea>
|
|
||||||
{% for error in form.descripcion.errors %}
|
|
||||||
<div class="invalid-feedback">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-2 mb-3">
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="{{ form.fecha_inicio.id_for_label }}" class="form-label fw-semibold">Fecha de inicio</label>
|
|
||||||
{{ form.fecha_inicio }}
|
|
||||||
{% for error in form.fecha_inicio.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="{{ form.fecha_fin.id_for_label }}" class="form-label fw-semibold">Fecha de fin</label>
|
|
||||||
{{ form.fecha_fin }}
|
|
||||||
{% for error in form.fecha_fin.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-2 mb-3">
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="{{ form.categoria.id_for_label }}" class="form-label fw-semibold">Categoría</label>
|
|
||||||
<select name="categoria" id="{{ form.categoria.id_for_label }}" class="form-select">
|
|
||||||
{% for valor, etiqueta in form.fields.categoria.choices %}
|
|
||||||
<option value="{{ valor }}" {% if form.categoria.value == valor %}selected{% endif %}>{{ etiqueta }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="{{ form.temporada.id_for_label }}" class="form-label fw-semibold">Temporada</label>
|
|
||||||
<select name="temporada" id="{{ form.temporada.id_for_label }}"
|
|
||||||
class="form-select {% if form.temporada.errors %}is-invalid{% endif %}">
|
|
||||||
{% for temporada in form.fields.temporada.queryset %}
|
|
||||||
<option value="{{ temporada.pk }}" {% if form.temporada.value|stringformat:"s" == temporada.pk|stringformat:"s" %}selected{% endif %}>{{ temporada.nombre }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
{% for error in form.temporada.errors %}
|
|
||||||
<div class="invalid-feedback">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-4">
|
|
||||||
<label for="{{ form.resultados.id_for_label }}" class="form-label fw-semibold">Conclusiones y Resultados</label>
|
|
||||||
<textarea name="resultados" id="{{ form.resultados.id_for_label }}" rows="3"
|
|
||||||
class="form-control {% if form.resultados.errors %}is-invalid{% endif %}">{{ form.resultados.value|default:'' }}</textarea>
|
|
||||||
{% for error in form.resultados.errors %}
|
|
||||||
<div class="invalid-feedback">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
<button type="submit" class="btn btn-primary fw-bold px-4">Guardar</button>
|
|
||||||
<a href="{% if prueba %}{% url 'detalle_prueba' prueba.pk %}{% else %}{% url 'listado_pruebas' %}{% endif %}" class="btn btn-outline-secondary px-4">Cancelar</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
|
|
||||||
{% block title %}{% if temporada %}Editar Temporada{% else %}Nueva Temporada{% endif %} | Gades Manager{% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #0d6efd;">
|
|
||||||
<h1 class="display-6 fw-bold mb-1">{% if temporada %}Editar Temporada{% else %}Nueva Temporada{% endif %}</h1>
|
|
||||||
<p class="text-white-50 mb-0">{% if temporada %}{{ temporada.nombre }}{% else %}Rellena los datos de la nueva temporada.{% endif %}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-4" style="overflow-y: auto;">
|
|
||||||
<div class="col-12 col-lg-8">
|
|
||||||
<div class="card border-0 shadow-sm">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ form.nombre.id_for_label }}" class="form-label fw-semibold">Nombre</label>
|
|
||||||
<input type="text" name="nombre" id="{{ form.nombre.id_for_label }}"
|
|
||||||
class="form-control {% if form.nombre.errors %}is-invalid{% endif %}"
|
|
||||||
value="{{ form.nombre.value|default:'' }}" placeholder="Ej: Gades 2025-26">
|
|
||||||
{% for error in form.nombre.errors %}
|
|
||||||
<div class="invalid-feedback">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-2 mb-3">
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="{{ form.fecha_inicio.id_for_label }}" class="form-label fw-semibold">Fecha de inicio</label>
|
|
||||||
{{ form.fecha_inicio }}
|
|
||||||
{% for error in form.fecha_inicio.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="{{ form.fecha_fin.id_for_label }}" class="form-label fw-semibold">Fecha de fin</label>
|
|
||||||
{{ form.fecha_fin }}
|
|
||||||
{% for error in form.fecha_fin.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ form.presupuesto.id_for_label }}" class="form-label fw-semibold">Presupuesto (€)</label>
|
|
||||||
<input type="number" name="presupuesto" id="{{ form.presupuesto.id_for_label }}"
|
|
||||||
class="form-control {% if form.presupuesto.errors %}is-invalid{% endif %}"
|
|
||||||
value="{{ form.presupuesto.value|default:'0.00' }}" step="0.01" min="0">
|
|
||||||
{% for error in form.presupuesto.errors %}
|
|
||||||
<div class="invalid-feedback">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-4 form-check">
|
|
||||||
<input type="checkbox" name="actual" id="{{ form.actual.id_for_label }}"
|
|
||||||
class="form-check-input" {% if form.actual.value %}checked{% endif %}>
|
|
||||||
<label for="{{ form.actual.id_for_label }}" class="form-check-label fw-semibold">
|
|
||||||
Marcar como temporada activa
|
|
||||||
</label>
|
|
||||||
<div class="form-text">Solo puede haber una temporada activa. Al marcar esta se desactivarán las demás automáticamente.</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-4">
|
|
||||||
<label class="form-label fw-semibold">Miembros</label>
|
|
||||||
<div class="border rounded p-3" style="max-height: 220px; overflow-y: auto;">
|
|
||||||
{% for checkbox in form.miembros %}
|
|
||||||
<div class="form-check">
|
|
||||||
{{ checkbox.tag }}
|
|
||||||
<label class="form-check-label" for="{{ checkbox.id_for_label }}">
|
|
||||||
{{ checkbox.choice_label }}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{% empty %}
|
|
||||||
<span class="text-secondary small">No hay usuarios en el sistema.</span>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
<button type="submit" class="btn btn-primary fw-bold px-4">Guardar</button>
|
|
||||||
<a href="{% url 'gestion_temporadas' %}" class="btn btn-outline-secondary px-4">Cancelar</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
|
|
||||||
{% block title %}Editar Usuario | Gades Manager{% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3 flex-shrink-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #0d6efd;">
|
|
||||||
<h1 class="display-6 fw-bold mb-1">Editar Usuario</h1>
|
|
||||||
<p class="text-white-50 mb-0">{{ usuario.username }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-4" style="overflow-y: auto;">
|
|
||||||
<div class="col-12 col-lg-6">
|
|
||||||
<div class="card border-0 shadow-sm h-100">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
<h5 class="card-title fw-bold mb-3">Datos del Usuario</h5>
|
|
||||||
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ form.username.id_for_label }}" class="form-label fw-semibold">{{ form.username.label }}</label>
|
|
||||||
{{ form.username }}
|
|
||||||
{% for error in form.username.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-2">
|
|
||||||
<div class="col-6 mb-3">
|
|
||||||
<label for="{{ form.first_name.id_for_label }}" class="form-label fw-semibold">{{ form.first_name.label }}</label>
|
|
||||||
{{ form.first_name }}
|
|
||||||
</div>
|
|
||||||
<div class="col-6 mb-3">
|
|
||||||
<label for="{{ form.last_name.id_for_label }}" class="form-label fw-semibold">{{ form.last_name.label }}</label>
|
|
||||||
{{ form.last_name }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="{{ form.email.id_for_label }}" class="form-label fw-semibold">{{ form.email.label }}</label>
|
|
||||||
{{ form.email }}
|
|
||||||
{% for error in form.email.errors %}
|
|
||||||
<div class="text-danger small mt-1">{{ error }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row g-2">
|
|
||||||
<div class="col-6 mb-3">
|
|
||||||
<label for="{{ form.rol.id_for_label }}" class="form-label fw-semibold">{{ form.rol.label }}</label>
|
|
||||||
{{ form.rol }}
|
|
||||||
</div>
|
|
||||||
<div class="col-6 mb-3">
|
|
||||||
<label for="{{ form.especialidad.id_for_label }}" class="form-label fw-semibold">{{ form.especialidad.label }}</label>
|
|
||||||
{{ form.especialidad }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button type="submit" class="btn btn-primary fw-bold px-4">Guardar Cambios</button>
|
|
||||||
<a href="{% url 'gestion_usuarios' %}" class="btn btn-outline-secondary px-4">Cancelar</a>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue