void PGcode() { for(;;) { /* Get a character */ while(UART_getchar_present() == 0); (*p_buffer) = UART_getchar(); UART_putchar((*p_buffer)); (*(p_buffer+sizeof(char))) = 0; if((*p_buffer) == BS) p_buffer -= sizeof(char); /* Check for end of command */ if((*p_buffer) == CR) { GCODE_STATUS st; LINEFEED; st = ProcessCommand(); if(st == GCODE_DONE) break; p_buffer = &buffer[0]-(sizeof(char)); } /* Go for next char */ if(p_buffer < buffer+BUF_SIZE*sizeof(char)) p_buffer += sizeof(char); else { LINEFEED; PRINTLN("Buffer overflow"); PRINTLN("Returning to terminal"); break; } } }
int main(void) { char c; // odebrany znak UART_init(); // inicjalizacja portu szeregowego LCD_init(); // inicjalizacja wy�wietlacza LCD LCD_PL_chars_init(); // polskie znaki na wy�wietlaczu LCD KBD_init(); // inicjalizacja klawiatury LED7SEG_init(); // inicjalizacja wy�wietlacza sei(); // w��cz obs�ug� przerwa� while(1) // p�tla niesko�czona { PCF8583_get_time(&godz,&min,&sek,&ssek); LED7SEG_putU08(sek); // wy�wietlaj warto�� if (UART_rxlen()>0) // je�li odebrano znak { c=UART_getchar(); // tu mo�na wstawi� reakcje na komendy steruj�ce np. typu ESC[ LCD_putchar(c); // wy�wietl go na LCD } if (KBD_read()) // je�li naci�ni�to klawisz { if ((KBD_ascii>='A')&&(KBD_ascii<='D')) UART_putstr_P(CURSOR); // sterowanie kursorem UART_putchar(KBD_ascii); // wy�lij go na port szeregowy KBD_wait(); // czekaj na zwolnienie klawisza } } }
/* * Terminal loop application. */ void terminal() { char c = 48; for(;;) { LINEFEED; UART_putchar('>'); while(UART_getchar_present() == 0); c = UART_getchar(); switch(c) { case 'w': PRINTLN("Moving UP"); MoveY(-MOVE_DIST); break; case 's': PRINTLN("Moving DOWN"); MoveY(MOVE_DIST); break; case 'a': PRINTLN("Moving LEFT"); MoveX(-MOVE_DIST); break; case 'd': PRINTLN("Moving RIGHT"); MoveX(MOVE_DIST); break; case 'h': PRINTLN("Going Home..."); MoveHome(); break; case 'z': PRINTLN("Zeroed at current position."); MoveSetZero(); break; case 'g': PRINTLN("Entering Pseudo G-Code mode."); PGcode(); break; case 'o': PRINTLN("Draw a circle?"); DrawCircle(50); break; case ' ': PRINTLN("Pen action"); penp = 100 - penp; PWM_setPosition(penp); break; } } }
void UART_getstr (char *s) { uint8_t i=0; uint8_t ch=0; do { WDR(); // restart licznika Watchdoga ch=UART_getchar(); // pobieraj znak s[i]=ch; // wstaw go do ³añcucha i inkrementuj i++; // inkrementuj iloœæ znaków odebranych } while ((ch != 10) && (ch != 13) && (i <= UART_MAX_GETSTR)); // dopóki nie napotka znaków koñca linii lub nie przekroczy d³ugoœci MAX_GETSTR s[i-1]=0; // wstaw 0 na koniec ³añcucha }
char MNP_get_message(void) { if (UART_rx_buffer_overflow) // было переаолнение буфера { // все сбрасываем, и возвращаем ошибку MNP_message_reset(); UART_rx_overflow_reset(); return ERR_RX_OVERFLOW; } char data; if (UART_rx_buffer_empty ) return 0;//буфер пустой data=UART_getchar(); switch (MNP_message_mode) { case MNP_WAIT_START:// ждем начала сообщения // получено начало сообщения, if (data=='$') { MNP_message_mode=MNP_GET_DATA; // начинаем принимать данные // debug_counter++; MNP_CRC=0;// все сбрасываем MNP_message_length=0; MNP_message_counter=0; } else return ERR_MNP_START_EXPECTED; break; case MNP_GET_DATA: // тут получаем полезные данные // проверяем на отсутствие служебных символов if (data=='$') // символ начала нового сообщения { MNP_message_reset (); return ERR_MNP_START_UNEXPECTED; } if (data==0x0A) // символ перевода строки { MNP_message_reset (); return ERR_MNP_LF_UNEXPECTED; } if (data==0x0D) // символ возврата каретки { MNP_message_reset (); return ERR_MNP_CR_UNEXPECTED; } if (data=='*') // конец принимаемым данным { MNP_message_mode=MNP_GET_CRC_H; // переключаемся на прием CRC return 0; } if (MNP_message_counter>MNP_MESSAGE_BUFFER_SIZE) // если буфер заполнен { MNP_message_reset (); return ERR_MNP_MESSAGE_OVERFLOW; // если буфер сообщения переполнился } MNP_message_buffer[MNP_message_counter++]=data; //байт в буфер MNP_CRC^=data; // считаем CRC break; case MNP_GET_CRC_H: // здесь приимает старший символ CRC // и переводим символ в число if ((data >= '0') && (data <= '9')) rx_CRC=(data-'0')<<4; else if ((data >= 'A') && (data <= 'F')) rx_CRC=(data-'A'+10)<<4; else { MNP_message_reset (); return ERR_MNP_UNEXPECTED_CRC_CHAR; } MNP_message_mode=MNP_GET_CRC_L; break; case MNP_GET_CRC_L: // здесь приимает младший символ CRC if ((data >= '0') && (data <= '9')) rx_CRC+=(data-'0'); else if ((data >= 'A') && (data <= 'F')) rx_CRC+=(data-'A'+10); else { MNP_message_reset (); return ERR_MNP_UNEXPECTED_CRC_CHAR; } MNP_CRC^=rx_CRC;// считаем CRC if (!(MNP_CRC==0) ) //если не сошелся то ошибку возвращаем { MNP_message_reset (); return ERR_MNP_CRC_ERROR; } MNP_message_mode=MNP_GET_CR; break; case MNP_GET_CR: //должен быть символ возврата каретки if (data==0x0A) MNP_message_mode=MNP_GET_LF;// символ возврата кареткии else return ERR_MNP_CR_EXPECTED; break; case MNP_GET_LF: // и в конце должен быть символ перевода строки if (data==0x0D) MNP_message_mode=MNP_WAIT_START;// символ перевода строки else return ERR_MNP_LF_EXPECTED; return MNP_message_parser(); break; } return 0; }