Merge pull request #164 from suchmememanyskill/dev

v2.1.0
This commit is contained in:
Sims
2025-02-01 19:39:18 +01:00
committed by GitHub
23 changed files with 605 additions and 127 deletions

View File

@@ -20,7 +20,7 @@ jobs:
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
@@ -31,7 +31,7 @@ jobs:
# ~/.platformio/.cache # ~/.platformio/.cache
# key: ${{ runner.os }}-pio-cyd-klipper # key: ${{ runner.os }}-pio-cyd-klipper
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: '3.9'
@@ -43,13 +43,13 @@ jobs:
python3 ci.py python3 ci.py
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: firmware name: firmware
path: ./out path: ./out
- name: Upload GitHub Page Artifact - name: Upload GitHub Page Artifact
uses: actions/upload-pages-artifact@v2 uses: actions/upload-pages-artifact@v3
deploy: deploy:
environment: environment:
@@ -65,5 +65,5 @@ jobs:
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
id: deployment id: deployment
uses: actions/deploy-pages@v2 uses: actions/deploy-pages@v4

View File

@@ -0,0 +1,127 @@
{
"build": {
"arduino": {
"ldscript": "esp32_out.ld"
},
"core": "esp32",
"extra_flags": [
"'-D ARDUINO_ESP32_DEV'",
"'-D ESP32_2432S022C'",
"'-D LCD_WIDTH=240'",
"'-D LCD_HEIGHT=320'",
"'-D LVGL_BUFFER_PIXELS=(LCD_WIDTH*LCD_HEIGHT/8)'",
"'-D LVGL_BUFFER_MALLOC_FLAGS=(MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)'",
"'-D GPIO_BCKL=0'",
"'-D LCD_ST7789_I80'",
"'-D ST7789_I80_BUS_CONFIG_CLK_SRC=LCD_CLK_SRC_PLL160M'",
"'-D ST7789_I80_BUS_CONFIG_DC=16'",
"'-D ST7789_I80_BUS_CONFIG_WR=4'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D8=15'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D9=13'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D10=12'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D11=14'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D12=27'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D13=25'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D14=33'",
"'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D15=32'",
"'-D ST7789_I80_BUS_CONFIG_BUS_WIDTH=8'",
"'-D ST7789_I80_BUS_CONFIG_MAX_TRANSFER_BYTES=(LVGL_BUFFER_PIXELS * sizeof(lv_color_t))'",
"'-D ST7789_I80_BUS_CONFIG_PSRAM_TRANS_ALIGN=64'",
"'-D ST7789_I80_BUS_CONFIG_SRAM_TRANS_ALIGN=4'",
"'-D ST7789_IO_I80_CONFIG_CS_GPIO_NUM=17'",
"'-D ST7789_IO_I80_CONFIG_PCLK_HZ=12000000'",
"'-D ST7789_IO_I80_CONFIG_TRANS_QUEUE_DEPTH=10'",
"'-D ST7789_IO_I80_CONFIG_LCD_CMD_BITS=8'",
"'-D ST7789_IO_I80_CONFIG_LCD_PARAM_BITS=8'",
"'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_IDLE_LEVEL=0'",
"'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_CMD_LEVEL=0'",
"'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_DUMMY_LEVEL=0'",
"'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_DATA_LEVEL=1'",
"'-D ST7789_IO_I80_CONFIG_FLAGS_CS_ACTIVE_HIGH=0'",
"'-D ST7789_IO_I80_CONFIG_FLAGS_REVERSE_COLOR_BITS=0'",
"'-D ST7789_IO_I80_CONFIG_FLAGS_SWAP_COLOR_BYTES=0'",
"'-D ST7789_IO_I80_CONFIG_FLAGS_PCLK_ACTIVE_NEG=0'",
"'-D ST7789_IO_I80_CONFIG_FLAGS_PCLK_IDLE_LOW=0'",
"'-D ST7789_DEV_CONFIG_RESET_GPIO_NUM=GPIO_NUM_NC'",
"'-D ST7789_DEV_CONFIG_COLOR_SPACE=ESP_LCD_COLOR_SPACE_RGB'",
"'-D ST7789_DEV_CONFIG_BITS_PER_PIXEL=16'",
"'-D ST7789_DEV_CONFIG_FLAGS_RESET_ACTIVE_HIGH=false'",
"'-D ST7789_DEV_CONFIG_VENDOR_CONFIG=NULL'",
"'-D ST7789_RD_GPIO=2'",
"'-D LCD_SWAP_XY=false'",
"'-D LCD_MIRROR_X=false'",
"'-D LCD_MIRROR_Y=false'",
"'-D BOARD_HAS_TOUCH'",
"'-D TOUCH_CST816S_I2C'",
"'-D CST816S_I2C_HOST=I2C_NUM_0'",
"'-D CST816S_I2C_CONFIG_SDA_IO_NUM=21'",
"'-D CST816S_I2C_CONFIG_SCL_IO_NUM=22'",
"'-D CST816S_I2C_CONFIG_SDA_PULLUP_EN=GPIO_PULLUP_ENABLE'",
"'-D CST816S_I2C_CONFIG_SCL_PULLUP_EN=GPIO_PULLUP_ENABLE'",
"'-D CST816S_I2C_CONFIG_MASTER_CLK_SPEED=400000'",
"'-D CST816S_I2C_CONFIG_CLK_FLAGS=0'",
"'-D CST816S_IO_I2C_CONFIG_DEV_ADDR=ESP_LCD_TOUCH_IO_I2C_CST816S_ADDRESS'",
"'-D CST816S_IO_I2C_CONFIG_CONTROL_PHASE_BYTES=1'",
"'-D CST816S_IO_I2C_CONFIG_DC_BIT_OFFSET=0'",
"'-D CST816S_IO_I2C_CONFIG_LCD_CMD_BITS=8'",
"'-D CST816S_IO_I2C_CONFIG_LCD_PARAM_BITS=0'",
"'-D CST816S_IO_I2C_CONFIG_FLAGS_DC_LOW_ON_DATA=false'",
"'-D CST816S_IO_I2C_CONFIG_FLAGS_DISABLE_CONTROL_PHASE=true'",
"'-D CST816S_TOUCH_CONFIG_X_MAX=LCD_WIDTH'",
"'-D CST816S_TOUCH_CONFIG_Y_MAX=LCD_HEIGHT'",
"'-D CST816S_TOUCH_CONFIG_RST_GPIO_NUM=GPIO_NUM_NC'",
"'-D CST816S_TOUCH_CONFIG_INT_GPIO_NUM=GPIO_NUM_NC'",
"'-D CST816S_TOUCH_CONFIG_LEVELS_RESET=0'",
"'-D CST816S_TOUCH_CONFIG_LEVELS_INTERRUPT=0'",
"'-D TOUCH_SWAP_XY=false'",
"'-D TOUCH_SWAP_X=false'",
"'-D TOUCH_SWAP_Y=false'",
"'-D BOARD_HAS_TF'",
"'-D TF_CS=5'",
"'-D TF_SPI_MOSI=23'",
"'-D TF_SPI_SCLK=18'",
"'-D TF_SPI_MISO=19'",
"'-D BOARD_HAS_SPEAK'",
"'-D SPEAK=26'",
"-DCYD_SCREEN_GAP_PX=8",
"-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=35",
"-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=35",
"-DCYD_SCREEN_VERTICAL=1",
"-DCYD_SCREEN_FONT=lv_font_montserrat_14",
"-DCYD_SCREEN_FONT_SMALL=lv_font_montserrat_10",
"-DCYD_SCREEN_SIDEBAR_SIZE_PX=40",
"-DCYD_SCREEN_DRIVER_ESP32_SMARTDISPLAY=1",
"-DCYD_SCREEN_DISABLE_TOUCH_CALIBRATION=1",
"-DCYD_SCREEN_DISABLE_INVERT_COLORS=1"
],
"f_cpu": "240000000L",
"f_flash": "40000000L",
"flash_mode": "dio",
"mcu": "esp32",
"variant": "esp32"
},
"connectivity": [
"wifi",
"bluetooth",
"ethernet",
"can"
],
"debug": {
"openocd_board": "esp-wroom-32.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "esp32-2432S022C-V",
"upload": {
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.aliexpress.com/item/1005006284154750.html",
"vendor": "Sunton"
}

View File

@@ -0,0 +1,55 @@
{
"build": {
"arduino": {
"ldscript": "esp32s3_out.ld",
"partitions": "default_16MB.csv",
"memory_type": "qio_opi"
},
"core": "esp32",
"extra_flags": [
"-DCYD_SCREEN_HEIGHT_PX=320",
"-DCYD_SCREEN_WIDTH_PX=480",
"-DCYD_SCREEN_GAP_PX=10",
"-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=45",
"-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=45",
"-DCYD_SCREEN_FONT=lv_font_montserrat_16",
"-DCYD_SCREEN_FONT_SMALL=lv_font_montserrat_12",
"-DCYD_SCREEN_SIDEBAR_SIZE_PX=50",
"-DCYD_SCREEN_DRIVER_ESP32_CROWPANEL_35C=1",
"-DCYD_SCREEN_DISABLE_TOUCH_CALIBRATION=1"
],
"f_cpu": "240000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"hwids": [
[
"0x303A",
"0x1001"
]
],
"mcu": "esp32s3",
"variant": "esp32s3"
},
"connectivity": [
"wifi"
],
"debug": {
"openocd_target": "esp32s3.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "esp32-8048S043C-SD",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 327680,
"maximum_size": 16777216,
"use_1200bps_touch": true,
"wait_for_upload_port": true,
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.elecrow.com/esp-terminal-with-esp32-3-5-inch-parallel-480x320-tft-capacitive-touch-display-rgb-by-chip-ili9488.html",
"vendor": "CROWPANEL"
}

View File

@@ -84,7 +84,7 @@ board = esp32-3248S035C-smartdisplay
board = esp32-4827S043C-smartdisplay board = esp32-4827S043C-smartdisplay
[env:esp32-4827S043R-SD] [env:esp32-4827S043R-SD]
board = esp32-4827S043C-smartdisplay board = esp32-4827S043R-smartdisplay
[env:esp32-8048S043C-SD] [env:esp32-8048S043C-SD]
board = esp32-8048S043C-smartdisplay board = esp32-8048S043C-smartdisplay
@@ -92,6 +92,9 @@ board = esp32-8048S043C-smartdisplay
[env:esp32-8048S043C-SD-alt] [env:esp32-8048S043C-SD-alt]
board = esp32-8048S043C-smartdisplay-alt board = esp32-8048S043C-smartdisplay-alt
[env:esp32-2432S022C-SD-V]
board = esp32-2432S022C-vertical
[env:esp32-CROWPANEL-28R] [env:esp32-CROWPANEL-28R]
board = esp32-CROWPANEL-28R board = esp32-CROWPANEL-28R
lib_deps = lib_deps =
@@ -102,3 +105,15 @@ lib_deps =
plageoj/UrlEncode@^1.0.1 plageoj/UrlEncode@^1.0.1
knolleary/PubSubClient@^2.8 knolleary/PubSubClient@^2.8
WiFiClientSecure WiFiClientSecure
[env:esp32-CROWPANEL-35C]
board = esp32-CROWPANEL-35C
lib_deps =
SPI
https://github.com/suchmememanyskill/lvgl
https://github.com/lovyan03/LovyanGFX@1.2.0
bblanchon/ArduinoJson@^7.0.0
plageoj/UrlEncode@^1.0.1
knolleary/PubSubClient@^2.8
WiFiClientSecure

View File

@@ -83,6 +83,7 @@ typedef struct {
bool sort_macros : 1; bool sort_macros : 1;
bool show_estop : 1; bool show_estop : 1;
bool full_filenames : 1; bool full_filenames : 1;
bool double_size_gcode_img : 1;
}; };
}; };

