|
|
|
#include "mks_wifi.h"
|
|
|
|
|
|
|
|
#include "../../lcd/ultralcd.h"
|
|
|
|
#include "mks_wifi_sd.h"
|
|
|
|
|
|
|
|
uint8_t mks_in_buffer[ESP_PACKET_DATA_MAX_SIZE];
|
|
|
|
uint8_t mks_out_buffer[ESP_PACKET_DATA_MAX_SIZE];
|
|
|
|
uint32_t line_index=0;
|
|
|
|
|
|
|
|
uint8_t esp_packet[ESP_PACKET_DATA_MAX_SIZE];
|
|
|
|
|
|
|
|
|
|
|
|
void mks_wifi_init(void){
|
|
|
|
|
|
|
|
SERIAL_ECHO_MSG("Init MKS WIFI");
|
|
|
|
DEBUG("Init MKS WIFI");
|
|
|
|
|
|
|
|
SET_OUTPUT(MKS_WIFI_IO0);
|
|
|
|
WRITE(MKS_WIFI_IO0, HIGH);
|
|
|
|
|
|
|
|
SET_OUTPUT(MKS_WIFI_IO4);
|
|
|
|
WRITE(MKS_WIFI_IO4, HIGH);
|
|
|
|
|
|
|
|
SET_OUTPUT(MKS_WIFI_IO_RST);
|
|
|
|
WRITE(MKS_WIFI_IO_RST, LOW);
|
|
|
|
ui.set_status((const char *)"WIFI: waiting... ",false);
|
|
|
|
|
|
|
|
safe_delay(1000);
|
|
|
|
WRITE(MKS_WIFI_IO_RST, HIGH);
|
|
|
|
safe_delay(1000);
|
|
|
|
WRITE(MKS_WIFI_IO4, LOW);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void mks_wifi_set_param(void){
|
|
|
|
uint32_t packet_size;
|
|
|
|
ESP_PROTOC_FRAME esp_frame;
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t ap_len = strlen((const char *)MKS_WIFI_SSID);
|
|
|
|
uint32_t key_len = strlen((const char *)MKS_WIFI_KEY);
|
|
|
|
|
|
|
|
|
|
|
|
memset(mks_out_buffer, 0, sizeof(ESP_PACKET_DATA_MAX_SIZE));
|
|
|
|
|
|
|
|
mks_out_buffer[0] = WIFI_MODE_STA;
|
|
|
|
|
|
|
|
mks_out_buffer[1] = ap_len;
|
|
|
|
strncpy((char *)&mks_out_buffer[2], (const char *)MKS_WIFI_SSID, ap_len);
|
|
|
|
|
|
|
|
mks_out_buffer[2+ap_len] = key_len;
|
|
|
|
strncpy((char *)&mks_out_buffer[2 + ap_len + 1], (const char *)MKS_WIFI_KEY, key_len);
|
|
|
|
|
|
|
|
esp_frame.type=ESP_TYPE_NET;
|
|
|
|
esp_frame.dataLen= 2 + ap_len + key_len + 1;
|
|
|
|
esp_frame.data=mks_out_buffer;
|
|
|
|
packet_size=mks_wifi_build_packet(esp_packet,&esp_frame);
|
|
|
|
|
|
|
|
//выпихнуть в uart
|
|
|
|
mks_wifi_send(esp_packet, packet_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Получает данные из всех функций, как только
|
|
|
|
есть перевод строки 0x0A, формирует пакет для
|
|
|
|
ESP и отправляет
|
|
|
|
*/
|
|
|
|
void mks_wifi_out_add(uint8_t *data, uint32_t size){
|
|
|
|
uint32_t packet_size;
|
|
|
|
ESP_PROTOC_FRAME esp_frame;
|
|
|
|
|
|
|
|
while (size--){
|
|
|
|
if(*data == 0x0a){
|
|
|
|
//Переводы строки внутри формирования пакета
|
|
|
|
//Перевод строки => сформировать пакет, отправить, сбросить индекс
|
|
|
|
esp_frame.type=ESP_TYPE_FILE_FIRST; //Название типа из прошивки MKS. Смысла не имееет.
|
|
|
|
esp_frame.dataLen=strnlen((char *)mks_out_buffer,ESP_PACKET_DATA_MAX_SIZE);
|
|
|
|
esp_frame.data=mks_out_buffer;
|
|
|
|
packet_size=mks_wifi_build_packet(esp_packet,&esp_frame);
|
|
|
|
|
|
|
|
//выпихнуть в uart
|
|
|
|
mks_wifi_send(esp_packet, packet_size);
|
|
|
|
//очистить буфер
|
|
|
|
memset(mks_out_buffer,0,ESP_SERIAL_OUT_MAX_SIZE);
|
|
|
|
//сбросить индекс
|
|
|
|
line_index=0;
|
|
|
|
}else{
|
|
|
|
//писать в буфер
|
|
|
|
mks_out_buffer[line_index++]=*data++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(line_index >= ESP_SERIAL_OUT_MAX_SIZE){
|
|
|
|
ERROR("Max line size");
|
|
|
|
line_index=0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t mks_wifi_input(uint8_t data){
|
|
|
|
ESP_PROTOC_FRAME esp_frame;
|
|
|
|
static uint8_t get_packet_from_esp=0;
|
|
|
|
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_in_buffer,0,ESP_PACKET_DATA_MAX_SIZE);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(packet_start_flag){
|
|
|
|
mks_in_buffer[packet_index]=data;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(packet_index == 1){
|
|
|
|
packet_type = mks_in_buffer[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
if(packet_index == 3){
|
|
|
|
payload_size = uint16_t(mks_in_buffer[3] << 8) | mks_in_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_in_buffer[4];
|
|
|
|
|
|
|
|
mks_wifi_parse_packet(&esp_frame);
|
|
|
|
|
|
|
|
if(!get_packet_from_esp){
|
|
|
|
DEBUG("Fisrt packet from ESP, send config");
|
|
|
|
|
|
|
|
mks_wifi_set_param();
|
|
|
|
get_packet_from_esp=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
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){
|
|
|
|
static uint8_t show_ip_once=0;
|
|
|
|
char str[100];
|
|
|
|
|
|
|
|
switch(packet->type){
|
|
|
|
case ESP_TYPE_NET:
|
|
|
|
|
|
|
|
if(packet->data[6] == ESP_NET_WIFI_CONNECTED){
|
|
|
|
if(show_ip_once==0){
|
|
|
|
show_ip_once=1;
|
|
|
|
sprintf(str,"; IP %d.%d.%d.%d",packet->data[0],packet->data[1],packet->data[2],packet->data[3]);
|
|
|
|
ui.set_status((const char *)str+2,true);
|
|
|
|
SERIAL_ECHO_START();
|
|
|
|
SERIAL_ECHOLN((char*)str);
|
|
|
|
|
|
|
|
}
|
|
|
|
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:
|
|
|
|
break;
|
|
|
|
case ESP_TYPE_FILE_FIRST:
|
|
|
|
DEBUG("[FILE_FIRST]");
|
|
|
|
//Передача файла останавливает все процессы,
|
|
|
|
//поэтому печать в этот момент не возможна.
|
|
|
|
if (!CardReader::isPrinting()){
|
|
|
|
mks_wifi_start_file_upload(packet);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ESP_TYPE_FILE_FRAGMENT:
|
|
|
|
DEBUG("[FILE_FRAGMENT]");
|
|
|
|
break;
|
|
|
|
case ESP_TYPE_WIFI_LIST:
|
|
|
|
DEBUG("[WIFI_LIST]");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
DEBUG("[Unkn]");
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void mks_wifi_print_var(uint8_t count, ...){
|
|
|
|
va_list args;
|
|
|
|
uint8_t data;
|
|
|
|
|
|
|
|
va_start(args, count);
|
|
|
|
|
|
|
|
while (count--) {
|
|
|
|
data = va_arg(args, unsigned);
|
|
|
|
mks_wifi_out_add(&data, 1);
|
|
|
|
}
|
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void mks_wifi_print(const char *s){
|
|
|
|
mks_wifi_out_add((uint8_t *)s, strnlen((char *)s,ESP_PACKET_DATA_MAX_SIZE));
|
|
|
|
}
|
|
|
|
|
|
|
|
void mks_wifi_print(int i){
|
|
|
|
char str[14];
|
|
|
|
|
|
|
|
sprintf(str,"%d",i);
|
|
|
|
mks_wifi_out_add((uint8_t *)str, strnlen((char *)str,ESP_PACKET_DATA_MAX_SIZE));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void mks_wifi_println(const char *s){
|
|
|
|
mks_wifi_out_add((uint8_t *)s, strnlen((char *)s,ESP_PACKET_DATA_MAX_SIZE));
|
|
|
|
}
|
|
|
|
|
|
|
|
void mks_wifi_println(float f){
|
|
|
|
char str[30];
|
|
|
|
|
|
|
|
sprintf(str,"%ld\n",(uint32_t)f);
|
|
|
|
mks_wifi_out_add((uint8_t *)str, strnlen((char *)str,ESP_PACKET_DATA_MAX_SIZE));
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t mks_wifi_build_packet(uint8_t *packet, ESP_PROTOC_FRAME *esp_frame){
|
|
|
|
uint16_t packet_size;
|
|
|
|
|
|
|
|
memset(packet,0,ESP_PACKET_DATA_MAX_SIZE);
|
|
|
|
packet[0] = ESP_PROTOC_HEAD;
|
|
|
|
packet[1] = esp_frame->type;
|
|
|
|
|
|
|
|
for(uint32_t i=0; i < esp_frame->dataLen; i++){
|
|
|
|
packet[i+4]=esp_frame->data[i]; //4 байта заголовка отступить
|
|
|
|
}
|
|
|
|
|
|
|
|
packet_size = esp_frame->dataLen + 4;
|
|
|
|
|
|
|
|
if(esp_frame->type != ESP_TYPE_NET){
|
|
|
|
packet[packet_size++] = 0x0d;
|
|
|
|
packet[packet_size++] = 0x0a;
|
|
|
|
esp_frame->dataLen = esp_frame->dataLen + 2; //Два байта на 0x0d 0x0a
|
|
|
|
}
|
|
|
|
|
|
|
|
*((uint16_t *)&packet[2]) = esp_frame->dataLen;
|
|
|
|
|
|
|
|
packet[packet_size] = ESP_PROTOC_TAIL;
|
|
|
|
return packet_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void mks_wifi_send(uint8_t *packet, uint16_t size){
|
|
|
|
safe_delay(10);
|
|
|
|
for( uint32_t i=0; i < (uint32_t)(size+1); i++){
|
|
|
|
while(MYSERIAL1.availableForWrite()==0){
|
|
|
|
safe_delay(10);
|
|
|
|
}
|
|
|
|
MYSERIAL1.write(packet[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|