Skocz do zawartości
sosnus

[Programowanie] Terminalowa aplikacja serwisowa do robota. Część 4 - Kodowanie CP866 i komendy VT100

Pomocna odpowiedź

Obsługę UARTu w języku C mamy już za sobą. Teraz czas dowiedzieć się czegoś o komendach VT100, dzięki którym można przemieszczać się w dowolne miejsce w obrębie naszej "terminalowej apki serwisowej" Lecz nim weźmiemy się za to, czas omówić kodowania typu CP na przykładnie CP866.

W drugiej części kursu pokazałem co zrobić, by program PuTTy odkodowywał znaki według standardu CP866. Kodowanie typu CP jest potrzebne, by nasza apka serwisowa była czytelna. Jeżeli jednak używasz bardzo małego pocka, lub gdy pozostałą część kodu (np. algorytm poruszania się robota) zajmuje zbyt dużo miejsca, (co jest rzeczą mało prawdopodobną) proponuję wtedy odpuścić sobie rysowanie ramek, ale powtarzam, że to naprawdę nie zajmuje dużo pamięci. Dla przykładu podam, że mój kod do linefollowera, który zawiera:

Obsługę ledów\przycisków;

Obsługę silników;

Obsługę 6 czujników podłączonych pod ADC;

Transmisję UART;

Funkcje, korzystające z dobrodziejstw VT100;

"Ciężkostrawne" ramki zrobione za pomocą CP866;

Tryb zdalnego sterowania robotem przez BT;

Zajmuje tylko 3,8kB pamięci Atmegi8, tak więc mam jeszcze 4,2kB wolego miejsca, na zaimplementowanie algorytmu PID 😃 , tak więc myślę, że i Tobie uda się zamieścić bez problemu wszystkie opcje jakie tylko chcesz w swoim robocie, wliczając w to rysowanie ramek. W załącznikach do tej części artykułu możecie znaleźć PDF'a, w którym w czytelny sposób pogrupowałem i podzieliłem "stronę kodową" CP866.

Zacznijmy od wyjaśnienia, co to są tak w ogóle te komendy VT100?

Są to kilkuznakowe kody ASCII, dzięki którym możemy wydawać różne komendy do programu odbierającego i wyświetlającego dane.

Przykładami takich komend mogą być:

