Перехват символов из serial, скелет разбора пакета
This commit is contained in:
@@ -1007,7 +1007,7 @@
|
||||
//#define LCD_SHOW_E_TOTAL
|
||||
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
#define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
|
||||
#define BOOTSCREEN_TIMEOUT 500 // (ms) Total Duration to display the boot screen(s)
|
||||
#endif
|
||||
|
||||
#if HAS_GRAPHICAL_LCD && EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY)
|
||||
|
||||
@@ -226,6 +226,8 @@ void GcodeSuite::dwell(millis_t time) {
|
||||
void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
KEEPALIVE_STATE(IN_HANDLER);
|
||||
|
||||
DEBUG("Cmd %c %d",parser.command_letter,parser.codenum);
|
||||
|
||||
// Handle a known G, M, or T
|
||||
switch (parser.command_letter) {
|
||||
case 'G': switch (parser.codenum) {
|
||||
|
||||
@@ -434,6 +434,17 @@ void GCodeQueue::get_serial_commands() {
|
||||
|
||||
const char serial_char = c;
|
||||
|
||||
/* Если данные в Serial1 пропускаем через парсер
|
||||
бинарного протокола. Текстовую часть с G-Code пропускаем
|
||||
дальше */
|
||||
if(i == MKS_WIFI_SERIAL_NUM){
|
||||
if(mks_wifi_input(c)){
|
||||
continue;
|
||||
}else{
|
||||
DEBUG("Char to Marlin");
|
||||
};
|
||||
}
|
||||
|
||||
if (ISEOL(serial_char)) {
|
||||
|
||||
// Reset our state, continue if the line was empty
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
*/
|
||||
|
||||
#include "../inc/MarlinConfig.h"
|
||||
#include "../module/mks_wifi/mks_wifi.h"
|
||||
|
||||
class GCodeQueue {
|
||||
public:
|
||||
|
||||
@@ -1,15 +1,116 @@
|
||||
#include "mks_wifi.h"
|
||||
|
||||
ESP_PROTOC_FRAME esp_frame;
|
||||
uint8_t mks_buffer[ESP_PACKET_DATA_MAX_SIZE];
|
||||
|
||||
void mks_wifi_init(void){
|
||||
|
||||
DEBUG("Init MKS WIFI");
|
||||
SET_INPUT_PULLUP(MKS_WIFI_IO0);
|
||||
attachInterrupt(MKS_WIFI_IO0, mks_wifi_io0_irq, FALLING);
|
||||
SET_OUTPUT(MKS_WIFI_IO_RST);
|
||||
WRITE(MKS_WIFI_IO_RST, LOW);
|
||||
|
||||
safe_delay(2000);
|
||||
WRITE(MKS_WIFI_IO_RST, HIGH);
|
||||
|
||||
// SET_INPUT_PULLUP(MKS_WIFI_IO0);
|
||||
// attachInterrupt(MKS_WIFI_IO0, mks_wifi_io0_irq, FALLING);
|
||||
}
|
||||
|
||||
|
||||
/* Тестовая функция на обработчик EXTI прерывания */
|
||||
void mks_wifi_io0_irq(void){
|
||||
|
||||
INFO("IO0 Irq");
|
||||
}
|
||||
|
||||
/*
|
||||
Принимает по символу из входных данных.
|
||||
Сладывает в буфер, формирует пакет.
|
||||
Возвращаемые занчения:
|
||||
1 - найден признак начала пакета, отдавать байт мардину не надо
|
||||
0 - начало пакета не найдено, передать байт дальше марлину
|
||||
*/
|
||||
uint8_t mks_wifi_input(uint8_t data){
|
||||
static uint8_t packet_start_flag=0;
|
||||
static uint8_t packet_type=0;
|
||||
static uint16_t packet_index=0;
|
||||
static uint16_t payload_size=ESP_PACKET_DATA_MAX_SIZE;
|
||||
uint8_t ret_val=1;
|
||||
|
||||
if(data == ESP_PROTOC_HEAD){
|
||||
payload_size = ESP_PACKET_DATA_MAX_SIZE;
|
||||
packet_start_flag=1;
|
||||
packet_index=0;
|
||||
memset(mks_buffer,0,ESP_PACKET_DATA_MAX_SIZE);
|
||||
}
|
||||
|
||||
if(packet_start_flag){
|
||||
mks_buffer[packet_index]=data;
|
||||
}
|
||||
|
||||
if(packet_index == 1){
|
||||
packet_type = mks_buffer[1];
|
||||
}
|
||||
|
||||
if(packet_index == 3){
|
||||
payload_size = uint16_t(mks_buffer[3] << 8) | mks_buffer[2];
|
||||
}
|
||||
|
||||
if( (packet_index >= (payload_size+4)) || (packet_index >= ESP_PACKET_DATA_MAX_SIZE) ){
|
||||
esp_frame.type = packet_type;
|
||||
esp_frame.dataLen = payload_size;
|
||||
esp_frame.data = &mks_buffer[4];
|
||||
|
||||
mks_wifi_parse_packet(&esp_frame);
|
||||
|
||||
packet_start_flag=0;
|
||||
packet_index=0;
|
||||
}
|
||||
|
||||
/* Если в пакете G-Сode, отдаем payload дальше в обработчик марлина */
|
||||
if((packet_type == ESP_TYPE_GCODE) &&
|
||||
(packet_index >= 4) &&
|
||||
(packet_index < (payload_size+5))
|
||||
){
|
||||
ret_val=0;
|
||||
}
|
||||
|
||||
if(packet_start_flag){
|
||||
packet_index++;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
void mks_wifi_parse_packet(ESP_PROTOC_FRAME *packet){
|
||||
|
||||
switch(packet->type){
|
||||
case ESP_TYPE_NET:
|
||||
|
||||
if(packet->data[6] == ESP_NET_WIFI_CONNECTED){
|
||||
DEBUG("[Net] connected, IP: %d.%d.%d.%d",packet->data[0],packet->data[1],packet->data[2],packet->data[3]);
|
||||
}else if(packet->data[6] == ESP_NET_WIFI_EXCEPTION){
|
||||
DEBUG("[Net] wifi exeption");
|
||||
}else{
|
||||
DEBUG("[Net] wifi not config");
|
||||
}
|
||||
break;
|
||||
case ESP_TYPE_GCODE:
|
||||
DEBUG("[Gcode] %s",packet->data);
|
||||
break;
|
||||
case ESP_TYPE_FILE_FIRST:
|
||||
DEBUG("[FILE_FIRST]");
|
||||
break;
|
||||
case ESP_TYPE_FILE_FRAGMENT:
|
||||
DEBUG("[FILE_FRAGMENT]");
|
||||
break;
|
||||
case ESP_TYPE_WIFI_LIST:
|
||||
DEBUG("[WIFI_LIST]");
|
||||
break;
|
||||
default:
|
||||
DEBUG("[Unkn]");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,9 +5,37 @@
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../libs/Segger/log.h"
|
||||
|
||||
#define MKS_WIFI_SERIAL_NUM (uint8_t)1
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t head; //0xa5
|
||||
uint8_t type;
|
||||
uint16_t dataLen;
|
||||
uint8_t *data;
|
||||
uint8_t tail; // 0xfc
|
||||
} ESP_PROTOC_FRAME;
|
||||
|
||||
#define ESP_PROTOC_HEAD (uint8_t)0xa5
|
||||
#define ESP_PROTOC_TAIL (uint8_t)0xfc
|
||||
|
||||
#define ESP_TYPE_NET (uint8_t)0x0
|
||||
#define ESP_TYPE_GCODE (uint8_t)0x1
|
||||
#define ESP_TYPE_FILE_FIRST (uint8_t)0x2
|
||||
#define ESP_TYPE_FILE_FRAGMENT (uint8_t)0x3
|
||||
#define ESP_TYPE_WIFI_LIST (uint8_t)0x4
|
||||
|
||||
#define ESP_PACKET_DATA_MAX_SIZE 1024
|
||||
|
||||
#define ESP_NET_WIFI_CONNECTED (uint8_t)0x0A
|
||||
#define ESP_NET_WIFI_EXCEPTION (uint8_t)0x0E
|
||||
|
||||
#define NOP __asm volatile ("nop")
|
||||
|
||||
|
||||
void mks_wifi_init(void);
|
||||
void mks_wifi_io0_irq(void);
|
||||
|
||||
|
||||
uint8_t mks_wifi_input(uint8_t data);
|
||||
void mks_wifi_parse_packet(ESP_PROTOC_FRAME *packet);
|
||||
|
||||
#endif
|
||||
@@ -160,4 +160,5 @@
|
||||
#ifdef MKS_WIFI
|
||||
#define MKS_WIFI_IO0 PA8
|
||||
#define MKS_WIFI_IO4 PC7
|
||||
#define MKS_WIFI_IO_RST PA5
|
||||
#endif
|
||||
|
||||
17
Схема работы.txt
Normal file
17
Схема работы.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
Работа Марлин с Serial:
|
||||
Вызов manage_inactivity(){
|
||||
if (queue.length < BUFSIZE) queue.get_available_commands();
|
||||
}
|
||||
|
||||
|
||||
queue.get_available_commands(){
|
||||
get_serial_commands();
|
||||
get_sdcard_commands();
|
||||
}
|
||||
}
|
||||
|
||||
get_serial_commands(){
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user