View File

@@ -1,5 +1,5 @@
#include "data_setup.h"
#include "current_printer.h" #include "current_printer.h"
#include "semaphore.h"
bool current_printer_move_printer(const char* axis, float amount, bool relative) bool current_printer_move_printer(const char* axis, float amount, bool relative)
{ {

View File

@@ -1,5 +1,6 @@
#include "data_setup.h" #include "data_setup.h"
#include "semaphore.h"
#include <esp_task_wdt.h> #include <esp_task_wdt.h>
#include <UrlEncode.h> #include <UrlEncode.h>
#include "printer_integration.hpp" #include "printer_integration.hpp"
@@ -8,32 +9,8 @@
#include "bambu/bambu_printer_integration.hpp" #include "bambu/bambu_printer_integration.hpp"
#include "octoprint/octoprint_printer_integration.hpp" #include "octoprint/octoprint_printer_integration.hpp"
SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore;
const long data_update_interval = 780; const long data_update_interval = 780;
void semaphore_init(){
freezeRenderThreadSemaphore = xSemaphoreCreateMutex();
freezeRequestThreadSemaphore = xSemaphoreCreateMutex();
xSemaphoreGive(freezeRenderThreadSemaphore);
xSemaphoreGive(freezeRequestThreadSemaphore);
}
void freeze_request_thread(){
xSemaphoreTake(freezeRequestThreadSemaphore, portMAX_DELAY);
}
void unfreeze_request_thread(){
xSemaphoreGive(freezeRequestThreadSemaphore);
}
void freeze_render_thread(){
xSemaphoreTake(freezeRenderThreadSemaphore, portMAX_DELAY);
}
void unfreeze_render_thread(){
xSemaphoreGive(freezeRenderThreadSemaphore);
}
void fetch_printer_data() void fetch_printer_data()
{ {
freeze_request_thread(); freeze_request_thread();

View File

@@ -1,7 +1,4 @@
#pragma once #pragma once
void data_loop(); void data_loop();
void data_setup(); void data_setup();
void freeze_request_thread();
void unfreeze_request_thread();

View File

@@ -0,0 +1,183 @@
// Adapted from https://github.com/OzInFl/Elecrow-3.5-RGB-TFT-SQUARELINE-EXAMPLE
#ifdef CYD_SCREEN_DRIVER_ESP32_CROWPANEL_35C
#include "../screen_driver.h"
#include "lvgl.h"
#include "../../conf/global_config.h"
#include <LovyanGFX.hpp>
#include <Arduino.h>
#include <Wire.h>
#ifdef CYD_SCREEN_VERTICAL
#error "Vertical screen not supported with the ESP32_CROWPANEL_28R driver"
#endif
static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[CYD_SCREEN_HEIGHT_PX * CYD_SCREEN_WIDTH_PX / 10];
#define BUZZER_PIN 20
#define LCD_BL 46
#define SDA_FT6236 38
#define SCL_FT6236 39
#define I2C_TOUCH_ADDR 0x38
class LGFX : public lgfx::LGFX_Device
{
lgfx::Panel_ILI9488 _panel_instance;
lgfx::Bus_Parallel16 _bus_instance;
lgfx::Touch_FT5x06 _touch_instance;
public:
LGFX()
{
auto bus_cfg = _bus_instance.config();
bus_cfg.port = 0;
bus_cfg.freq_write = 80000000;
bus_cfg.pin_wr = 18;
bus_cfg.pin_rd = 48;
bus_cfg.pin_rs = 45;
bus_cfg.pin_d0 = 47;
bus_cfg.pin_d1 = 21;
bus_cfg.pin_d2 = 14;
bus_cfg.pin_d3 = 13;
bus_cfg.pin_d4 = 12;
bus_cfg.pin_d5 = 11;
bus_cfg.pin_d6 = 10;
bus_cfg.pin_d7 = 9;
bus_cfg.pin_d8 = 3;
bus_cfg.pin_d9 = 8;
bus_cfg.pin_d10 = 16;
bus_cfg.pin_d11 = 15;
bus_cfg.pin_d12 = 7;
bus_cfg.pin_d13 = 6;
bus_cfg.pin_d14 = 5;
bus_cfg.pin_d15 = 4;
_bus_instance.config(bus_cfg);
_panel_instance.setBus(&_bus_instance);
auto panel_cfg = _panel_instance.config();
panel_cfg.pin_cs = -1;
panel_cfg.pin_rst = -1;
panel_cfg.pin_busy = -1;
panel_cfg.memory_width = 320;
panel_cfg.memory_height = 480;
panel_cfg.panel_width = 320;
panel_cfg.panel_height = 480;
panel_cfg.offset_x = 0;
panel_cfg.offset_y = 0;
panel_cfg.offset_rotation = 0;
panel_cfg.dummy_read_pixel = 8;
panel_cfg.dummy_read_bits = 1;
panel_cfg.readable = true;
panel_cfg.invert = global_config.printer_config[global_config.printer_index].invert_colors ? true : false;
panel_cfg.rgb_order = false;
panel_cfg.dlen_16bit = true;
panel_cfg.bus_shared = true;
_panel_instance.config(panel_cfg);
auto touch_cfg = _touch_instance.config();
touch_cfg.x_min = 0;
touch_cfg.x_max = 319;
touch_cfg.y_min = 0;
touch_cfg.y_max = 479;
touch_cfg.pin_int = -1;
touch_cfg.bus_shared = false;
touch_cfg.offset_rotation = 0;
touch_cfg.i2c_port = 1;
touch_cfg.i2c_addr = 0x38;
touch_cfg.pin_sda = 38;
touch_cfg.pin_scl = 39;
touch_cfg.freq = 400000;
_touch_instance.config(touch_cfg);
_panel_instance.setTouch(&_touch_instance);
setPanel(&_panel_instance);
}
};
LGFX tft;
void screen_setBrightness(unsigned char brightness)
{
// TODO
}
void set_invert_display()
{
// TODO
}
void screen_lv_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint32_t w = (area->x2 - area->x1 + 1);
uint32_t h = (area->y2 - area->y1 + 1);
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.writePixels((lgfx::rgb565_t *)&color_p->full, w * h);
tft.endWrite();
lv_disp_flush_ready(disp);
}
void screen_lv_touchRead(lv_indev_drv_t *indev_driver, lv_indev_data_t *data)
{
uint16_t touchX, touchY;
bool touched = tft.getTouch(&touchX, &touchY);
if (touchX > CYD_SCREEN_WIDTH_PX || touchY > CYD_SCREEN_HEIGHT_PX)
{
LOG_LN("Y or y outside of expected parameters..");
}
else
{
data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
data->point.x = touchX;
data->point.y = touchY;
}
}
void screen_setup()
{
pinMode(BUZZER_PIN, OUTPUT);
ledcSetup(4, 5000, 8);
ledcAttachPin(BUZZER_PIN, 4);
tft.begin();
tft.setRotation(global_config.rotate_screen ? 3 : 1);
delay(500);
pinMode(LCD_BL, OUTPUT);
digitalWrite(LCD_BL, HIGH);
/*
ledcSetup(0, 5000, 12);
ledcAttachPin(LCD_BL, 0);
*/
lv_init();
lv_disp_draw_buf_init(&draw_buf, buf, NULL, CYD_SCREEN_WIDTH_PX * CYD_SCREEN_HEIGHT_PX / 10);
/*Initialize the display*/
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = CYD_SCREEN_WIDTH_PX;
disp_drv.ver_res = CYD_SCREEN_HEIGHT_PX;
disp_drv.flush_cb = screen_lv_flush;
disp_drv.draw_buf = &draw_buf;
lv_disp_drv_register(&disp_drv);
/*Initialize the (dummy) input device driver*/
static lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = screen_lv_touchRead;
lv_indev_drv_register(&indev_drv);
}
#endif

View File

@@ -3,12 +3,23 @@
#include <UrlEncode.h> #include <UrlEncode.h>
#include "../../ui/serial/serial_console.h" #include "../../ui/serial/serial_console.h"
void clear_serial_buffer() void clear_serial_buffer(bool can_rely_on_newline_terminator = true)
{ {
while (Serial.available()) if (can_rely_on_newline_terminator)
{ {
Serial.read(); if (Serial.available())
}; {
while (Serial.read() != '\n')
;
}
}
else
{
while (Serial.available())
{
Serial.read();
}
}
} }
// Request: {timeout} {method} {endpoint} // Request: {timeout} {method} {endpoint}
@@ -46,7 +57,7 @@ bool make_serial_request(JsonDocument &out, int timeout_ms, HttpRequestType requ
if (buff[0] < '0' || buff[0] > '9') if (buff[0] < '0' || buff[0] > '9')
{ {
Serial.println("Invalid error code"); Serial.printf("Invalid error code, got char '%c'\n", buff[0]);
clear_serial_buffer(); clear_serial_buffer();
return false; return false;
@@ -108,7 +119,7 @@ bool make_binary_request(BinaryResponse* data, int timeout_ms, HttpRequestType r
if (buff[0] < '0' || buff[0] > '9') if (buff[0] < '0' || buff[0] > '9')
{ {
Serial.println("Invalid length"); Serial.println("Invalid length");
clear_serial_buffer(); clear_serial_buffer(false);
return false; return false;
} }
@@ -118,7 +129,7 @@ bool make_binary_request(BinaryResponse* data, int timeout_ms, HttpRequestType r
if (data_length <= 0) if (data_length <= 0)
{ {
Serial.println("0 Length"); Serial.println("0 Length");
clear_serial_buffer(); clear_serial_buffer(false);
return false; return false;
} }
@@ -129,7 +140,7 @@ bool make_binary_request(BinaryResponse* data, int timeout_ms, HttpRequestType r
if (data->data == NULL) if (data->data == NULL)
{ {
Serial.println("Failed to allocate memory"); Serial.println("Failed to allocate memory");
clear_serial_buffer(); clear_serial_buffer(false);
return false; return false;
} }

View File

@@ -3,6 +3,27 @@
#include "../../ui/ui_utils.h" #include "../../ui/ui_utils.h"
#include "../common/constants.h" #include "../common/constants.h"
#include <stdio.h> #include <stdio.h>
#include "../semaphore.h"
bool send_gcode_blocking(const char *gcode, bool wait = true)
{
freeze_request_thread();
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
bool result = printer->send_gcode(gcode);
unfreeze_request_thread();
return result;
}
bool move_printer_blocking(const char* axis, float amount, bool relative)
{
freeze_request_thread();
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
bool result = printer->move_printer(axis, amount, relative);
unfreeze_request_thread();
return result;
}
static void set_fan_speed_text(lv_event_t * e) { static void set_fan_speed_text(lv_event_t * e) {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
@@ -14,10 +35,9 @@ static void set_fan_speed_text(lv_event_t * e) {
static void set_fan_speed(lv_event_t * e){ static void set_fan_speed(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e); int speed = (int)lv_event_get_user_data(e);
int actual_speed = fan_percent_to_byte(speed); int actual_speed = fan_percent_to_byte(speed);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[16]; char gcode[16];
sprintf(gcode, "M106 S%d", actual_speed); sprintf(gcode, "M106 S%d", actual_speed);
printer->send_gcode(gcode); send_gcode_blocking(gcode);
} }
FAN_SPEED_COLUMN(set_fan_speed, klipper_fan_speed_columns) FAN_SPEED_COLUMN(set_fan_speed, klipper_fan_speed_columns)
@@ -40,24 +60,21 @@ static void set_zoffset_text_ex(lv_event_t * e) {
static void set_zoffset(lv_event_t * e){ static void set_zoffset(lv_event_t * e){
char* offset = (char*)lv_event_get_user_data(e); char* offset = (char*)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[48]; char gcode[48];
sprintf(gcode, "SET_GCODE_OFFSET Z_ADJUST=%s MOVE=1", offset); sprintf(gcode, "SET_GCODE_OFFSET Z_ADJUST=%s MOVE=1", offset);
printer->send_gcode(gcode); send_gcode_blocking(gcode);
} }
static void set_z(lv_event_t * e){ static void set_z(lv_event_t * e){
void* ptr = lv_event_get_user_data(e); void* ptr = lv_event_get_user_data(e);
float value = *(float *)(&ptr); float value = *(float *)(&ptr);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
if (value < 0) { if (value < 0) {
printer->send_gcode("SET_GCODE_OFFSET Z=0 MOVE=1"); send_gcode_blocking("SET_GCODE_OFFSET Z=0 MOVE=1");
return; return;
} }
printer->move_printer("Z", value, false); move_printer_blocking("Z", value, false);
} }
const char* zoffsets[] = { "-0.01", "-0.025", "-0.05", "-0.2" }; const char* zoffsets[] = { "-0.01", "-0.025", "-0.05", "-0.2" };
@@ -80,20 +97,18 @@ static void set_speed_mult_text(lv_event_t * e){
static void set_speed_mult(lv_event_t * e){ static void set_speed_mult(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e); int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[16]; char gcode[16];
sprintf(gcode, "M220 S%d", speed); sprintf(gcode, "M220 S%d", speed);
printer->send_gcode(gcode); send_gcode_blocking(gcode);
} }
static void set_speed_mult_offset(lv_event_t * e){ static void set_speed_mult_offset(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e); int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
float result = get_current_printer_data()->speed_mult * 100 + speed; float result = get_current_printer_data()->speed_mult * 100 + speed;
get_current_printer_data()->speed_mult = result / 100; get_current_printer_data()->speed_mult = result / 100;
char gcode[16]; char gcode[16];
sprintf(gcode, "M220 S%.0f", result); sprintf(gcode, "M220 S%.0f", result);
printer->send_gcode(gcode); send_gcode_blocking(gcode);
} }
const char* speed_presets[] = { "50%", "100%", "150%", "200%" }; const char* speed_presets[] = { "50%", "100%", "150%", "200%" };
@@ -118,20 +133,19 @@ static void set_extrude_mult_text(lv_event_t * e){
static void set_extrude_mult(lv_event_t * e){ static void set_extrude_mult(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e); int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[16]; char gcode[16];
sprintf(gcode, "M221 S%d", speed); sprintf(gcode, "M221 S%d", speed);
printer->send_gcode(gcode); send_gcode_blocking(gcode);
} }
static void set_extrude_mult_offset(lv_event_t * e){ static void set_extrude_mult_offset(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e); int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
float result = get_current_printer_data()->extrude_mult * 100 + speed; float result = get_current_printer_data()->extrude_mult * 100 + speed;
get_current_printer_data()->extrude_mult = result / 100; get_current_printer_data()->extrude_mult = result / 100;
char gcode[16]; char gcode[16];
sprintf(gcode, "M221 S%.0f", result); sprintf(gcode, "M221 S%.0f", result);
printer->send_gcode(gcode);
send_gcode_blocking(gcode);
} }
const char* extrude_presets[] = { "95%", "100%", "105%", "110%" }; const char* extrude_presets[] = { "95%", "100%", "105%", "110%" };
@@ -145,7 +159,7 @@ lv_button_column_t extrude_mult_columns[] = {
}; };
static void open_fan_speed_panel(lv_event_t * e){ static void open_fan_speed_panel(lv_event_t * e){
lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_fan_speed_text, klipper_fan_speed_columns, 2); lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_fan_speed_text, klipper_fan_speed_columns, 3);
} }
static void open_zoffset_panel(lv_event_t * e){ static void open_zoffset_panel(lv_event_t * e){

View File

@@ -62,11 +62,18 @@ PrinterData* BasePrinter::AnnouncePrinterData()
lv_msg_send(DATA_PRINTER_STATE, get_current_printer()); lv_msg_send(DATA_PRINTER_STATE, get_current_printer());
} }
if (old_popup_message != printer_data_copy->popup_message && old_popup_message != NULL && old_popup_message != blank && !no_free) if (old_popup_message != printer_data_copy->popup_message)
{ {
LOG_F(("Freeing popup message '%s' (%x)\n", old_popup_message, old_popup_message)); if (old_popup_message != NULL && old_popup_message != blank && !no_free)
free(old_popup_message); {
lv_msg_send(DATA_PRINTER_POPUP, get_current_printer()); LOG_F(("Freeing popup message '%s' (%x)\n", old_popup_message, old_popup_message));
free(old_popup_message);
}
if (printer_data_copy->popup_message != NULL && printer_data_copy->popup_message != blank)
{
lv_msg_send(DATA_PRINTER_POPUP, get_current_printer());
}
} }
lv_msg_send(DATA_PRINTER_DATA, get_current_printer()); lv_msg_send(DATA_PRINTER_DATA, get_current_printer());

View File

@@ -0,0 +1,28 @@
#include "semaphore.h"
#include <UrlEncode.h>
#include <esp_task_wdt.h>
SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore;
void semaphore_init(){
freezeRenderThreadSemaphore = xSemaphoreCreateMutex();
freezeRequestThreadSemaphore = xSemaphoreCreateMutex();
xSemaphoreGive(freezeRenderThreadSemaphore);
xSemaphoreGive(freezeRequestThreadSemaphore);
}
void freeze_request_thread(){
xSemaphoreTake(freezeRequestThreadSemaphore, portMAX_DELAY);
}
void unfreeze_request_thread(){
xSemaphoreGive(freezeRequestThreadSemaphore);
}
void freeze_render_thread(){
xSemaphoreTake(freezeRenderThreadSemaphore, portMAX_DELAY);
}
void unfreeze_render_thread(){
xSemaphoreGive(freezeRenderThreadSemaphore);
}

View File

@@ -0,0 +1,11 @@
#pragma once
void semaphore_init();
void freeze_request_thread();
void unfreeze_request_thread();
// Don't use unless you want trouble
void freeze_render_thread();
// Don't use unless you want trouble
void unfreeze_render_thread();

View File

@@ -375,6 +375,8 @@ void show_ip_entry()
lv_textarea_set_placeholder_text(host_entry, "Printer IP"); lv_textarea_set_placeholder_text(host_entry, "Printer IP");
lv_textarea_set_placeholder_text(port_entry, "Access code"); lv_textarea_set_placeholder_text(port_entry, "Access code");
lv_textarea_set_placeholder_text(auth_entry, "Printer serial number"); lv_textarea_set_placeholder_text(auth_entry, "Printer serial number");
lv_obj_clear_flag(auth_entry, LV_OBJ_FLAG_USER_2);
lv_obj_add_flag(auth_entry, LV_OBJ_FLAG_USER_3);
break; break;
case PrinterType::PrinterTypeOctoprint: case PrinterType::PrinterTypeOctoprint:
lv_obj_clear_flag(auth_entry, LV_OBJ_FLAG_USER_2); lv_obj_clear_flag(auth_entry, LV_OBJ_FLAG_USER_2);

View File

@@ -3,6 +3,7 @@
#include <Esp.h> #include <Esp.h>
#include "../core/current_printer.h" #include "../core/current_printer.h"
#include "../core/data_setup.h" #include "../core/data_setup.h"
#include "../core/semaphore.h"
typedef struct { typedef struct {
const char* power_device_name; const char* power_device_name;

View File

@@ -5,6 +5,7 @@
#include "../core/data_setup.h" #include "../core/data_setup.h"
#include "../conf/global_config.h" #include "../conf/global_config.h"
#include "ota_setup.h" #include "ota_setup.h"
#include "../core/semaphore.h"
//const char *ota_url = "https://gist.githubusercontent.com/suchmememanyskill/ece418fe199e155340de6c224a0badf2/raw/0d6762d68bc807cbecc71e40d55b76692397a7b3/update.json"; // Test url //const char *ota_url = "https://gist.githubusercontent.com/suchmememanyskill/ece418fe199e155340de6c224a0badf2/raw/0d6762d68bc807cbecc71e40d55b76692397a7b3/update.json"; // Test url
const char *ota_url = "https://suchmememanyskill.github.io/CYD-Klipper/OTA.json"; // Prod url const char *ota_url = "https://suchmememanyskill.github.io/CYD-Klipper/OTA.json"; // Prod url

View File

@@ -32,43 +32,22 @@ static void btn_print_file_verify(lv_event_t * e)
return; return;
} }
const auto button_size_mult = 1.3f;
lv_obj_t * btn = lv_event_get_target(e);
selected_file = (char*)lv_event_get_user_data(e); selected_file = (char*)lv_event_get_user_data(e);
lv_obj_t * panel = lv_obj_create(lv_scr_act()); lv_obj_t * panel = lv_obj_create(lv_scr_act());
lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX * 2, 0); lv_obj_set_style_pad_hor(panel, CYD_SCREEN_GAP_PX * 2, 0);
lv_obj_set_style_pad_ver(panel, CYD_SCREEN_GAP_PX, 0);
lv_obj_set_size(panel, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 4, CYD_SCREEN_HEIGHT_PX - CYD_SCREEN_GAP_PX * 3); lv_obj_set_size(panel, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 4, CYD_SCREEN_HEIGHT_PX - CYD_SCREEN_GAP_PX * 3);
lv_obj_align(panel, LV_ALIGN_CENTER, 0, 0); lv_obj_align(panel, LV_ALIGN_CENTER, 0, 0);
lv_layout_flex_column(panel, LV_FLEX_ALIGN_CENTER);
lv_obj_t * label_print_file = lv_label_create(panel); lv_obj_t * label_print_file = lv_label_create(panel);
lv_label_set_text(label_print_file, "Print File"); lv_label_set_text(label_print_file, "Print File");
lv_obj_align(label_print_file, LV_ALIGN_TOP_LEFT, 0, 0);
lv_obj_t * label = lv_label_create(panel); lv_obj_t * top_panel = lv_create_empty_panel(panel);
lv_label_set_text(label, selected_file); lv_obj_set_width(top_panel, LV_PCT(100));
lv_obj_align(label, LV_ALIGN_CENTER, 0, -20); lv_obj_set_flex_grow(top_panel, 1);
lv_obj_set_width(label, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 10); lv_layout_flex_row(top_panel, LV_FLEX_ALIGN_CENTER);
lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);
btn = lv_btn_create(panel);
lv_obj_align(btn, LV_ALIGN_BOTTOM_LEFT, 0, 0);
lv_obj_set_size(btn, CYD_SCREEN_MIN_BUTTON_WIDTH_PX * button_size_mult, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX * button_size_mult);
lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel);
label = lv_label_create(btn);
lv_label_set_text(label, LV_SYMBOL_CLOSE);
lv_obj_center(label);
btn = lv_btn_create(panel);
lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_set_size(btn, CYD_SCREEN_MIN_BUTTON_WIDTH_PX * button_size_mult, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX * button_size_mult);
lv_obj_add_event_cb(btn, btn_print_file, LV_EVENT_CLICKED, panel);
label = lv_label_create(btn);
lv_label_set_text(label, LV_SYMBOL_OK);
lv_obj_center(label);
Thumbnail thumbnail = current_printer_get_32_32_png_image_thumbnail(selected_file); Thumbnail thumbnail = current_printer_get_32_32_png_image_thumbnail(selected_file);
lv_obj_t * img = NULL; lv_obj_t * img = NULL;
@@ -85,17 +64,45 @@ static void btn_print_file_verify(lv_event_t * e)
img_header->header.cf = LV_IMG_CF_RAW_ALPHA; img_header->header.cf = LV_IMG_CF_RAW_ALPHA;
img_header->data = thumbnail.png; img_header->data = thumbnail.png;
img = lv_img_create(panel); img = lv_img_create(top_panel);
lv_img_set_src(img, img_header); lv_img_set_src(img, img_header);
lv_obj_align(img, LV_ALIGN_TOP_LEFT, 0, 0); lv_img_set_antialias(img, true);
lv_img_set_size_mode(img, LV_IMG_SIZE_MODE_REAL);
lv_obj_t * text_center_panel = lv_create_empty_panel(panel);
lv_obj_set_size(text_center_panel, CYD_SCREEN_MIN_BUTTON_WIDTH_PX * 2, 32); if (global_config.double_size_gcode_img)
lv_obj_align(text_center_panel, LV_ALIGN_TOP_LEFT, CYD_SCREEN_GAP_PX + 32, 0); {
lv_img_set_zoom(img, LV_IMG_ZOOM_NONE * 2);
lv_obj_set_parent(label_print_file, text_center_panel); }
lv_obj_align(label_print_file, LV_ALIGN_LEFT_MID, 0, 0);
} }
lv_obj_t * label = lv_label_create(top_panel);
lv_label_set_text(label, selected_file);
lv_obj_set_height(label, LV_SIZE_CONTENT);
lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);
lv_obj_set_flex_grow(label, 1);
lv_obj_t* buttons_panel = lv_create_empty_panel(panel);
lv_layout_flex_row(buttons_panel);
lv_obj_set_size(buttons_panel, LV_PCT(100), CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
lv_obj_t* btn = lv_btn_create(buttons_panel);
lv_obj_set_flex_grow(btn, 1);
lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel);
label = lv_label_create(btn);
lv_label_set_text(label, LV_SYMBOL_CLOSE " Cancel");
lv_obj_center(label);
btn = lv_btn_create(buttons_panel);
lv_obj_set_flex_grow(btn, 1);
lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
lv_obj_add_event_cb(btn, btn_print_file, LV_EVENT_CLICKED, panel);
lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel);
label = lv_label_create(btn);
lv_label_set_text(label, LV_SYMBOL_OK " Print");
lv_obj_center(label);
} }
void files_panel_init(lv_obj_t* panel){ void files_panel_init(lv_obj_t* panel){

View File

@@ -132,6 +132,13 @@ static void full_filenames_switch(lv_event_t* e){
write_global_config(); write_global_config();
} }
static void double_size_gcode_img_switch(lv_event_t* e){
auto state = lv_obj_get_state(lv_event_get_target(e));
bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED);
global_config.double_size_gcode_img = checked;
write_global_config();
}
static void rotate_screen_switch(lv_event_t* e){ static void rotate_screen_switch(lv_event_t* e){
auto state = lv_obj_get_state(lv_event_get_target(e)); auto state = lv_obj_get_state(lv_event_get_target(e));
bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED); bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED);
@@ -239,6 +246,7 @@ void settings_section_behaviour(lv_obj_t* panel)
lv_create_custom_menu_switch("Sort Macros A->Z", panel, sort_macros_switch, global_config.sort_macros); lv_create_custom_menu_switch("Sort Macros A->Z", panel, sort_macros_switch, global_config.sort_macros);
lv_create_custom_menu_switch("Show Full Filenames", panel, full_filenames_switch, global_config.full_filenames); lv_create_custom_menu_switch("Show Full Filenames", panel, full_filenames_switch, global_config.full_filenames);
lv_create_custom_menu_switch("2X Size Gcode Image", panel, double_size_gcode_img_switch, global_config.double_size_gcode_img);
lv_create_custom_menu_button("Configure Printer Host", panel, reset_ip_click, "Restart"); lv_create_custom_menu_button("Configure Printer Host", panel, reset_ip_click, "Restart");
} }

