Код: Выделить всё
#include <avr/pgmspace.h>
#include <EEPROMex.h>
#include <SPI.h>
#include <SD.h>
#include <LCD5110_Basic.h>
LCD5110 Tablo( 5 , 6 , 7, 9 ,8);
// SCK MOSI DS CS RST
#define __SDCS 10 // CS карты памяти (остальные 11,12,13 согласно назначению)
// Кнопки на землю с D2,D3,D4
extern uint8_t SmallFont[];
File root;
byte px,pz,j;
String MyStr = "";
#define MAX_DISPLAY_LINES 6
#define MAX_DISPLAY_FILES 5
#define MENU_DELAY 100
#define GRBL_RES_PIN A0
#define CHAR_HEIGHT 8
#define CHAR_WIDTH 6
#define CHAR_STOP 0x80 // 128 stop
#define CHAR_PLAY 0x81 // 129 play
#define CHAR_PAUSE 0x82 // 130 pause
#define CHAR_ARIGHT 0x83 // 131 ->
#define CHAR_ALEFT 0x84 // 132 <-
#define CHAR_AUP 0x85 // 133 up
#define CHAR_ADOWN 0x86 // 134 down
#define CHAR_MARK 0x87 // 135 mark
#define CHAR_STEP 0x88 // 136 step
#define CHAR_DRILL 0x89 // 137 drill
#define CHAR_ZLEFT 0x8A // 138 zero left
#define CHAR_ZRIGHT 0x8B // 139 zero right
#define CHAR_SLE 0x8C // 140 scale left empty
#define CHAR_SRE 0x8D // 141 scale right empty
#define CHAR_SCE 0x8E // 142 scale center empty
#define CHAR_SLF 0x8F // 143 scale left full
#define CHAR_SRF 0x90 // 144 scale right full
#define CHAR_SCF 0x91 // 145 scale center full
#define CHAR_EPLAY 0x92 // 146 play empty
#define EXEC_PAUSE 0x0 // sleep
#define EXEC_PLAY 0x1 // send commands without pause
#define EXEC_STEP 0x2 // execute step by step
#define EXEC_EXIT 0x20 // exit from execute
#define EEPROM_FEED 0
#define EEPROM_START 8
#define EEPROM_PAUSE 9
#define EEPROM_UNLOCK 10
#define DEFAULT_FEED 1000
#define FEED_MAX 1250
bool MENU_KEY, OK_KEY, UP_KEY, DOWN_KEY, LOOP_TEMP, Init_sd = false;
int8_t filecount, pp_menu,ppold, skip_page, skip, exec_mode, readcnt;
long current_line;
String fname;
char buff[80];
long feed_dig = 0;
long feed_safe = 0;
unsigned long counter_line = 0;
const char acc0[] PROGMEM = "0 F0\0";
const char acc1[] PROGMEM = "0.01 F100\0";
const char acc2[] PROGMEM = "0.02 F100\0";
const char acc3[] PROGMEM = "0.03 F100\0";
const char acc4[] PROGMEM = "0.04 F100\0";
const char acc5[] PROGMEM = "0.05 F200\0";
const char acc6[] PROGMEM = "0.06 F200\0";
const char acc7[] PROGMEM = "0.07 F200\0";
const char acc8[] PROGMEM = "0.08 F200\0";
const char acc9[] PROGMEM = "0.09 F200\0";
const char acc10[] PROGMEM = "0.1 F400\0";
const char acc11[] PROGMEM = "0.2 F400\0";
const char acc12[] PROGMEM = "0.3 F400\0";
const char acc13[] PROGMEM = "0.4 F400\0";
const char acc14[] PROGMEM = "0.5 F400\0";
const char acc15[] PROGMEM = "1 F600\0";
const char acc16[] PROGMEM = "2 F600\0";
const char acc17[] PROGMEM = "3 F600\0";
const char acc18[] PROGMEM = "4 F600\0";
const char acc19[] PROGMEM = "5 F600\0";
const char acc20[] PROGMEM = "0 F1\0";
const char * const acc_table[] PROGMEM = {acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7, acc8, acc9, acc10, acc11, acc12, acc13, acc14, acc15, acc16, acc17, acc18, acc19, acc20 };
const char empty_line[] PROGMEM = " \n\0";
const char trail[] PROGMEM = " \0";
const char zero[] PROGMEM = " 0 \0";
const char init_error[] PROGMEM = "Init SD failed!\0";
const char text_start[] PROGMEM = " Start\0";
const char text_pause[] PROGMEM = " Pause\0";
const char text_step[] PROGMEM = " Step\0";
const char text_manual[] PROGMEM = " manual\0";
const char text_files[] PROGMEM = " files\0";
const char text_unlock[] PROGMEM = " unlok\0";
const char text_setup[] PROGMEM = " setup\0";
const char text_reset[] PROGMEM = " reset\0";
const char text_exit[] PROGMEM = " exit\0";
const char text_home[] PROGMEM = " home\0";
const char text_feedmax[] PROGMEM = " Feed Max:\0";
const char text_autostart[] PROGMEM = " Auto Start:\0";
const char text_pauseerr[] PROGMEM = " PauseOnERR:\0";
const char text_autounlk[] PROGMEM = " AutoUnlock:\0";
const char text_done[] PROGMEM = "DONE\0";
const char text_next[] PROGMEM = " >>>\0";
const char text_line[] PROGMEM = "Line:\0";
const char text_stepsize[] PROGMEM = " STEP SIZE:\0";
const char cmd_unlock[] PROGMEM = "$X\n\0";
//const char cmd_position[] PROGMEM = "?\n\0";
//const char cmd_cyclestart[] PROGMEM = "~\n\0";
//const char cmd_feedhold[] PROGMEM = "!\n\0";
const char cmd_reset[] PROGMEM = {0x18, '\n', '\0'};
const char cmd_upz[] PROGMEM = "G0Z10F500\0";
const char cmd_zeroxy[] PROGMEM = "G1X0Y0F500\0";
const char cmd_absolute[] PROGMEM = "G90\0";
const char cmd_incremental[] PROGMEM = "G91\0";
const char cmd_seek[] PROGMEM = "G0\0";
const char cmd_linear[] PROGMEM = "G1\0";
const char axis0[] PROGMEM = " X\0";
const char axis1[] PROGMEM = " Y\0";
const char axis2[] PROGMEM = " Z\0";
const char axis3[] PROGMEM = " F\0";
const char * const axis_label[] PROGMEM = {axis0, axis1, axis2, axis3};
//encoder defines
#define encoder0PinA 2 // вниз
#define encoder0PinB 3 // вверх
#define encoder0PinC 4
int8_t encoder0Pos = 1; // Счетчик
int8_t lastReportedPos = 1; // Изменения
static boolean rotating = false; // Дребезг
// interrupt service routine vars
boolean A_set = false;
boolean B_set = false;
static boolean encClick = false;
//assistatnt procedures
void printSerialString(char *string) { //Вывод в GRBL из progmem
while (pgm_read_byte(string) != '\0') {
Serial.write(pgm_read_byte_near(string));
string++;
}
}
void MSG(char *string,byte px,byte pz) { //*********** Вывод на экран из progmem ********************
while (pgm_read_byte(string) != '\0') { //*********** c позиции px (0-78) в строку pz (0-5)
MyStr=MyStr+char(pgm_read_byte_near(string));
string++; Tablo.print(MyStr, px, pz*8);}//
MyStr="";
}
void str_print(char s, byte size){ //*************** Перемещение курсора по меню **********************
unsigned char x;
for (x = 0; x <= 5;x++){ //Стирание первого столбца.
Tablo.print (" ",0,x * 8);} // -/-
Tablo.print (">",0,s * 8); // Вывод значка ">"
}
void gauge(int8_t x,int8_t y,int8_t width,int8_t pos,int8_t scale){//Вывод слайдера
pos = pos / 1.5;//scale;
for (int8_t wdt = 0; wdt <= width; wdt++) {
int8_t center = (width / 2);
int8_t rpos = pos + center;
if (pos < (0 - center)) {
pos = 0 - center;
};
if (pos > center) {
pos = center;
};
if (rpos < 0) {
rpos = 0;
}
if (rpos > width) {
rpos = width;
}
if ((wdt == 0) && (rpos > 0)) {
Tablo.print ("0",wdt*2+x,y*8); // начало шкалы
} else if ((wdt == 0) && (rpos == 0)) {
Tablo.print (">",wdt*2+x,y*8);
//display.write(CHAR_SLF);
} else if ((wdt == width) && (rpos < width)) {
Tablo.print ("0",wdt*2+x,y*8); // конец шкалы
Tablo.print (" ",wdt*2+x+2,y*8);
} else if ((wdt == width) && (rpos == width)) {
Tablo.print ("S",wdt*2+x,y*8);
} else if (wdt == center) {
Tablo.print ("0",wdt*2+x,y*8); // по центру
} else {
if (pos > 0) {
if (wdt < center) {
Tablo.print ("J",wdt*2+x,y*8);// пустота слева от центра
} else if ((wdt > center) && (wdt <= rpos)) {
Tablo.print ("0",wdt*2+x,y*8);// заполнение справа от центра
} else if (wdt > rpos) {
Tablo.print ("J",wdt*2+x,y*8);// пустота справа от центра
};
} else if (pos < 0) {
if (wdt > center) {
Tablo.print ("J",wdt*2+x,y*8);
} else if ((wdt < center) && (wdt >= rpos)) {
Tablo.print ("0",wdt*2+x,y*8);// заполнение слева от центра
} else if (wdt < rpos) {
Tablo.print ("J",wdt*2+x,y*8);
};
} else Tablo.print ("J",wdt*2+x,y*8);
}
}
}
void main_screen(void){ //****************** Главный экран *******************************
encClick=0;
Tablo.clrScr();
MSG((char*)text_manual,1,0);
MSG((char*)text_files,1,1);
MSG((char*)text_unlock,1,2);
MSG((char*)text_setup,1,3);
MSG((char*)text_reset,1,4);
MSG((char*)text_exit,1,5);
//delay(100);
}
void main_menu(void){ //****************** Главное меню ********************************
Serial.flush();
delay(MENU_DELAY);
MENU_KEY = false;
main_screen();
pp_menu = 0;//------------------
lastReportedPos = encoder0Pos = 0;
str_print(pp_menu, 2);
do {
read_keys();
if (UP_KEY) {
if (pp_menu > 0) {
pp_menu--;
} else {
pp_menu = 5;
}
str_print(pp_menu, 2);
};
if (DOWN_KEY) {
if (pp_menu < 5) {
pp_menu++;
} else {
pp_menu = 0;
}
str_print(pp_menu, 2);
};
if (OK_KEY) {
if (pp_menu == 0) {
Tablo.clrScr();
manual_menu();
}
main_screen();
str_print(pp_menu, 2);
if (pp_menu == 1) files_menu();
if (pp_menu == 2) {
current_line = 0;
printSerialString((char*)cmd_unlock);
break;
}
if (pp_menu == 3) {
setup_menu();
}
if (pp_menu == 4) {
current_line = 0;
Tablo.clrScr();
Tablo.print("RESET", CENTER, 16);
digitalWrite(GRBL_RES_PIN, HIGH);
delay(200);
digitalWrite(GRBL_RES_PIN, LOW);
break;
}
if (pp_menu == 5) {
//main_screen();
Serial.flush();
break;
}
};
delay(MENU_DELAY);
} while (!MENU_KEY);
MENU_KEY = false;
current_line = 0;
};
void setup_screen(void) { //***************** Экран настроек *******************************
Tablo.clrScr();
MSG((char*)text_feedmax,0,0);
Tablo.printNumI((EEPROM.readInt(EEPROM_FEED)),60,0);
MSG((char*)text_autostart,0,1);
Tablo.printNumI((EEPROM.read(EEPROM_START)),72,8);
MSG((char*)text_pauseerr,0,2);
Tablo.printNumI((EEPROM.read(EEPROM_PAUSE)),72,16);
MSG((char*)text_autounlk,0,3);
Tablo.printNumI((EEPROM.read(EEPROM_UNLOCK)),72,24);
MSG((char*)text_exit,0,4);
}
void setup_param(int8_t param) { //*************** Изменение настроек *****************************
unsigned int temp, min, max = 0;
if (param == 0) {
temp = EEPROM.readInt(EEPROM_FEED);
min = 0; max = FEED_MAX;
} else if (param == 1) {
temp = EEPROM.read(EEPROM_START);
min = 0; max = 1;
} else if (param == 2) {
temp = EEPROM.read(EEPROM_PAUSE);
min = 0; max = 1;
} else if (param == 3) {
temp = EEPROM.read(EEPROM_UNLOCK);
min = 0; max = 1;
}
do {
Tablo.invertText(true);
if (param == 0) { Tablo.printNumI(temp,60,0);}
else if (param == 1) { Tablo.printNumI(temp,72,8);}
else if (param == 2) { Tablo.printNumI(temp,72,16);}
else if (param == 3) { Tablo.printNumI(temp,72,24);}
Tablo.invertText(false);
if (param == 0) {
if (encoder0Pos > 4)encoder0Pos = 4;
if (encoder0Pos < -4)encoder0Pos = -4;
if ((encoder0Pos > 1) || (encoder0Pos < 1)) {
temp += encoder0Pos * 5;
} else {
temp += encoder0Pos;
}
} else if (param == 1) {
if (encoder0Pos > 1)encoder0Pos = 1;
if (encoder0Pos < 0)encoder0Pos = 0;
temp = encoder0Pos;
} else if (param == 2) {
if (encoder0Pos > 1)encoder0Pos = 1;
if (encoder0Pos < 0)encoder0Pos = 0;
temp = encoder0Pos;
} else if (param == 3) {
if (encoder0Pos > 1)encoder0Pos = 1;
if (encoder0Pos < 0)encoder0Pos = 0;
temp = encoder0Pos;
}
delay(MENU_DELAY * 2);
encRead(); if (encClick) break;
} while (true);
if (param == 0) {
EEPROM.updateInt(EEPROM_FEED, temp);
} else if (param == 1) {
EEPROM.update(EEPROM_START, (byte)temp);
} else if (param == 2) {
EEPROM.update(EEPROM_PAUSE, (byte)temp);
} else if (param == 3) {
EEPROM.update(EEPROM_UNLOCK, (byte)temp);
}
}
void setup_menu(void) { //************ Меню изменения настроек ***************************
Serial.flush();
setup_screen();
pp_menu = 0;
lastReportedPos = encoder0Pos = 0;
str_print(pp_menu, 1);
do {
read_keys();
if (UP_KEY) {
if (pp_menu > 0) {
pp_menu--;
} else {
pp_menu = 4;
}
str_print(pp_menu, 1);
};
if (DOWN_KEY) {
if (pp_menu < 4) {
pp_menu++;
} else {
pp_menu = 0;
}
str_print(pp_menu, 1);
};
if (OK_KEY) {
if (pp_menu == 0) setup_param(0);
if (pp_menu == 1) setup_param(1);
if (pp_menu == 2) setup_param(2);
if (pp_menu == 3) setup_param(3);
if (pp_menu == 4) {
break;
}
setup_screen();
str_print(pp_menu, 1);
};
delay(MENU_DELAY);
} while (true);
main_screen();
pp_menu = 0;
str_print(pp_menu, 2);
}
void manual_screen() { //********* Вывод Меню ручного управления ************************
Tablo.clrScr();
MSG((char*)pgm_read_word(&(axis_label[0])),0,0);
gauge(14, 0, 31, 0, 1);
MSG((char*)pgm_read_word(&(axis_label[1])),0,1);
gauge(14, 1, 31, 0, 1);
MSG((char*)pgm_read_word(&(axis_label[2])),0,2);
gauge(14, 2, 31, 0, 1);
MSG((char*)text_home, LEFT,3);
MSG((char*)text_reset, LEFT,4);
MSG((char*)text_exit, LEFT,5);
}
void go_home(void){ //**************Команда HOME GRBL*********************************
printSerialString((char*)cmd_absolute);
Serial.write(0x0A);
printSerialString((char*)cmd_upz);
Serial.write(0x0A);
printSerialString((char*)cmd_zeroxy);
Serial.write(0x0A);
}
void move_menu(char axis) { //*************** Меню слайдеров *********************************
printSerialString((char*)cmd_incremental);
Serial.write(0x0A);
do {
Tablo.clrScr();
MSG((char*)pgm_read_word(&(axis_label[axis])),30,0); // Название оси
if (encoder0Pos > 20)encoder0Pos = 20;
if (encoder0Pos < -20)encoder0Pos = -20;
if (lastReportedPos > 20)lastReportedPos = 20;
if (lastReportedPos < -20)lastReportedPos = -20;
gauge(8, 1, 31, lastReportedPos, 1);//****************************
Tablo.printNumI(abs(lastReportedPos),40,16);// Вывод позиции
MSG((char*)text_stepsize, 8,4);
if (lastReportedPos != 0) {
printSerialString((char*)cmd_linear);
printSerialString((char*)pgm_read_word(&(axis_label[axis])));
}
if (lastReportedPos < 0) {
Tablo.print ("-",32,16);
if (lastReportedPos != 0) Serial.write(0x2D);
}
if (lastReportedPos != 0) {
char pos = abs(lastReportedPos);
printSerialString((char*)pgm_read_word(&(acc_table[pos])));
Serial.write(0x0A);
MSG((char*)pgm_read_word(&(acc_table[pos])), 17,5);//Вывод шага и скорости
}
if (lastReportedPos != 0) {
while (true) {
if (Serial.available()) break;
encRead(); if (encClick) break;
}
if (Serial.available()) {
memset(buff, 0, sizeof(buff));
readcnt = Serial.readBytesUntil(0x0A, buff, sizeof(buff));
if (readcnt > 0) {
for (int8_t pe = 0; pe < sizeof(buff); pe++) {
if ((buff[pe] == 0x0D) || (buff[pe] == 0x0A)) {
buff[pe] = 0x00;
break;
}
}
encRead(); if (encClick) break;
if (strncmp(buff, "error", 5) == 0) {
//Tablo.print((buff), LEFT,16);
}
}
}
}
encRead(); if (encClick) break;
} while (true);
encClick = false;
encoder0Pos = lastReportedPos = 0;
delay(MENU_DELAY);
}
void manual_menu(void) { //*********** Меню ручного управления ****************************
Serial.flush();
OK_KEY=0;
delay(MENU_DELAY);
manual_screen();
pp_menu = 0;
lastReportedPos = encoder0Pos = 0;
str_print(pp_menu, 1);
do {
read_keys();
if (UP_KEY) {
if (pp_menu > 0) {
pp_menu--;
} else {
pp_menu = 5;
}
str_print(pp_menu, 1);
};
if (DOWN_KEY) {
if (pp_menu < 5) {
pp_menu++;
} else {
pp_menu = 0;
}
str_print(pp_menu, 1);
};
if (OK_KEY) {
delay(MENU_DELAY);
OK_KEY=0;
lastReportedPos = encoder0Pos = 0;
if (pp_menu == 0) {
move_menu(0);
//delay(MENU_DELAY);
}
if (pp_menu == 1) {
move_menu(1);
//delay(MENU_DELAY);
}
if (pp_menu == 2) {
move_menu(2);
//delay(MENU_DELAY);
}
if (pp_menu == 3) {
go_home();
//delay(MENU_DELAY);
}
if (pp_menu == 4) {
printSerialString((char*)cmd_reset);
Serial.write(0x0A);
//delay(MENU_DELAY);
}
if (pp_menu == 5) break;
manual_screen();
str_print(pp_menu, 1);
};
delay(MENU_DELAY);
} while (true);
main_screen();
pp_menu = 0;
str_print(pp_menu, 2);
}
void exec_screen(void) { //************** Экран выполнения ********************************
MSG((char*)empty_line, 0,4);
//Tablo.printNumI(counter_line,30,40); //***************** Всего строк **********************************
}
void buttons_screen(void) { //*********** Клавиши управления GRBL ****************************
if (pp_menu != ppold) {
MSG((char*)empty_line, 0,1); //*********** Стирание названия предыдущего режима
MSG((char*)empty_line, 0,2);
ppold=pp_menu;
}
/*play button*/
if (pp_menu == 0) {
MSG((char*)text_start, 20,1);
ppold=pp_menu;
}
/*step button*/
if (pp_menu == 1) {
MSG((char*)text_step, 20,1);
ppold=pp_menu;
}
/*pause button*/
if (pp_menu == 2) {
MSG((char*)text_pause, 20,1);
ppold=pp_menu;
}
/*stop button*/
if (pp_menu == 3) {
MSG((char*)text_exit, 20,1);
ppold=pp_menu;
}
}
void process_keys(void) { //*********** Управление клавишами GRBL **************************
read_keys();
if ((exec_mode == EXEC_PLAY) && (OK_KEY == true)) {
exec_mode = EXEC_PAUSE;
}
if ((exec_mode == EXEC_PAUSE) || (exec_mode == EXEC_STEP)) {
skip_page = 0;
OK_KEY = false;
do {
read_keys();
if (UP_KEY) {
if (pp_menu > 0) {
pp_menu--;
} else {
pp_menu = 3;
}
};
if (DOWN_KEY) {
if (pp_menu < 3) {
pp_menu++;
} else {
pp_menu = 0;
}
};
if (OK_KEY) {
OK_KEY = encClick = false;
break;
}
buttons_screen();
delay(MENU_DELAY);
skip_page++;
if (skip_page > 3)skip_page = 0;
} while (true);
if (pp_menu == 0) {
exec_mode = EXEC_PLAY;
}
if (pp_menu == 1) {
exec_mode = EXEC_STEP;
}
if (pp_menu == 2) exec_mode = EXEC_PAUSE;
if (pp_menu == 3) {
exec_mode = EXEC_EXIT;
}
delay(MENU_DELAY);
OK_KEY = encClick = false;
buttons_screen();
}
update_pos();
}
void update_pos(void) {
//Tablo.printNumI((feed_dig), 50,40);
//Tablo.printNumI((exec_mode), 70,0);
}
void execute_file(String &fname) { //************ Выполнение программы *******************************
current_line = skip = skip_page = 0;
int8_t pos_start = 0;
int8_t pos_end = 0;
char feed[10];
char temp[40];
feed_dig = feed_safe;
if (EEPROM.read(EEPROM_START) == 1) {
exec_mode = EXEC_PLAY;
} else if (EEPROM.read(EEPROM_START) == 0) {
exec_mode = EXEC_PAUSE;
}
Serial.flush();
pp_menu = 0;
exec_screen();
buttons_screen();
process_keys();
File text = SD.open(fname, O_READ);
if (text) {
while (text.available()) {
process_keys();
if (exec_mode == EXEC_EXIT) {
text.close();
exit;
}
current_line++;
Tablo.printNumI(current_line, 30,40); // Вывод номера текущей строки при выполнении
memset(buff, 0, sizeof(buff));
readcnt = text.readBytesUntil(0x0A, buff, sizeof(buff));
if (readcnt > 0) {
buff[readcnt] = 0;
pos_start = 0;
for (int8_t pe = 0; pe < sizeof(buff); pe++) {
if ((buff[pe] == 0x46)) {
pos_start = pe;
break;
}
}
if (pos_start > 0) {
for (int8_t pe = pos_start + 1; pe < sizeof(buff); pe++) {
if ((buff[pe] > 0x39) || (buff[pe] == 0)) {
pos_end = pe;
break;
}
}
strncpy(feed, buff + pos_start + 1, pos_end - pos_start);
feed_dig = strtol(feed, 0, 0);
if (feed_dig > feed_safe) feed_dig = feed_safe;
ltoa(feed_dig, feed, 10);
for (int8_t pe = 0; pe < 10; pe++) {
if (feed[pe] == 0) {
pos_end = pe - 1;
break;
}
}
strncpy(buff + pos_start + 1, feed, pos_end);
}
for (int8_t pe = 0; pe < sizeof(buff); pe++) {
if (buff[pe] == 0x0D) {
buff[pe] = 0x0A;
buff[pe + 1] = 0x00;
break;
}
if (buff[pe] == 0x0A) {
buff[pe + 1] = 0x00;
break;
}
}
Serial.print(buff);
Serial.flush();
memset(temp, 0, sizeof(temp));
strncpy(temp, buff, sizeof(temp));
for (int8_t pe = 0; pe < sizeof(temp); pe++) {
if ((temp[pe] == 0x0D) || (temp[pe] == 0x0A)) {
temp[pe] = 0x00;
break;
}
}
if (exec_mode == EXEC_STEP) { //********** Пошаговый режим *****************
Tablo.print(" ", 0,16); // Стираем хвост
Tablo.print((buff), 0,16); // Вывод G кода текущей строки
Tablo.printNumI(current_line,30,40); // Выводим номер текущей строки
skip++;
}
Serial.flush();
}
while (Serial.available() == 0) {
encRead(); if ((encClick) && (exec_mode == EXEC_PLAY)) {
pp_menu = 2;
exec_mode = EXEC_PAUSE;
process_keys();
}
if (exec_mode == EXEC_EXIT) break;
}
while (Serial.available() > 0) {
memset(buff, 0, sizeof(buff));
readcnt = Serial.readBytesUntil(0x0A, buff, sizeof(buff));
if (readcnt > 0) {
buff[readcnt] = 0;
if (strncmp(buff, "error", 5) == 0) {
delay(10);
Serial.flush();
//Tablo.printNumI((temp), 50,24);
Tablo.print((buff), 0,32);
memset(temp, 0, sizeof(temp));
if (EEPROM.read(EEPROM_PAUSE) == 1) exec_mode = EXEC_PAUSE;
skip++;
}
if ((strncmp(buff, "ok", 2) == 0)) {
delay(10);
Serial.flush();
}
}
encRead();
if ((encClick) && (exec_mode == EXEC_PLAY)) {
pp_menu = 2;
exec_mode = EXEC_PAUSE;
OK_KEY = encClick = false;
process_keys();
}
if (exec_mode == EXEC_EXIT) break;
}
exec_screen();
if (skip > (MAX_DISPLAY_LINES - 5))skip = 0;
}
}
text.close();
}
boolean init_card(void) { //************** Инициализация CD *******************************
if (!SD.begin(__SDCS) && Init_sd == false) {
MSG((char*)init_error,22,8);
digitalWrite(__SDCS, LOW);
delay(MENU_DELAY * 4);
digitalWrite(__SDCS, HIGH);
return false;
}
root = SD.open("/");
if (!root) {
MSG((char*)init_error,22,8);
delay(MENU_DELAY * 4);
return false;
}
Init_sd = true;
root.rewindDirectory();
return true;
}
void printDirectory(File dir, String &file, bool getfile) {
while (filecount < MAX_DISPLAY_FILES) {
File entry = dir.openNextFile(O_READ);
if (!entry) {
entry.close();
break;
}
if (entry.isDirectory()) {
printDirectory(entry, file, getfile);
} else {
if ((getfile) && (skip == 0)) {
file = entry.name();
break;
}
if (skip == 0) {
filecount++;
Tablo.print((entry.name()), 9,(filecount-1)*8);// ****** Вывод имени файла ******
};
if (skip > 0) skip--;
}
entry.close();
}
}
void list(void) {
skip = skip_page * MAX_DISPLAY_FILES;
Tablo.clrScr();//??????????????????????????????????????????????
filecount = 0;
root.rewindDirectory();
printDirectory(root, fname, false);
if (filecount == MAX_DISPLAY_FILES) {
MSG((char*)text_next,20,(filecount));
} else {
Tablo.invertText(true);
MSG((char*)text_exit,20,(filecount));
Tablo.invertText(false);
}
pp_menu = 0;
str_print(pp_menu, 1);
}
void files_menu(void) {
//Tablo.clrScr();//??????????????????????????????????????????????
skip_page = skip = 0;
if (init_card()== true && Init_sd == false) {
list();
}
if (Init_sd == true){
list();
} else
{
MENU_KEY = true;
}
do {
read_keys();
if (UP_KEY) {
if (pp_menu > 0) {
pp_menu--;
} else {
pp_menu = filecount;
}
str_print(pp_menu, 1);
};
if (DOWN_KEY) {
if (pp_menu < filecount) {
pp_menu++;
} else {
pp_menu = 0;
}
str_print(pp_menu, 1);
};
if (OK_KEY) {
if (pp_menu < filecount) {
root.rewindDirectory();
skip = (skip_page * MAX_DISPLAY_FILES) + pp_menu;
filecount = 0;
fname = "";
printDirectory(root, fname, true);
// ********************************************************************************
File text = SD.open(fname, O_READ);
Tablo.clrScr();
Tablo.print (fname,20, 24);//
Tablo.print ("Loading",20, 32);
MSG((char*)text_line, 0,5);
//Tablo.printNumI(counter_line,0,40);
//******************************************************************************************************
// ПОДСЧЕТ СТРОК
/* counter_line = 0; //обнуляем счетчик
while (text.available()) { //читаем все символы из файла до конца
char sd_t = text.read();
if (sd_t == '\n') {//и увеличиваем счетчик, если символ - перенос
counter_line++;
if (counter_line%100==0)Tablo.printNumI(counter_line,30,40);// Вывод к-ва строк/100 при загрузке
}
}
*/
text.close(); //закрываем файл
// ********************************************************************************
execute_file(fname);
// MSG((char*)text_line, 0,3);
//Tablo.printNumI(counter_line,30,32);
//Tablo.print (fname,20, 24);
//delay(1000);Tablo.clrScr();
go_home();
//MSG((char*)text_exit,30,4);
do {
encRead();
Tablo.clrScr();
MSG((char*)text_done,30,4); // **************** Конец файла *************************
} while (!encClick); // **************** Ждем кнопки *************************
pp_menu = 1;
break;
}
if ((filecount == MAX_DISPLAY_FILES) && (pp_menu == filecount)) {
skip_page++;
} else {
break;
}
list();
};
delay(MENU_DELAY);
} while (!MENU_KEY);
filecount = skip_page = skip = 0;
main_screen();
pp_menu = 1;
str_print(pp_menu, 2);
};
void rotEncoder() {
rotating = true;
}
//*******************************************************************************
void setup() {
Serial.begin(115200);
Serial.setTimeout(1);
Tablo.InitLCD();
Tablo.setFont(SmallFont);
Tablo.setContrast(70);
Tablo.clrScr();
Tablo.print("START PROGRAMM", CENTER, 16);
while (!Serial) {
}
EEPROM.setMaxAllowedWrites(2048);
pinMode(__SDCS, OUTPUT);
digitalWrite(__SDCS, HIGH);
//pinMode(__LED, OUTPUT);
//digitalWrite(__LED, HIGH);
//display.setCursor(0, 0);
pinMode(encoder0PinA, INPUT_PULLUP);
pinMode(encoder0PinB, INPUT_PULLUP);
pinMode(encoder0PinC, INPUT_PULLUP);
attachInterrupt(0, doEncoderA, FALLING ); // прерывание при смене с HIGH на LOW pin 2
attachInterrupt(1, doEncoderB, FALLING ); // прерывание при смене с HIGH на LOW pin 3
lastReportedPos = encoder0Pos = 0;
pinMode(GRBL_RES_PIN, OUTPUT);
digitalWrite(GRBL_RES_PIN, HIGH);
delay(200);
digitalWrite(GRBL_RES_PIN, LOW);
current_line = skip = 0;
feed_safe = EEPROM.readInt(EEPROM_FEED);
if (feed_safe > FEED_MAX) {
feed_safe = FEED_MAX;
EEPROM.updateInt(EEPROM_FEED, FEED_MAX);
}
}
void doEncoderA() {
if ( rotating ) delay (30);
if ( digitalRead(encoder0PinA) == LOW ) {
encoder0Pos ++;
rotating = false;
}
}
void doEncoderB() {
if ( rotating ) delay (30);
if ( digitalRead(encoder0PinB) == LOW ) {
encoder0Pos --;
rotating = false;
}
}
void encRead() {
encClick = (digitalRead(encoder0PinC) == HIGH ? false : true);
if (encoder0Pos != lastReportedPos) lastReportedPos = encoder0Pos;
}
void read_keys(void) {
if (encoder0Pos == 0) {
UP_KEY = false;
DOWN_KEY = false;
}
encRead();
OK_KEY = encClick;
if (encoder0Pos > 0) {
DOWN_KEY = true;
encoder0Pos = lastReportedPos = 0;
} else if (encoder0Pos < 0) {
UP_KEY = true;
encoder0Pos = lastReportedPos = 0;
}
}
////////////////////////////////////////////////////////////////////////////////
void loop() {
if (Serial.available()) {
memset(buff, 0, sizeof(buff));
readcnt = Serial.readBytesUntil(0x0A, buff, sizeof(buff));
if (readcnt > 0) {
buff[readcnt] = 0;
if (strncmp(buff, "ok", 2) == 0) {
}
if (strncmp(buff, "error", 5) == 0) {
}
Tablo.print((buff), LEFT,32);
current_line++;
if (current_line > MAX_DISPLAY_LINES)current_line = 0;
Serial.flush();
if ((strncmp(buff, "['$", 3) == 0) && (EEPROM.read(EEPROM_UNLOCK) == 1)) {
printSerialString((char*)cmd_unlock);
delay(10);
}
}
}
encRead();
if (encClick) {
encClick=0;
main_menu();}
}