<esc>[?25l // ukrywanie kursora w terminalu
<ESC>[2J // czyści ekran

Więcej o VT100 możecie się dowiedzieć ze źródeł podanych na końcu tego artykułu.

A teraz przechodzimy do sedna sprawy, czyli czas na prezentację "sosnusowych" bibliotek, dzięki którym z łatwością będziesz mógł używać komend VT100.

plik "kodowanieCP866+komendyVT100.h":

/*
* kodowanieCP866+komendyVT100.h
*
*  Created on: 26-07-2013
*      Author: Sosnus
*/

#ifndef KODOWANIECP866_KOMENDYVT100_H_
#define KODOWANIECP866_KOMENDYVT100_H_

// MAKRODEFINICJE KOLOROW - ulatwiaja prace z funkcja terminal_kolory()
#define FONT_BLACK	30
#define FONT_RED	31
#define FONT_GREEN	32
#define FONT_YELLOW	33
#define FONT_BLUE	34
#define FONT_MAGENTA	35
#define FONT_CYAN	36
#define FONT_WHITE	37

#define TLO_BLACK	40
#define TLO_RED		41
#define TLO_GREEN	42
#define TLO_YELLOW	43
#define TLO_BLUE	44
#define TLO_MAGENTA	45
#define TLO_CYAN	46
#define TLO_WHITE	47

extern char komenda, komenda_old; // zmienne przydatne przy do bluetooth

uint8_t ASCII_to_int(uint8_t liczba_rzedow);   	// deklaracja f-cji


void terminal_kolory(uint8_t font , uint8_t tlo);	// VT100: Ustawianie kolorów znakówi tła
void terminal_locate ( uint8_t x , uint8_t y );		// VT100: Przemieszczanie kursora do miejsca o wspolrzednych: (x,y)
void terminal_cls(void);							// VT100: Czysci ekran
void terminal_cursor_off(void);					// VT100: Ukrywa kursor


// f-cje ponizej, sa odpowiedzialne za rysowanie "pseudookna" z tablekami
void terminal_wait(void);
void terminal_intro(void);	// gdy terminal otwarty, rysuje okno i  glowna ramke
void terminal_intro_menu(void); // po nacisnieciu przycisku naklada menu
void terminal_intro_lf(void);	// po  wyborze trybu, naklada tabelki
void terminal_intro_bt(void);

#endif /* KODOWANIECP866_KOMENDYVT100_H_ */

pliku *.c nie umieściłem w znacznikach {code}{/code}, ponieważ z powodu użycia kodowania CP866, kod stał się zupełnie nieczytelny. plik ten możecie zobaczyć w poniższym linku: http://www.wklej.org/id/1134080/

Myślę że kody są zrozumiałe, ale w razie jakichkolwiek wątpliwości proszę pytać 😉

Oba pliki wklejamy do tego samego folderu, w którym siedzi już biblioteka odpowiedzialna za obsługę UARTu.

Jak widzicie, w bibliotece umieściłem takie funkcje jak:

terminal_intro_lf(), terminal_intro_bt(), itp. itd. To właśnie te funkcje odpowiadają za przygotowanie tabelek pod wyświetlanie odczytów z czujników itp. Proponuję, abyś Ty też sobie przygotował takie lub podobne funkcje, przystosowane do Twoich potrzeb. Możesz tutaj jeszcze dodać np. wyświetlanie napięcia akumulatora, odczyt z czujnika przeszkody, itp., itd.

W jaki sposób działają inne funkcje, których nazwy zaczynają się na terminal_*** dowiesz się, studiując poniższy plik main.c, a jeżeli go skompilujesz i odpalisz sam, zobaczysz efekty działania tych funkcji.

plik main.c

Tutaj też dodałęm kilka znaków,które nie tolerują znaczniki {code} więc main.c też znajduje się pod zewnętrznym linkiem: http://www.wklej.org/id/1138636/

Ten program rysuje ramki, napisy, oraz wypisuje zmienną na ekranie. Czyli robi praktycznie wszystko czego oczekujemy od Terminalowej apki serwisowej do robota typu LF. Na podstawie tego powinieneś już bez problemu stworzyć własny program do linefollowera, lecz by rozjaśnić jeszcze niektóre rzeczy, pokażę kod do mojego linefollowera w następnej, ostatniej już części kursu.

W tym miejscu muszę powiedzieć o jeszcze jednej ciekawej rzeczy. Specjalnie wszystkie funkcje które stworzyłem zaczynają się od słowa terminal. Dzięki temu, oraz dzięki funkcji uzupełniania składni w Eclipse, mamy wszystkie funkcje pod ręką (ściślej mówiąc, pod klawiszami CTRL+SPACJA 😉 ) Myślę że wszystko wyjaśni ten króciutki filmik:

Jeżeli dosyć dokładnie przeczytałeś tą część artykułu, oraz przejrzałeś kody które pokazałem, zapewne potrafisz już w praktyce używać kodowania CP866 i komend VT100. Prawdopodobnie napiszę jeszcze jedną część kursu, w której pokażę jak można wykorzystać w praktyce wiedzę, którą już zdobyliśmy.

W załącznikach do tej części znajdziecie:

  • PDF ze stroną kodową CP866;
  • "Sosnusową" bibliotekę do obsługi VT100;
  • Projekt Eclipse z kodami przedstawionymi w tym kursie.

Źródła:

Strona kodowa CP866: http://www.ascii.ca/cp866.htm

Przedstawione tutaj, oraz inne komendy VT100: http://www.termsys.demon.co.uk/vtansi.htm

I oczywiście moja inspiracja do stworzenia tej serii artykułów, czyli poradnik wideo Pana Mirosława Kardasia:

CP866 nowa wersja.pdf

biblioteka CP866 i VT100.rar

UART_ART_cz4_foto_new.thumb.png.acc1b71ced3edbded70adff4f7a557d7.png

UART_ART_cz4.zip

main.c

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wszystko fajno, ale jakoś nie widzę żeby gdziekolwiek w artykule był opisany najciekawszy fragment Twojej apki, czyli samo wyświetlanie zmiennych w odpowiednich polach tabelki. Czy może przeoczyłem?

Udostępnij ten post


Link to post
Share on other sites

Zaprezentowałem wszystkie funkcje, więc teraz każdy może to sobie dobrowolnie wykorzystywać, ALE aktualnie robię piątą część kursu, w której pokażę kod do mojego linefollowera, gdzie używam właśnie tych funkcji, i każdy zobaczy sobie w praktyce jak to wygląda.

Lecz masz rację, postaram się dodać do TEJ części kursu, inny, króciutki plik main.c, w którym pokażę przemieszczanie kursora.

Udostępnij ten post


Link to post
Share on other sites

Aktualizacja artykułu.

Zmieniłem plik main.c, dopisałem troszkę tekstu, i co najważniejsze, użyłem w praktyce funkcji terminal_locate() odpowiadającej za przemieszczanie kursora.

Jak widzicie, ta apka jest "statyczna", żadne znaki nie uciekają "do góry". Dodałem jeszcze wypisywanie zmiennej (w tym przypadku losowej 😉 ), by pokazać, jak można prezentować np. odczyty z czujników.

Dodałem jeszcze cały projekt Eclipse z nowym programem w załączniku.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...