View File

@@ -7,6 +7,7 @@
#include "../core/lv_setup.h" #include "../core/lv_setup.h"
#include "serial/serial_console.h" #include "serial/serial_console.h"
#include "panels/panel.h" #include "panels/panel.h"
#include "../core/semaphore.h"
void wifi_init_inner(); void wifi_init_inner();
void wifi_pass_entry(const char* ssid); void wifi_pass_entry(const char* ssid);

7
ci.py
View File

@@ -11,12 +11,14 @@ CYD_PORTS = [
"esp32-3248S035C-V", "esp32-3248S035C-V",
#"esp32-4827S043R-SD", #"esp32-4827S043R-SD",
"esp32-CROWPANEL-28R", "esp32-CROWPANEL-28R",
"esp32-CROWPANEL-35C",
] ]
ESP_S3_CHIPS = [ ESP_S3_CHIPS = [
"esp32-8048S043C-SD", "esp32-8048S043C-SD",
"esp32-8048S043C-SD-alt", "esp32-8048S043C-SD-alt",
"esp32-4827S043C-SD", "esp32-4827S043C-SD",
"esp32-CROWPANEL-35C",
] ]
BASE_DIR = os.getcwd() BASE_DIR = os.getcwd()
@@ -80,7 +82,10 @@ for port in CYD_PORTS:
shutil.copy(os.path.join(os.path.expanduser("~"), ".platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin"), f"{port_path}/boot_app0.bin") shutil.copy(os.path.join(os.path.expanduser("~"), ".platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin"), f"{port_path}/boot_app0.bin")
os.chdir(port_path) os.chdir(port_path)
subprocess.run(["python3", "-m", "esptool", "--chip", "esp32", "merge_bin", "-o", "merged_firmware.bin", "--flash_mode", "dio", "--flash_freq", "40m", "--flash_size", "4MB", "0x1000", "bootloader.bin", "0x8000", "partitions.bin", "0xe000", "boot_app0.bin", "0x10000", "firmware.bin"], check=True) if (port in ESP_S3_CHIPS):
subprocess.run(["python3", "-m", "esptool", "--chip", "esp32s3", "merge_bin", "-o", "merged_firmware.bin", "--flash_mode", "qio", "--flash_freq", "80m", "--flash_size", "16MB", "0x1000", "bootloader.bin", "0x8000", "partitions.bin", "0xe000", "boot_app0.bin", "0x10000", "firmware.bin"], check=True)
else:
subprocess.run(["python3", "-m", "esptool", "--chip", "esp32", "merge_bin", "-o", "merged_firmware.bin", "--flash_mode", "dio", "--flash_freq", "40m", "--flash_size", "4MB", "0x1000", "bootloader.bin", "0x8000", "partitions.bin", "0xe000", "boot_app0.bin", "0x10000", "firmware.bin"], check=True)
os.chdir(BASE_DIR) os.chdir(BASE_DIR)

