Browse Source

Перехват символов из serial, скелет разбора пакета

pull/1/head
Sergey 5 years ago
parent
commit
99710e0280
  1. 2
      Marlin/Configuration_adv.h
  2. 2
      Marlin/src/gcode/gcode.cpp
  3. 11
      Marlin/src/gcode/queue.cpp
  4. 1
      Marlin/src/gcode/queue.h
  5. 109
      Marlin/src/module/mks_wifi/mks_wifi.cpp
  6. 32
      Marlin/src/module/mks_wifi/mks_wifi.h
  7. 1
      Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
  8. 17
      Схема работы.txt

2
Marlin/Configuration_adv.h

@ -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)

2
Marlin/src/gcode/gcode.cpp

@ -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) {

11
Marlin/src/gcode/queue.cpp

@ -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

1
Marlin/src/gcode/queue.h

@ -27,6 +27,7 @@
*/
#include "../inc/MarlinConfig.h"
#include "../module/mks_wifi/mks_wifi.h"
class GCodeQueue {
public:

109
Marlin/src/module/mks_wifi/mks_wifi.cpp

@ -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);
void mks_wifi_io0_irq(void){
// 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;
}
}

32
Marlin/src/module/mks_wifi/mks_wifi.h

@ -5,9 +5,37 @@
#include "../../inc/MarlinConfig.h"
#include "../../libs/Segger/log.h"
void mks_wifi_init(void);
void mks_wifi_io0_irq(void);
#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

1
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h

@ -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

@ -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(){
}
Loading…
Cancel
Save