23.11.2008
Obsah
X38PRS
• Cvičení č.2
1. Úvod do předmětu, analogové a digitální palubní informační systémy a jejich hierarchické struktury
– Založení vašeho vlastního projektu – Ladění programu v prostředí MS Visual Studio .NET 2003 NET 2003
• Obsah přednášky – Základní principy psaní zobrazovací aplikace pro displejový přístroj. – Ukázková prezentace domácí úlohy
Jak na realizaci domácí úlohy
X38PRS – Úvod – Pavel Pačes
Palubní systémy ‐ Úvod
Analogové přístroje
Související předměty – – – – –
2
Přístrojové systémy letadel, přednášející: doc. Draxler Sběrnicové systémy letadel, přednášející: doc. Kocourek Elektronické systémy, přednášející: dr. Fisher Konstrukce a pohon letadel, přednášející: doc. Slavík Programování avionických systémů: dr. Fisher, doc Vedral
• Převod měřené veličiny do formátu, ke kterému se došlo postupným vývojem: – Mechanický převod – Variometr – Elektromechanický převod – ýp Přístroj zobrazení teploty j p y výstupních plynů – Nevýhody mechanických přístrojů? • Náročnost výroby • Špatná reprodukovatelnost Zdroj: Westach
• Evoluce přístrojového vybavení →
X38PRS – Úvod – Pavel Pačes
3
Palubní systémy – ?
X38PRS – Úvod – Pavel Pačes
4
Mechanické přístroje • Mechanické převody
X38PRS – Úvod – Pavel Pačes
Zdroj: ??
5
X38PRS – Úvod – Pavel Pačes
Zdroj: wikipedia
6
1
23.11.2008
Palubní systémy – L410 TCAS
- Exrukze na simulátor.
X38PRS – Úvod – Pavel Pačes
Palubní systémy – A320
Zdroj: www.let.cz
7
Kde je budoucnost? Glass cockpit – definice, EFIS, PFD, ND, EICAS (ECAM), ND, PFD
X38PRS – Úvod – Pavel Pačes
Digitální přístroje ‐ propojení
Zdroj: jetphotos.net
8
Příklad – převodník S/R
Kombinace: Senzor → zobrazovací prvek • Bod‐Bod: analogové přenosy, proprietální protokoly, RS232, KLN94 • Vysílač‐několik přijímačů: ARINC429, ADC Shadin2000 • Sběrnice: ADFX
X38PRS – Úvod – Pavel Pačes
9
X38PRS – Úvod – Pavel Pačes
Sběrnicí propojený systém
10
Digitální přístroje
• Tři základní zdroje informace (viz. glass cockpit) • Redundantní spojení
• Většinou poskládané z modulů • Snadná reprodukovatelnost • Možnost automatického testování • Nevýhody ? • • •
X38PRS – Úvod – Pavel Pačes
11
Problematická certifikace → Špatná dostupnost kvalifikovaných součástek → (náročné testování, statistika) V případě, že na certifikaci dosáhnete, tak se může stát, že se požadované součástky přestanou vyrábět (8086, …, AMD29050, … , Tesla (meče?))
X38PRS – Úvod – Pavel Pačes
12
2
23.11.2008
Další přednášky • • • •
Motto
Požadavky na přístroje: VFR, IFR, normy Testování SW Testování HW …
Všechno je v základu jednoduchý problém.
↔
• Domácí úloha – softwarové vybavení
X38PRS – Úvod – Pavel Pačes
13
X38PRS – Úvod – Pavel Pačes
Počítačový systém
14
Počítačový systém • Připojení zobrazovacího panelu
CPU • Data
Paměť • Propustnost p
Datové sběrnice • Instrukce programu • Data z periferií • Grafika na zobrazovači
Zdroj: www.transintl.com
X38PRS – Úvod – Pavel Pačes
15
X38PRS – Úvod – Pavel Pačes
Grafický HW
Definice: Framebuffer • Zobrazovací zařízení, které přenáší zobrazovanou informaci z „bufferu“ • Obsahuje číselné informace pro každý zobrazovací bod – pixel • Různé režimy zakódování barev pixelů
• Uspořádání periférií
– – – – – –
• Paměť → framebuffer X38PRS – Úvod – Pavel Pačes
16
17
jednobitově (monochromatický režim), čtyřbitově s paletou, osmibitově s barevnou paletou, 16‐bitově (highcolor) a 24‐bitově (truecolor) Alfa kanál
X38PRS – Úvod – Pavel Pačes
18
3
23.11.2008
Framebuffer #2
Paleta
velikost paměti potřebné pro práci framebufferu je závislá na: • barevné hloubce, • velikosti palety a velikosti palety a • rozlišení výstupního signálu Problémy s přechodem mezi jednotlivými systémy
•
•
Soubor ukazatelů na barevné nastavení pixelu
R(0xFF) G(0xFF) B(0xFF) = (0x00FFFFFF) R(0xFF) G(0xFF) B(0xFE) = (0x00FFFFFE)
Ztrátové kódování barev ? BMP – Projekt pohyblivá mapa 255 (0xFF)
R(0x00) G(0x01) B(0x00) = (0x00000100) R(0x00) G(0x00) B(0xFF) = (0x000000FF)
0 (0x00) R(0x00) G(0x00) B(0x01) = (0x00000001)
0 (0x00)
R(0x00) G(0x00) B(0x00) = (0x00000000) X38PRS – Úvod – Pavel Pačes
19
Optimalizace datové propustnosti • Části palety je možné přehrávat „za běhu“ systému • Použití palety umožňuje zrychlení zápisu informací Je možné zapsat i číst 4 byty v informací. Je možné zapsat i číst 4 byty v jednou operací.
X38PRS – Úvod – Pavel Pačes
20
Virtual LCD – Inicializace palety void load_pallette( void ) { VirtScr_PalleteInit( 256 ); for( iCnt = 0; iCnt < 256; iCnt++) { ulCol = lcd_color_map[iCnt]; lArr[iCnt] = RGB( ((ulCol>>8)&0x0F)<<4, ((ulCol>>4)&0x0F)<<4, ((ulCol>>0)&0x0F)<<4 ); } VirtScr_PalleteSet( 0 , 256, lArr ); } // END void load_pallette( void )
→ Paleta je ve virtuálním LCD připravena. Používejte barvy v rozsahu 0 – 255. X38PRS – Úvod – Pavel Pačes
21
X38PRS – Úvod – Pavel Pačes
SW a HW
Architektura SW
• Low level API • Grafická knihovna • Uživatelský program
X38PRS – Úvod – Pavel Pačes
22
• Alternativy k virtuálnímu LCD
23
X38PRS – Úvod – Pavel Pačes
24
4
23.11.2008
Architektura SW #2 Reálný systém? Top level aplikace • Projekt Vašeho přístroje • Základní grafická knihovna
Gauge
GR lib./Obecná knihovna
(prvky jako bod, čára, … )
• HW vrstva počítače HW Layer/OS
(Ovládání periferií, …)
X38PRS – Úvod – Pavel Pačes
25
X38PRS – Úvod – Pavel Pačes
Architektura SW #3 • Top level aplikace • Projekt Vašeho přístroje
Software
VirtualLCD
(top‐level aplikace Vašeho projektu)
Každá SW někde začíná a někde končí. Skládá se tedy z: • Inicializace (úvod), • Hlavní prováděcí části (stať) a l í ádě í čá i ( ť) • Ukončení činnosti (uvolnění zdrojů – závěr)
Gauge
• Základní grafická knihovna Základní grafická knihovna (prvky jako bod, čára, … , další věci si musíte dopsat)
GR lib.
• Simulace HW počítače (časově řízené překreslování na obrazovku) Čtvereček = projekt, některé části si musíte upravit (Gauge, GRLib), přehled funkce, interface, … X38PRS – Úvod – Pavel Pačes
VirtualSCR/HW layer
• Tyto části najdete všude Funkce windows ‐ GDI 27
Virtual LCD ‐ API
– Program pro uP, pro OS MS Windows, Linux X38PRS – Úvod – Pavel Pačes
void GaugeMain( void ) { static int iState = 1; static int iErrorCode = 0;
• void GaugeMain( void ) • void GaugeClose( void ) • void GaugeTimer1ms( void ) Projekt přístroje je nezávislá entita – Projekt přístroje je nezávislá entita ale pro umožnění změny IP ale pro umožnění změny IP poskytuje: • void ConnectionDetails( char * btAddress, int iSendPort, int iRecvPort ) • Druhé cvičení: Každý projekt a jeho funkce potřebují unikátní jména. Jinak je nepůjde složit! Pravděpodobně to bude něco jako GaugeMain[číslo skupiny][rok – dvě písmena]
X38PRS – Úvod – Pavel Pačes
26
29
28
Inicializace: Statické proměnné
switch( iState ) // State machine Stavový automat - přechody { // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ default: case 0: // State machine Error ‐ v případě chyby neděláme nic break; // END case 0: break; // N case 0: // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ case 1: // State machine init (úvod) { // proměnné použité v této části } break; // END case 1: // State machine init (úvod) // ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ case 2: // State machine process (stať) { // } break; // END case 2: // State machine process (stať) } // END switch( iState ) } // END void GaugeMain( void ) X38PRS – Úvod – Pavel Pačes
30
5
23.11.2008
// ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ case 1: // State machine init (úvod) { // proměnné použité v této části char btAddress[4]; // komunikacni adresa load_pallette(); // system pallette init // Socket connection btAddress[0] = 127; btAddress[1] = 0; btAddress[2] = 0; btAddress[3] = 1;
Inicializace: Stavový automat
// ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ case 2: // State machine process (stať) { // blok příjmu dat z UDP soketu { // použité proměnné int iLength = 100; int iRetVal = 0; unsigned char btArray[100]; unsigned char chArray[40];
iRetVal = IO_Eth_Receive( chArray, &iLength ); if( iRetVal > 0 ) if( iRetVal 0 ) { // neco jsme prijali chArray[2] = 0; sprintf( btArray, "Value: %s", chArray ); log_insert_int( &mainlog, btArray, 0, 205); // Send IO_Eth_Send( chArray, iRetVal ); }
if( IO_Eth_Connect( glb_oConnection.btAddress, glb_oConnection.iSendPort, glb_oConnection.iRecvPort ) < 0 )
{
// v pripade chyby ulzime, ze k chybe doslo iErrorCode = 1; // a prejdeme do stavu chyba ( 0 ) iState = 0;
} else { // v pripade, ze vse probehlo v poradku, prejdem do stavu // process (stať) iState = 2; }
31
X38PRS – Úvod – Pavel Pačes
Cíl domácí úlohy • BYTE
(definovaná velikost, definovaný tvar, definované zobrazení a barvy, definované chování, …, vše je definované)
DATA[0] = BYTE
• SHORT
• Odeslat žádost o data a data přijmout (k (komunikační kanál je funkční, je definován přenosový formát, …, stačí ik č í k ál j f kč í j d fi á ř ýf át t čí dosadit)
• Složit přijatou hodnotu, • Vypočítat novou polohu ručičky na přístroji • Překreslit přístroj 33
Komunikační protokol
• INT DATA[0] = (INT >>0)&0xFF
• FLOAT DATA[0] = ((char *)&FLOAT)[0]
X38PRS – Úvod – Pavel Pačes
34
• Související problém: Little endian, big endian
btData btData btData btData btData btData btData btData btData btData btData btData [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
ID [1]
DATA[0] = (SHORT>>0)&0xFF DATA[0] = (SHORT>>0)&0xFF
Skládání dat do paketu
Víte něco o CANu? Protokol CanAerospace je třeba přenést paketem typu UDP Přenosový formát zprávy je definován následovně:
ID [0]
32
Skládání dat do paketu
• Vykreslit na displeji přístroj
X38PRS – Úvod – Pavel Pačes
Pooling, proč?
} } break; // END case 2: // State machine process (stať)
} break; // END case 1: // State machine init (úvod) X38PRS – Úvod – Pavel Pačes
Hlavní část programu
ID Length DATA DATA DATA DATA DATA DATA DATA DATA [2] [0] [1] [2] [3] [4] [5] [6] [7]
• Při příjmu hodnoty provádět kontrolu id ifiká identifikátoru paketu – k proč? č?
Význam jednotlivých položek je následující:
• btData ‐ jsou jednotlivé paměťové pozice v paketu. • ID ‐ je identifikátor zprávy posílaný po sběrnici CAN. • Length ‐ je délka vyplněné datové oblasti DATA, délka zprávy přenášené po sběrnici CAN. • DATA ‐ jsou jednotlivé datové byty. X38PRS – Úvod – Pavel Pačes
35
X38PRS – Úvod – Pavel Pačes
36
6
23.11.2008
Regulátor pohybu ručičky
Funkčnost přístroje
Řešení dynamiky ručičky – proč? ‐ PID regulátor
Několik módů činnosti Řešit stavovým automatem
SI32 REG_DoPID( SI32 iError, SI32 iPosition) { int iRetVal; float fRegP, fRegI, fRegD, fReg, fError; // Proportional part of the regulation fRegP = glb_oPID.fGainP*fError; // Integral part of the regulation // derivative state fReg = fRegP + fRegI ‐ fRegD;
Překreslování: • Smazání celé oblasti a opětovné překreslení • Překreslení posledního obrazu • Překreslení částí podkladu
if (fReg >= cREG_MAX_HIT) fReg = cREG_MAX_HIT; if (fReg <= cREG_MIN_HIT) fReg = cREG_MIN_HIT; iRetVal = (int)fReg; return (iRetVal); } // END SI32 REG_DoPID( SI32 iError, SI32 iPosition) X38PRS – Úvod – Pavel Pačes
37
Grafické API – GR_ #1
X38PRS – Úvod – Pavel Pačes
38
Grafické API – GR_ #2
void GR_screen_clear(void)
void GR_circle(int left, int top, int radius, int type, int color1, int color2, int size)
void GR_putBIGpixel(int x, int y, int size, int col1, int col2) void GR_bold_line(int left, int top, int right, int bottom, int size, int color, int color2)
void GR_rectangle(int left, int top, int right, int bottom, int color1, int color2, int size) void GR_full_rectangle(int left, int top, int right, int bottom, int color) id f ll l (i l f i i i h i b i l )
void GR_arc(int center_x, int center_y, int radius, int angle1, int angle2, int color1, int color2, char size) void GR_contour_arc(int center_x, int center_y, int radius, int angle1, int angle2, int width, int color1, int color2, char size) void GR_solid_arc(int center_x, int center_y, int radius, int angle1, int angle2, int width, int color1, int color2, char size) X38PRS – Úvod – Pavel Pačes
39
X38PRS – Úvod – Pavel Pačes
40
Grafické API – GR_ #3
Grafické API – GR_ #4
int GR_getStrLen( unsigned char fontType, char *text) int GR_getFontYsize( unsigned char fontType ) void GR_outtextxy8x8(int x, int y, int color, char *textstring) void GR_outval8x16(int x, int y, int color, char *textstring) // 16x24 void GR_outFont(int x, int y, unsigned char fontType, unsigned char fontFlags, int color, int back_color, char *textstring) void GR_delDigit8x16(int x, int y, int barva)
void GR_draw_bitmap( tBITMAP *b, int left, int top, unsigned char color, unsigned char bg_color ) void GR_draw_part_of_bitmap( tBITMAP *b, int left, int top, int x1, int y1, int x2, int y2, unsigned char flags, unsigned char color, unsigned char bg_color)
X38PRS – Úvod – Pavel Pačes
X38PRS – Úvod – Pavel Pačes
41
42
7
23.11.2008
Polohování přístroje na ploše
V případě vývoje na reálném HW
• BOD [0, 0]
• Problémy
Direktivy preprocesoru • #define cORIGIN_X 320 • #define cORIGIN_Y 240
X38PRS – Úvod – Pavel Pačes
43
X38PRS – Úvod – Pavel Pačes
44
Závěr? :‐) Začátek • Druhé cvičení – Projekt – Ladění L dě í – Kompilace – Ukázky
• Rychloměr X38PRS – Úvod – Pavel Pačes
45
8