View File

@@ -1,8 +1,21 @@
#!/bin/bash #!/bin/bash
if [ "$EUID" -eq 0 ]; then if [ "$EUID" -eq 0 ]; then
echo "Please do not run as root" read -r -p "Are you sure you want to run this service as root? [y/N] " response
exit response=${response,,} # tolower
if ! [[ "$response" =~ ^(yes|y)$ ]]; then
exit
fi
SERVICE_PATH="/etc/systemd/system/cyd-klipper-serial.service"
else
echo "Are you sure you want to run this service as the current user?"
read -r -p "Make sure this user is logged in at boot! [y/N] " response
response=${response,,} # tolower
if ! [[ "$response" =~ ^(yes|y)$ ]]; then
exit
fi
mkdir -p ~/.config/systemd/user
SERVICE_PATH="$HOME/.config/systemd/user/cyd-klipper-serial.service"
fi fi
set -e set -e
@@ -15,20 +28,26 @@ source ./env/bin/activate
pip3 install -r requirements.txt pip3 install -r requirements.txt
# Create systemd unit file # Create systemd unit file
mkdir -p ~/.config/systemd/user
echo "[Unit]" > ~/.config/systemd/user/cyd-klipper-serial.service echo "[Unit]" > $SERVICE_PATH
echo "Description=CYD Klipper serial server" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "Description=CYD Klipper serial server" >> $SERVICE_PATH
echo "After=network.target" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "After=network.target" >> $SERVICE_PATH
echo "" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "" >> $SERVICE_PATH
echo "[Service]" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "[Service]" >> $SERVICE_PATH
echo "ExecStart=$(pwd)/run.sh" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "ExecStart=$(pwd)/run.sh" >> $SERVICE_PATH
echo "WorkingDirectory=$(pwd)" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "WorkingDirectory=$(pwd)" >> $SERVICE_PATH
echo "Restart=always" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "Restart=always" >> $SERVICE_PATH
echo "" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "" >> $SERVICE_PATH
echo "[Install]" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "[Install]" >> $SERVICE_PATH
echo "WantedBy=multi-user.target" >> ~/.config/systemd/user/cyd-klipper-serial.service echo "WantedBy=multi-user.target" >> $SERVICE_PATH
# Start the service # Start the service
systemctl --user daemon-reload if [ "$EUID" -eq 0 ]; then
systemctl --user enable cyd-klipper-serial systemctl daemon-reload
systemctl --user start cyd-klipper-serial systemctl enable cyd-klipper-serial
systemctl start cyd-klipper-serial
else
systemctl --user daemon-reload
systemctl --user enable cyd-klipper-serial
systemctl --user start cyd-klipper-serial
fi

View File

@@ -1,13 +1,21 @@
#!/bin/bash #!/bin/bash
set -e
if [ "$EUID" -eq 0 ]; then if [ "$EUID" -eq 0 ]; then
echo "Please do not run as root" systemctl stop cyd-klipper-serial
exit systemctl disable cyd-klipper-serial
rm /etc/systemd/system/cyd-klipper-serial.service
systemctl daemon-reload
else
systemctl --user stop cyd-klipper-serial
systemctl --user disable cyd-klipper-serial
rm ~/.config/systemd/user/cyd-klipper-serial.service
systemctl --user daemon-reload
fi fi
systemctl --user stop cyd-klipper-serial rm -rf ./env
systemctl --user disable cyd-klipper-serial
rm ~/.config/systemd/user/cyd-klipper-serial.service
systemctl --user daemon-reload