Upload
halien
View
215
Download
0
Embed Size (px)
Citation preview
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO,
RAČUNALNIŠTVO IN INFORMATIKO
Domen Murn
POTOVALNI RAČUNALNIK Z GPS
Diplomsko delo
Maribor, julij 2014
POTOVALNI RAČUNALNIK Z GPS
Diplomsko delo
Študent:
Domen Murn
Študijski program: VS ŠP Elektrotehnika
Smer: Elektronika
Mentor: doc. dr. Boštjan Vlaovič, telekomunikacije
Lektorica: Natalija Zmazek, prof. slovenščine in biologije
II
III
ZAHVALA
Zahvaljujem se mentorju, doc. dr. Boštjanu
Vlaoviču, za vodenje pri opravljanju diplomskega
dela. Prav tako se zahvaljujem tudi mag. Slavku
Senica za vse nasvete in pomoč pri tehničnih
zadevah.
Hvala tudi moji mami, ki je vedno verjela vame.
Posebna zahvala moji ţeni Franji, za potrpeţljivost
v času mojega študija.
IV
Potovalni računalnik z GPS
Ključne besede: GPS, protokol NMEA, mikrokrmilnik, PIC, MPLAB X IDE, grafična
knjiţnica, prikazovalnik na dotik, potovalni računalnik
UDK: 004.3/.4:621.396.969.3(043.2)
Povzetek
V diplomskem delu je predstavljena zasnova in izdelava potovalnega računalnika, ki z
uporabo sistema GPS prikazuje trenutno hitrost, pot, porabo goriva ter prevožene
kilometre vozila. Diplomsko delo je razdeljeno na teoretični in praktični del. V teoretičnem
delu je predstavljena kratka zgodovina razvoja sistema GPS in njegovo delovanje.
Podrobno so opisane vse periferne naprave, ki smo jih potrebovali za izdelavo
potovalnega računalnika z GPS.
V drugem, praktičnem delu, je natančno opisano delovanje programa, kateri je napisan v
programskem jeziku ANSI C, s pomočjo razvojnega okolja MPLAB X IDE. Predstavljen je
tudi izdelan prototip, ki vključuje prikazovalnik na dotik.
V
Travel computer with GPS
Key words: GPS, NMEA protocol, microcontroller, PIC, MPLAB X IDE, graphics
library, touchscreen display, travel computer
UDK: 004.3/.4:621.396.969.3(043.2)
Abstract
The diploma thesis includes the design and making of an travel computer which uses GPS
in order to display the vehicle's current speed, route, fuel consumption and kilometres run.
The thesis consists of a theoretical and practical part. The theoretical part covers a brief
historical overview of the development of the GPS system and its application. Also
included is a detailed description of all the peripheral devices needed to construct the
travel computer with GPS.
The second part details the performance of the programme, written in ANSI C
programming language and using MPLAB X IDE programming tool.
The goal of our thesis, namely to construct a touch screen travel computer which enables
access to vehicle data, was therefore realised.
VI
VSEBINA
1 UVOD ........................................................................................................................... 1
2 SISTEM GLOBALNEGA DOLOČANJA POLOŢAJA ......................................... 3
2.1 STANDARD NMEA ............................................................................................. 9
2.1.1 Strojna povezava ............................................................................................... 9
2.1.2 Stavki NMEA ................................................................................................... 10
3 STROJNA OPREMA ................................................................................................ 15
3.1 SPREJEMNIK GPS ............................................................................................. 15
3.1.1 Pregled izdelka ................................................................................................ 15
3.1.2 Komunikacija ................................................................................................... 16
3.1.3 Navigacijski načini .......................................................................................... 16
3.1.4 Delovna stanja in zahteve ................................................................................ 17
3.1.5 Vmesnik ............................................................................................................ 17
3.2 MULTIMEDIJSKA RAZVOJNA PLOŠČA ....................................................... 20
3.2.1 Prikazovalnik na dotik ..................................................................................... 22
3.2.2 Grafični procesor SSD1926 ............................................................................ 22
3.2.3 Dotična ploščica .............................................................................................. 24
3.3 TESTNA PLOŠČA .............................................................................................. 25
3.3.1 Mikrokrmilnik PIC32MX795F512L ................................................................ 27
3.4 PROTOTIP POTOVALNI RAČUNALNIK ....................................................... 30
4 PROGRAMSKA OPREMA ..................................................................................... 33
4.1 RAZVOJNO OKOLJE MPLAB X IDE ..................................................................... 33
4.1.1 Grafična knjižnica ........................................................................................... 34
4.1.2 Grafična zasnova zaslona ................................................................................ 37
4.2 PROGRAMSKA KODA ..................................................................................... 39
4.2.1 Povezava s sprejemnikom GPS ....................................................................... 40
4.2.2 Pomožne funkcije ............................................................................................. 44
4.2.3 Funkciji GOLMsgCallback in GOLDrawCallback ......................................... 52
5 SKLEP ........................................................................................................................ 55
VII
6 LITERATURA .......................................................................................................... 56
7 PRILOGE ................................................................................................................... 59
7.1 PROGRAMSKA KODA ..................................................................................... 59
7.2 NASLOV ŠTUDENTA ............................................................................................ 103
7.3 KRATEK ŢIVLJENJEPIS......................................................................................... 103
VIII
KAZALO SLIK
Slika 1.1: Blok shema potovalnega računalnika z GPS......................................................... 2
Slika 2.1: 24 satelitov sistema GPS, razporejenih v 6 kroţnicah .......................................... 6
Slika 2.2: Razporeditev nadzornih postaj .............................................................................. 6
Slika 2.3: Demodulacija in dekodiranje GPS signala ............................................................ 7
Slika 2.4: Stavki, poslani od GPS ........................................................................................ 14
Slika 3.1: Rockwell »Jupiter« sprejemnik GPS .................................................................. 16
Slika 3.2: 2 x 10 priključni vmesnik .................................................................................... 18
Slika 3.3: Sprednji del Multimedijske razvojne plošče ....................................................... 21
Slika 3.4: Zadnji del Multimedijske razvojne plošče .......................................................... 22
Slika 3.5: 3.2-palčni QVGA TFT prikazovalnik na dotik ................................................... 24
Slika 3.6: Dotična ploščica .................................................................................................. 24
Slika 3.7: Princip delovanja dotične ploščice. ..................................................................... 25
Slika 3.8: Sprednja in zadnja stran Microchip »PIC32 Ethernet Starter Kit« ..................... 26
Slika 3.9: PIC32MX blok diagram ...................................................................................... 28
Slika 3.10: PIC32 prekinitveni način ................................................................................... 29
Slika 3.11: Blok diagram UART sprejemnika .................................................................... 30
Slika 3.12: Razstavljen prototip potovalnega računalnika GPS .......................................... 31
Slika 3.13: Sestavljen prototip potovalnega računalnika GPS ............................................ 31
Slika 3.14: Vezava sprejemnika GPS .................................................................................. 32
Slika 4.1: Razvojno okolje MPLAB X IDE ........................................................................ 33
Slika 4.2: Struktura Microchipove grafične knjiţnice ......................................................... 34
Slika 4.3: Osnovna uporaba grafične knjiţnice ................................................................... 35
Slika 4.4: Stilne komponente objekta .................................................................................. 36
Slika 4.5: Tvorba objekta gumb, »edit box« ....................................................................... 36
IX
Slika 4.6: Sporočilna struktura GOL_MSG ........................................................................ 37
Slika 4.7: Potek izvajanja sporočilne strukture ................................................................... 38
Slika 4.8: Datoteka GDD_Screen.c -1- ............................................................................... 38
Slika 4.9: Datoteka GDD_Screen.c -2- ............................................................................... 39
Slika 4.10: Osnovno delovanje zaslonov potovalnega računalnika .................................... 41
Slika 4.11: Konfiguracija UART1 ....................................................................................... 42
Slika 4.12: Prekinitvena funkcija......................................................................................... 43
Slika 4.13: Zaslon z izpisom točnega časa .......................................................................... 44
Slika 4.14: Funkcija za razčlenjevanje stavka NMEA ........................................................ 45
Slika 4.15: Funkcija za izpis časa ........................................................................................ 45
Slika 4.16: Izpis časa za Avstralijo ...................................................................................... 46
Slika 4.17: Funkcija za izpis datuma -1- ............................................................................. 46
Slika 4.18: Funkcija za izpis datuma -2- ............................................................................. 47
Slika 4.19: Funkcija za izpis datuma in ure -1- ................................................................... 48
Slika 4.20: Funkcija za izpis datuma in ure -2- ................................................................... 49
Slika 4.21: Zaslon za merjenje hitrosti ................................................................................ 50
Slika 4.22: Funkcija za izpis hitrosti ................................................................................... 50
Slika 4.23: Zaslon za prikaz povprečne porabe vozila ........................................................ 51
Slika 4.24: Funkcija za izračun porabe ................................................................................ 51
Slika 4.25: Funkcija GOLMsgCallback .............................................................................. 52
Slika 4.26: Funkcija GOLDrawCallback ............................................................................ 53
Slika 4.27: Določitev spremenljivke »Flag« ....................................................................... 53
Slika 4.28: Izpis podatkov na zaslonu 4 .............................................................................. 54
X
KAZALO TABEL
Tabela 3.1: Priključitvene zahteve »Jupiter« sprejemnika GPS .......................................... 18
Tabela 3.2: Opis priključkov 2 x 10-pinskega vmesnika .................................................... 18
Tabela 3.3: Konfiguracija serijskega vmesnika »Jupiter« sprejemnika GPS ...................... 20
XI
UPORABLJENI SIMBOLI
m – meter (merska enota za dolţino)
km – kilometer (merska enota za dolţino)
m/s – meter na sekundo (merska enota za hitrost)
km/h – kilometer na uro (merska enota za hitrost)
V – volt (merska enota za električno napetost)
Hz – Hertz (merska enota za frekvenco)
min – minuta (merska enota za čas)
sec – sekunda (merska enota za čas)
h – ura (merska enota za čas)
A – amper (merska enota za električni tok)
VDC – enosmerna napetost (merska enota za napetost)
bpp – bitov na slikovno piko
Ω ohm (merska enota za električno upornost)
XII
UPORABLJENE KRATICE
ADC – analogno-digitalni pretvornik (Analog to Digital Converter)
ANSI – ameriški nacionalni inštitut za standardizacijo (American National
Standards Institute)
ASCII – ameriška standardna koda za izmenjavo informacij (American Standard
Code for Information Interchange)
C/A – grobo pridobivanje (Coarse/Acquisition)
CAN – območje upravljanega omreţja (Controller Area Network)
CPU – centralna procesna enota (Control Processing Unit)
CR – prehod na začetek vrstice (Carriage Return)
DCT – diskretna kosinusna transformacija (Discrete Cosine Transformation)
DDD – gonilnik prikazovalnika (Display Device Driver)
DGPS – diferencialno GPS pozicioniranje (Differential Global Positioning System)
DMA – neposreden pomnilniški dostop (Direct Memory Access)
DNSS – obrambni navigacijski satelitski sistem (Defense Navigation Satellite
System)
DOP – faktor zmanjšanja točnosti (Dilution of Precision)
DSP – digitalni signalni procesor (Digital Signal Processor)
EEPROM – električno izbrisljiv in programiljiv bralni pomnilnik (Electricaly Erasable
Programmable Read Only Memory)
Flash RAM – bliskovni pomnilnik (Flash Random Access Memory)
FIFO – prvi noter prvi ven (First In First Out)
GPS – sistem globalnega določanja poloţaja (Global Positioning System)
GDD – oblikovalec zaslona (Graphics Display Designer)
GOL – sloj grafičnih objektov (Graphics Objects Layer)
HDOP – faktor zmanjšanja točnosti v vodoravni ravnini (Horizontal Dilution of
precision)
ICBM – medcelinski balistični izstrelek (Intercontinental Ballistic Missile)
ICD – označevalec mednarodne kode (International Code Designator)
iDCT – inverzna diskretna kosinusna transformacija (Inverse Discrete Cosine
Transformation)
XIII
IDE – integrirano razvojno orodje (Integrated Development Environment)
KAL – korejska letalska druţba (Korean Air Lines Flight)
LCD – zaslon s tekočimi kristali (Liquid Crystal Display)
LED – svetleča dioda (Light Emitting Diode)
MCS – glavni nadzorni center (Master Control Station)
MLA – Microchipova aplikacijska knjiţnica (Microchip Libraries for
Applications)
MOSAIC – mobilni sistem za natančen ICBM nadzor (Mobile System for Accurate
ICBM Control)
NAVSAT – mornarski navigacijski satelitski sistem (Navy Navigation Satellite
System)
NAVSTAR – ameriški program za vzpostavitev sistema GPS (Navigation System Using
Timing and Ranging)
NMEA – standardizirana elektronska sporočila (National Marine Electronic
Association)
NRZ – modulacija brez povratka na ničlo (Non Return to Zero)
OEM – proizvojalec originalne opreme (Original Equipment Manufacture)
P – natančno pridobivanje (Precision)
PDOP – kakovost določitve poloţaja (Position Dilution of Precision)
PRN – pseudonaključno število (Pseudo Random Number)
RAM – pomnilnik z naključnim dostopom (Random Access Memory)
RF – radijska frekvenca (Radio Frequency)
RISC – procesorsko jedro z reduciranim naborom inštrukcij (Reducet Instruction
Set Core)
ROM – bralni pomnilnik (Read Only Memory)
RTC – sodelovanje v realnem času (Real Time Callaboration)
RTCC – realni čas ure in koledarja (Real Time Clock and Calender)
RTCM – sklop standardov za pomorsko navigacijo (Radio Technical Commission
for Maritime services)
SFR – posebni funkcijski register (Special Function Register)
SPI – serijsko periferijsko vodilo (Serial Peripheral Interface bus)
XIV
SRAM – statični pomnilnik z naključnim dostopom (Static Random Access
Memory)
TTFF – čas do prve določitve (Time To First Fix)
UART – univerzalni asihroni sprejemnik oddajnik (Universal Asynchronous
Receiver Transmitter)
USB – univerzalno serijsko vodilo (Universal Serial Bus)
VDOP – faktor zmanjšanja točnosti v navpični ravnini (Vertical Dilution of
Precisio
Potovalni računalnik z GPS Stran 1
1 UVOD
Potovalni računalnik najdemo ţe skoraj v vsakem vozilu. Gre za napravo, ki nam na poti
pokaţe povprečno porabo in hitrost, trenutno stanje števca, stanje prevoţenih kilometrov,
ipd. Ključni element potovalnega računalnika je sistem GPS (Global Positioning System).
GPS je satelitski navigacijski sistem, ki se uporablja za določanje natančnega poloţaja in
časa kjerkoli na Zemlji 1. Osnovna funkcija sprejemnika GPS je prikaz točnih
geografskih koordinat. Sprejemnik lahko koristi različne komunikacije z mikrokrmilnikom
ali računalnikom. Najpogostejši način komunikacije je preko zaporednega vmesnika,
najpogosteje uporabljen protokol za pošiljanje teh informacij pa je protokol NMEA
(National Marine Electronic Association). Uporabniku ţelimo ponuditi čim laţje
spremljanje funkcionalnosti potovalnega računalnika, zato smo se odločili, da vključimo
tudi grafični prikazovalnik na dotik. Diplomsko delo predstavlja izdelavo prototipa
potovalnega računalnika z GPS, ki uporabniku na poti omogoča prikaz trenutne in
povprečne hitrosti, stanje prevoţenih kilometrov in porabe goriva avtomobila. Ker nimamo
dovoljenja za poseg v vozilo, smo poskušali narediti podobno zunanjo napravo za vozila,
ki nimajo vgrajenega potovalnega računalnika. Naprava bo uporabniku omogočila dostop
do podobnih informacij, brez fizičnega posega vanj. Pri tem smo uporabili mikrokrmilnik
in grafični prikazovalnik na dotik. Slednji uporabniku omogoča celovit nadzor nad napravo
(slika 1.1). Po uvodnem študiju knjiţnice za grafični prikaz in modula GPS smo izvedli
izbiro primernega mikrokrmilnika, grafičnega prikazovalnika in ostalih perifernih naprav.
Sledila je izdelava programske opreme za dosego zastavljenih ciljev. Pri delu smo
uporabili strokovne knjige in literaturo.
Diplomsko delo Potovalni računalnik z GPS obsega sedem poglavij. V drugem poglavju, z
naslovom »Sistem globalnega določanja poloţaja«, predstavimo kratko zgodovino sistema,
njegovo osnovno delovanje in protokol NMEA. V tretjem poglavju je opisana strojna
oprema, ki je bila uporabljena pri izdelavi projekta. To so Rockwell-ov sprejemnik GPS,
Microchip-ova multimedijska razvojna ploščica in Microchip-ova testna ploščica »PIC32
Potovalni računalnik z GPS Stran 2
ethernet starter kit«. V četrtem poglavju predstavimo razvojno orodje MPLAB X IDE
(Integrated Development Environment), dodatek Grafični oblikovalec zaslona GDD
(Graphics Display Deisigner), grafično knjiţnico in programsko kodo.
Slika 1.1: Blok shema potovalnega računalnika z GPS
Izpis
podatkov
$GPRMC NMEA Sprejemnik
GPS
Testna
plošča
Prikazovalnik
na dotik
Potovalni računalnik z GPS Stran 3
2 SISTEM GLOBALNEGA DOLOČANJA POLOŢAJA
Prvi operativni satelitski navigacijski sistem je razvila ameriška mornarica leta 1960.
Poimenovali so ga sistem TRANSIT, znan tudi kot NAVSAT (Navy Navigation Satellite
System) 2. Istega leta so ameriške zračne sile začele z radio navigacijskim sistemom,
imenovanim MOSAIC (Mobile System for Accurate ICBM Control) [4]. V nadaljevalni
projektni študiji Project 621B se je rodil koncept sistema GPS, katerega lastnosti so
prisotne v današnjem sistemu GPS 3. Na praznik dela, leta 1973, so na srečanju
dvanajstih vojaških častnikov v Pentagonu razpravljali o oblikovanju obrambno-
satelitskega navigacijskega sistema DNSS (Defense Navigation Satellite System), kjer je
bila ustvarjena sinteza o sistemu GPS. Kasneje istega leta se je DNSS program
preimenoval v NAVSTAR-GPS (Navigation System Using Timing and Ranging), katerega
so kasneje skrajšali v GPS [4]. Po sestrelitvi korejskega civilnega letala KAL 007 (Korean
Air Lines Flight 007), ki je zašlo zaradi navigacijske napake v prepovedan zračni prostor
takratne Sovjetske zveze, kjer je umrlo vseh 269 potnikov, je ameriški predsednik Ronald
Reagan napovedal, da bo sistem GPS na voljo tudi za civilno uporabo [4,5]. Do leta 1985
je bilo izstreljenih več deset poizkusnih satelitov tipa Block-I. Leta 1989 pa je bil izstreljen
prvi sodobni satelit tipa Block – II. Prva večja uporaba sistema GPS je bila v Zalivski
vojni, leta 1990–1991. Do decembra leta 1993 je sistem GPS prvič dosegel zmogljivosti
določanja poloţaja s pomočjo 24 satelitov. Zastarelo tehnologijo sistema TRANSIT je leta
1996 povsem zamenjal sistem GPS. Novejši sistem uporablja večje število satelitov, ki
omogočajo nenehno pošiljanje podatkov uporabniku, medtem ko je bil sistem TRANSIT
zmoţen pošiljati podatke le vsako uro ali več. Istega leta je takratni ameriški predsednik
Bill Clinton podal direktivo, da se sistem GPS uporablja tako v civilne kot tudi v vojaške
namene. Leta 1998 so bili s strani Bele hiše objavljeni načrti za nadgradnjo sistema GPS za
civilne namene z dvema novima signaloma, in sicer za izboljšanje natančnosti in
zanesljivosti podatkov, s čimer so ţeleli doseči večjo varnost v letalstvu. Objavljena
nadgradnja je bila izvedena leta 2005, ko je bil izstreljen prvi moderniziran satelit GPS.
Potovalni računalnik z GPS Stran 4
Podjetju Qualcomm je leta 2004 uspel test za uspešno uporabo podatkov GPS z mobilnimi
telefoni. Istega leta je ameriška vlada podpisala sporazum z Evropsko Unijo o načrtovanju
evropskega sistema Galileo. Ameriške zračne sile so leta 2010 oddale naročilo za razvoj
satelitov GPS naslednje generacije. S tem so ţeleli izboljšati točnost in razpoloţljivost
navigacijskih signalov GPS. V orbito so prvi satelit GPS naslednje generacije izstrelili leta
2011 4. V tabeli 2.1 so kronološko predstavljeni izstreljeni sateliti v zemeljsko orbito.
Tabela 2.1: Izstreljeni sateliti v zemeljsko orbito
Leto
izstrelitve
Izstreljeni sateliti
Uspešno Neuspešno V pripravi Načrtovani
Trenutno
delujoči
sateliti v orbiti
1978–1985 10 1 0 0 0
1989–1990 9 0 0 0 0
1990–1997 19 0 0 0 9
1997–2004 12 1 0 0 12
2005–2009 8 0 0 0 7
od 2010 4 0 10 0 4
od 2014 0 0 0 12 0
SKUPNO 61 2 10 12 31
Sistem GPS je sestavljen iz sprejemnika in oddajnika. Oddajnik zajema mreţo 24 satelitov,
ki kroţijo v zemeljski orbiti v več kroţnih tirnicah okoli Zemlje (slika 2.1). Vsak satelit
ima vgrajeno natančno atomsko uro in neprestano pošilja podatek o času poslanega
sporočila in o svojem poloţaju v trenutku, ko je bilo sporočilo poslano. Sateliti oddajajo na
dveh različnih visokofrekvenčnih kanalih, in sicer L1=1575,42 MHz in L2=1227,60 MHz.
Ti dve frekvenci sta bili izbrani kot kompromis med potrebno močjo oddajnika in
ionosferskimi pogreški. Vpliv ionosfere upada s kvadratom frekvence nosilca in je zelo
majhen na frekvencah nad 1 GHz. L1 in L2 sta nato modelirani s pseudo naključno kodo
PRN (Pseudo Random Number) in navigacijskim sporočilom. To omogoča oddajanje
posameznih satelitov, ne da bi se med seboj motili in ne da bi motili druge signale [4].
Sateliti oddajajo dve vrsti signalov, in sicer:
Potovalni računalnik z GPS Stran 5
- C/A (Coarse/Acquisition) koda, ki modulira zelo kratek signal (1023 bitov) frekvence
L1 in se uporablja za civilno rabo. Ta signal se ponavlja vsako milisekundo [4].
- P (Precision) koda je modulirana iz frekvence L1 in L2. Ta koda je zelo dolga in se
oddaja z desetkratno hitrostjo C/A kode. Uporablja se izključno v ameriški vojski 6.
Obe kodi vsebujeta navigacijska sporočila z informacijami o orbiti satelita, korekcijah ure
in druga sistemska sporočila. Sprejemniki, ki se nahajajo na Zemlji, s svojo strojno in
programsko opremo prejeti signal ustrezno dekodirajo, dobljene podatke pa uporabijo kot
osnovo za izračun podatkov [4,7]. Celoten sistem GPS je sestavljen iz treh segmentov:
a) vesoljski segment,
b) nadzorni segment,
c) uporabniški segment.
a) Vesoljski segment
Vesoljski segment je sestavljen iz satelitov GPS, ki kroţijo v orbiti na višini 20.200 km
nad Zemljo. Gibljejo se v šestih ravneh, ki so glede na ekvator nagnjene za 55 . Prvotno
so bile mišljene tri kroţnice po osem satelitov, vendar so izbrali sistem šestih kroţnic s
štirimi sateliti na vsaki kroţnici (slika 2.1) [6]. Glavna naloga vesoljskega segmenta je, da
generira in oddaja podatek ter navigacijsko sporočilo [4,6]. Sateliti GPS sprejemajo in
shranjujejo informacije, ki jih dobijo od nadzornega segmenta. Njihova naloga je tudi, da
natančno merijo čas s pomočjo astronomskih ur, ter pošiljajo podatke uporabnikom preko
signalov 6.
b) Nadzorni segment
Nadzorni segment je sestavljen iz glavnega nadzornega centra in štirih nadzornih postaj
(slika 2.2). Glavni nadzorni center se nahaja v Coloradu, medtem ko se ostale štiri
nadzorne postaje nahajajo na območju Havajskega otočja (Hawaii), Indijskega oceana
(Diego Garcia), Atlantskega oceana (Ascension) in na območju zahodnega Tihega oceana
(Kwajalein) [4,6]. Vse satelite GPS v zemeljski orbiti nadzirajo nadzorne postaje, tako da
vsako sekundo merijo razdaljo do njih. Dobljene podatke pošiljajo v glavni nadzorni center
MCS (Master Control Station) v Colorado Springs, kjer se odloča o zamenjavi satelitov na
podlagi njihovega poloţaja, delovanja ter stanja [4]. Glavna nadzorna postaja nato te
informacije pošlje trem povezovalnim postajam (zemeljske antene), katere dobljene
Potovalni računalnik z GPS Stran 6
informacije posredujejo satelitom. Glede na razpršenost nadzornih postaj po svetu je
sledljivost satelitov 92 % 6.
Slika 2.1: 24 satelitov sistema GPS, razporejenih v 6 kroţnicah
Slika 2.2: Razporeditev nadzornih postaj
c) Uporabniški segment
V uporabniški segment sodijo uporabniki, ki s svojimi sprejemniki določajo svoj poloţaj.
Za dešifriranje signalov GPS mora sprejemnik sprejemati signal več satelitov, slediti PRN
kodi in osveţevati navigacijske podatke 6.
Glavni nadzorni center Nadzorna postaja Povezovalna postaja
Potovalni računalnik z GPS Stran 7
Demodulacija in dekodiranje signala GPS
Vsi signali satelitov GPS se prenašajo na frekvenci L1, zato je potrebno te signale po
demodulaciji ločiti [4]. Vsak satelit ima dodeljeno svojo binarno sekvenco, imenovano
»Gold Code«, ki vsebuje PRN identifikacijo satelita (slika 2.3). Sprejemnik generira enako
PRN kodo kot satelit in jo primerja s prejeto kodo od satelita toliko časa, dokler ne pride
do korelacije s kodo. Čas, ko je korelacija največja, imenujemo čas prihoda. Po
demodulaciji se signal s pomočjo »Gold Code« kode modulira z modul 2 dodajnikom,
katerega rezultat je navigacijsko sporočilo posameznega satelita. Če je bil zbor informacij
poslan, sprejemnik izbere satelite in jih razvršča po njihovih PRN določenih številkah (od
1 do 32) [4, 8]. Sprejemnik s pomočjo navigacijskega sporočila dobi informacije o satelitih
in njihovih poloţajih. Na ta način lahko določi, katerim satelitom naj sledi [8].
Slika 2.3: Demodulacija in dekodiranje GPS signala
Iskanje satelitov
Da bi se sprejemnik lahko povezal s satelitom GPS, mora opraviti dvo-dimenzionalno
iskanje signala. Prva dimenzija je čas. Struktura signala GPS za posamezen satelit je
sestavljena iz psevdonaključnega zaporedja dolţine 1023 bita, ki se prenaša s hitrostjo
1,023 Mb/s. To pomeni, da se zaporedje ponovi vsako milisekundo. Za omogočanje
sprejema v tej dimenziji mora sprejemnik nastaviti notranjo uro tako, da bo sovpadala z
eno izmed 1023 razpoloţljivih časovnih reţ, pri čemer mora poskusiti vse moţne
vrednosti. Večina sprejemnikov se ustavi in miruje na vsaki izmed moţnih vrednosti nekaj
Navigacijsko
sporočilo satelita n2
Navigacijsko sporočilo
satelita n1
demoduliran
signal
frekvenca L1
1575,42 MHz
demodula
tor
C/A Gold
Code
n2 1023 b/ms
C/A Gold
Code
n1 1023 b/ms
modul
2
dodajni
k
modul
2
dodajni
k
Potovalni računalnik z GPS Stran 8
milisekund, kar pomeni, da sprejemnik potrebuje 1 do 2 sekundi za preizkušanje vseh
moţnih vrednosti. Druga dimenzija je frekvenca. Sprejemnik mora odpraviti napake
navidezne Dopplerjeve frekvence satelita ter odpraviti zaznano razliko v frekvenci.
Frekvenčni koraki satelitov so v fazi začetnega sprejemanja 500 Hz, vendar je lahko
kristalni oscilator na sprejemniku netočen tudi za +/- 10 kHz, zato je potrebno opraviti do
dvajset popravkov frekvence. Ta proces je potrebno ponoviti za vsakega izmed N
uporabljenih satelitov [26].
Najpogostejša strategija iskanja je iskanje na začetni frekvenci oscilatorja, ki jo napovemo
na podlagi:
a. kakšen je naš pribliţen poloţaj (sklepamo glede na zadnji znan poloţaj)?
b. kje so sateliti zdaj in kakšna je njihova navidezna hitrost (Ta temelji na shranjenem
katalogu podatkov, ki so pridobljeni iz satelita.)?
c. napake kristalnega oscilatorja sprejemnika (Iskanje pričnemo glede na zadnjo znano
napako.).
Na začetni frekvenci oscilatorja sprejemnik preizkusi vseh 1023 moţnih kodnih faz,
natančno iskanje pa bo sproţil v primeru, da detektira signal. Če nobena izmed 1023 kod
ne ustreza kodi satelita, sprejemnik nastavi oscilator na naslednjo testno vrednost ter
proces ponavlja, dokler ne naleti na ustrezno kodo satelita. Ko sprejemnik prejme signal,
oblikuje dve sledilni zanki – prvo v frekvenčni domeni, drugo pa v 1023-bitni kodni
prostorski domeni, z namenom sledenja tako kodi kakor fazam prenosa signala [26].
Signal je strukturiran iz 1500-bitnega sporočila, poslanega s hitrostjo 50 b/s, kar traja 30
sekund. Večina sprejemnikov zahteva kopiranje celotnega neprelomljenega 1500-bitnega
sporočila, da bi lahko uporabili signale. Če z dekodiranjem pričnemo na začetku, bo to
trajalo 30 sekund. Če pričnemo en bit pozneje, se bo prvi celoten komplet sporočil, ki jih
lahko dekodiramo, pričel 30 sekund pozneje, tako da sporočilo prejmemo šele 60 sekund
po prvotnem pridobivanju, s povprečno zamudo 45 sekund [26].
Za grob 2-D pozicijski popravek ter zagotavljanje natančnosti ure sprejemnika
potrebujemo podatke treh satelitov. Po tem, ko so najdeni prvi trije, pridobi sprejemnik
celotno sliko časa in frekvence ter se nato poveţe z več sateliti, katere prične uporabljati po
30–60 sekundah [26].
Potovalni računalnik z GPS Stran 9
Pri začetnih nastavitvah sprejemnik predvideva, da sta pozicija in katalog podatkov
neveljavna, ter prične z iskanjem PRN1, PRN2 ..., vse do PRN32, z namenom iskanja
prvih treh uporabnih satelitov. To iskanje lahko traja tudi več kot 20 minut [26].
2.1 STANDARD NMEA
Standard NMEA – 0183 je razvilo društvo National Marine Electronics Association
(NMEA). Standard NMEA – 0183 definira vmesnik za povezovanje pomorske elektronske
opreme, med drugim tudi s sprejemnikom GPS. Osnovna ideja standarda NMEA je, da
pošilja vrstice podatkov, imenovane stavki, ki so popolnoma samostojni in neodvisni od
drugih stavkov. Vsak stavek se začne z znakom $ in konča z znakom za prehod v novo
vrstico <CR> in znakom za pomik v novo vrstico <NL> [9]. Znaku $ sledi pet znakov;
prva dva znaka predstavljata tip naprave, naslednji trije pa predstavljajo namen stavka [10].
Primer: $GPRMC …, kjer je GP kratica za GPS, RMC pa Recommended Minimum Data
Podatki v stavku so ločeni z vejicami, s pomočjo katerih lahko razčlenimo stavek in tako
pridemo do ţeljenega podatka v stavku 10].
NMEA – 2000, skrajšano NMEA2k ali N2K, je standard za komunikacijo, namenjen
povezovanju senzorjev in nadzorne enote s prikazovalnikom znotraj ladij, čolnov in
avtomobilov. Hitrost prenosa podatkov je 250 kb/s in zagootavlja povezavo nadzorne enote
prikazovalnika s katerokoli napravo na vodilu. NMEA 2000 je zdruţljiv z vodilom CAN
(Controller Area Network) vodilom [25].
2.1.1 Strojna povezava
Komunikacija poteka preko zaporednega prenosa po protokolu RS232, čeprav je
priporočen standard RS422. Pri standardu NMEA – 0183 je hitrost vmesnika 4800 baud/s,
ima 8-bitni prenos podatkov, brez paritete in z enim start in stop bitom. Vse naprave, ki
podpirajo standard NMEA, morajo podpirati to hitrost in te nastavitve. Pri 4800 baud/s
lahko pošljemo 480 znakov na sekundo. Stavki NMEA so lahko dolgi do 82 znakov, kar
nam omogoča, da lahko dobimo 6 stavkov na sekundo 9.
Potovalni računalnik z GPS Stran 10
2.1.2 Stavki NMEA
Slika 2.4 prikazuje primer podatkov, prejetih iz sprejemnika GPS, kjer so zapisani stavki,
ki nakazujejo, da so poslani od naprave GPS. Vsak stavek nosi niz podatkov, ki jih
sprejemnik sprejema. Opisani so le stavki, prikazani na sliki 2.4.
RMC – Stavek zajema minimalne podatke GPS.
$GPRMC,211628,A,4600.9270,N,01517.9597,E,0.000,0.0,171213,2.8,E*7B
1 2 3 4 5 6 7 8 9 10 11 12
1. 211628 To je čas, določen ob 21:16:28.
2. A Status podatka (A je aktiven, V je prost).
3. 4600.9270 Podatek o zemljepisni širini.
4. N Sever (N je sever, S je jug).
5. 01517.9597 Podatek o zemljepisni dolžini.
6. E Vzhod (E je vzhod, W je zahod).
7. 0,000 Hitrost v vozlih.
8. 0,0 Kot gotove poti v stopinjah.
9. 171213 Datum, določen dne 17.12.2013.
10. 2.8 Magnetno odstopanje v stopinjah.
11. E Preračunan (A je neodvisen, D je diferencialen, E je preračunan, S je simulator).
12. 7B Kontrolna vsota.
GSV – Stavek zajema število vidnih satelitov.
$GPGSV,3,1,09,26,70,146,00,15,62,292,41,28,48,054,00,24,29,278,42*7F
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1. 3 Število poslanih GSV stavkov je 3.
2. 1 Stavek številka 1.
3. 09 Število vidnih satelitov je 9.
4. 26 PRN številka satelita je 26.
5. 70 Višina satelitov v stopinjah je 70.
6. 146 Azimut (smer) v stopinjah je 146.
7. 00 SNR (razmerje signal:šum) je 00.
8. 15 PRN številka satelita je 15.
9. 62 Višina satelitov v stopinjah je 62.
10. 292 Azimut (smer) v stopinjah je 292.
11. 41 SNR (razmerje signal:šum) je 41.
Potovalni računalnik z GPS Stran 11
12. 28 PRN številka satelita je 28.
13. 48 Višina satelitov v stopinjah je 48.
14. 054 Azimut (smer) v stopinjah je 54.
15. 00 SNR (razmerje signal:šum) je 00.
16. 24 PRN številka satelita je 24.
17. 29 Višina satelitov v stopinjah je 29.
18. 278 Azimut (smer) v stopinjah je 278.
19. 42 SNR (razmerje signal:šum) je 42.
20. 7F Kontrolna vsota.
$GPGSV,3,2,09,17,29,124,00,09,25,082,00,08,23,076,00,18,18,312,31,*75
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1. 3 Število poslanih GSV stavkov je 3.
2. 2 Stavek številka 2.
3. 09 Število vidnih satelitov je 9.
4. 17 PRN številka satelita je 17.
5. 29 Višina satelitov v stopinjah je 29.
6. 124 Azimut (smer) v stopinjah je 124.
7. 00 SNR (razmerje signal:šum) je 00.
8. 09 PRN številka satelita je 9.
9. 25 Višina satelitov v stopinjah je 25.
10. 082 Azimut (smer) v stopinjah je 82.
11. 00 SNR (razmerje signal:šum) je 00.
12. 08 PRN številka satelita je 08.
13. 23 Višina satelitov v stopinjah je 23.
14. 076 Azimut (smer) v stopinjah je 76.
15. 00 SNR (razmerje signal:šum) je 00.
16. 18 PRN številka satelita je 18.
17. 18 Višina satelitov v stopinjah je 18.
18. 312 Azimut (smer) v stopinjah je 312.
19. 31 SNR (razmerje signal:šum) je 31.
20. 75 Kontrolna vsota.
$GPGSV,3,3,09,05,13,200,26*41
1 2 3 4 5 6 7 8
1. 3 Število poslanih GSV stavkov je 3.
2. 3 Stavek številka 3.
Potovalni računalnik z GPS Stran 12
3. 09 Število vidnih satelitov je 9.
4. 05 PRN številka satelita je 05.
5. 13 Višina satelitov v stopinjah je 13.
6. 200 Azimut (smer) v stopinjah je 200.
7. 26 SNR (razmerje signal:šum) je 26.
8. 41 Kontrolna vsota.
PRWIZCH – Stavek je last Rockwellovega sprejemnika in dopolnjuje stavek GSV s
podatkom o statusu kanala, na katerem oddaja 12. Stavek je sestavljen iz 12 parov. Prvi
del para je podatek o številki PRN satelita, drugi pa podatek o statusu kanala 13. Če kanal
ni v uporabi, je vrednost nič za oba para. Status kanala je zapisan kot en digit
heksadecimalne vrednosti:
0 – Podatki satelitov na tem kanalu so za uporabo v navigacijskem sistemu.
1 – Na tem kanalu je za satelite dostopen astronomski koledar.
2 – Sateliti na tem kanalu so v iskanju.
3 – Dostopna DGPS korekcija za satelite 12.
$ PRWIZCH,08,0,00,0,28,0,17,0,00,0,24,7,09,0,18,7,15,7,00,0,05,2,26,0*4F
1 2 3 4 5 6 7 8 9 10 11 12 13
Par 1 08,0 Kanal 1, PRN številka satelita 08, uporaba v navigacijskem sistemu.
Par 2 00,0 Kanal 2, ni v uporabi.
Par 3 28,0 Kanal 3, PRN številka satelita 28, uporaba v navigacijskem sistemu.
Par 4 17,0 Kanal 4, PRN številka satelita 17, uporaba v navigacijskem sistemu.
Par 5 00,0 Kanal 5, ni v uporabi.
Par 6 24,7 Kanal 6, PRN številka satelita 24, dostopna DGPS korelacija za satelite.
Par 7 09,0 Kanal 7, PRN številka satelita 09, uporaba v navigacijskem sistemu.
Par 8 18,7 Kanal 8, PRN številka satelita 18, dostopna DGPS korelacija za satelite.
Par 9 15,7 Kanal 9, PRN številka satelita 15, dostopna DGPS korelacija za satelite.
Par 10 00,0 Kanal 10, ni v uporabi.
Par 11 05,2 Kanal 11, PRN številka satelita 05, sateliti so v iskanju.
Par 12 26,0 Kanal 12, PRN številka satelita 26, uporaba v navigacijskem sistemu.
13. 4F Kontrolna vsota.
Potovalni računalnik z GPS Stran 13
GGA – Stavek zajema podatke o poloţaju s 3D lokacijo in točnost zadetka.
$GPGGA,211629,4600.9270,N,01517.9597,E,1,03,0.91,226.9,M,43.4,M,,*74
1 2 3 4 5 6 7 8 9 10 11 12 13
1. 211629 To je čas, določen ob 21:16:29.
2. 4600.9270 Podatek o zemljepisni širini.
3. N Sever (N je sever, S je jug).
4. 01517.9597 Podatek o zemljepisni dolţini.
5. E Vzhod (E je vzhod, W je zahod).
6. 1 GPS (0 = neveljavno, 1 = GPS, 2 = DGPS).
7. 03 Število satelitov v uporabi.
8. 0.91 Horizontalna slabitev HDOP (Horizontal Dilution of Precision).
9. 226.9 Višina, globina.
10. M Enota meter za višino in globino.
11. 43.4 Nadmorska višina.
12. M Enota meter za nadmorsko višino.
13. 74 Kontrolna vsota.
GSA – Stavek izpiše faktor zmanjšane točnosti DOP (Dilution of Precision) in status
satelitov.
$GPGSA,A,2,24,18,15,,,,,,,,,,1.68,0.91,1.41,*0B
1 2 3 4 5 6 7
1. A Avtomatski način (A je avtomatski način, R je ročni način).
2. 2 2D podatek (1= ni podatka, 2 = 2D podatek, 3 = 3D podatek).
3. 24,18,15,,,,,,,,,, PRN številke satelitov v uporabi (za neuporabne se izpiše prazno polje).
4. 1.68 Kakovost določitve poloţaja PDOP (Position Dilution of Precision).
5. 0.91 Horizontalni faktor zmanjšanja točnosti (HDOP).
6. 1.41 Vertikalni faktor zmanjšanja točnosti VDOP (Vertical Dilution of Precision).
7. 0B Kontrolna vsota.
Potovalni računalnik z GPS Stran 14
Slika 2.4: Stavki, poslani od GPS
Potovalni računalnik z GPS Stran 15
3 STROJNA OPREMA
Strojna oprema, ki je bila uporabljena pri izdelavi projekta, zajema Rockwell-ov
sprejemnik GPS, Microchip-ovo multimedijsko razvojno ploščico in Microchip-ovo testno
ploščico »PIC32 ethernet starter kit«.
3.1 SPREJEMNIK GPS
Rockwell »Jupiter« sprejemnik GPS je sprejemnik z 12-kanalno tehnologijo, ki omogoča
sledenje do 12 satelitov za izračun in obnavljanje informacije. Digitalni sprejemnik
uporablja čip Zodiak, ki skupaj z "Gemini/Pisces" MonoPac ™ in "Scorpio" DSP (Digital
Signal Processor) omogočajo nizko porabo sprejemnika GPS [14].
3.1.1 Pregled izdelka
»Jupiter« sprejemnik dekodira in procesira signale vseh vidnih satelitov GPS. Ti sateliti, ki
v različnih orbitah kroţijo okoli Zemlje, oddajajo RF (Radio Frequency) kode in
navigacijska podatkovna sporočila. Sprejemnik uporablja vse razpoloţljive signale za
proizvajanje natančnih in zanesljivih navigacijskih rešitev, ki se lahko uporabljajo v
različnih aplikacijah končnega izdelka [14].
»All-in-view« sledenje »Jupiter-jevega« sprejemnika omogoča zmogljivost v aplikacijah,
ki zahtevajo visoko dinamičnost vozil in v aplikacijah, ki delujejo na področjih blokiranja
signala, kot so gosto naseljena urbana središča. Sprejemnik nenehno spremlja vse vidne
satelite GPS in uporablja vse meritve za izdelavo navigacijskih rešitev. Ta rešitev je
relativno imuna na poloţajne skoke, ki se lahko pojavijo v sprejemnikih z manj kanalov
[14].
Potovalni računalnik z GPS Stran 16
Sprejemnik potrebuje za pravilno delovanje 5 V enosmerne napetosti. Deluje lahko s
pomočjo aktivne ali pasivne antene za sprejem frekvenčnega pasu L1. Sprejemnik določa
svoj poloţaj s pomočjo signala iz treh ali več satelitov GPS, ki kroţijo okoli Zemlje.
Sateliti morajo imeti vidljivost na nebu. To na splošno ni problem, ko je sprejemnik
uporabljen na prostem. Zato ga postavimo tako, da ima neoviran pogled na nebo. Če so
satelitski signali v nevidnem polju, bo čas, da sprejemnik sprejme signal in določi poloţaj,
večji [14].
3.1.2 Komunikacija
Komunikacija s sprejemnikom je vzpostavljena na podlagi dveh enakih, neodvisnih,
asinhrono serijskih V/I vrat. Sprejemnikova primarna serijska vrata posredujejo
navigacijske podatke in sprejemajo ukaze iz OEM (Original Equipment Manufacture)
naprave v formatu NMEA 0183 ali v »Rockwell-ovi« binarni obliki sporočila [14].
Slika 3.1: Rockwell »Jupiter« sprejemnik GPS
3.1.3 Navigacijski načini
Sprejemnik podpira tri različne načine navigacije. Tridimenzionalni (3D),
dvodimenzionalni (2D) in DGPS (Differential Global Positioning System) način [14].
a) Tridimenzionalni navigacijski način (3D)
Ta način navigacije je privzeti način, kadar so na voljo vsaj štirje sateliti. V 3D načinu
sprejemnik izračuna zemljepisno dolţino, zemljepisno širino, nadmorsko višino in čas
informacije satelitskih meritev [14].
b) Dvodimenzionalni navigacijski način (2D)
Potovalni računalnik z GPS Stran 17
Sprejemnik preide v 2D navigacijski način, kadar so na voljo samo trije sateliti. V
primeru, da sprejemnik v 3D načinu uporablja stalno vrednost o nadmorski višini
preide iz 3D v 2D navigacijski način z vsemi informacijami dobljenimi v 3D načnu. V
2D načinu je natančnost horizontalne meritve odvisna od razmerja stalne vrednosti in
dejanske vrednosti nadmorske višine antene. V nasprotnem primeru se horizontalna
natančnost smatra kot napak stalne nadmorske višine[14].
c) DGPS navigacijski način.
Sprejemnik procesira popravek DGPS preko svojih pomoţnih serijskih vrat (port 2). Ti
popravki morajo biti v skladu z standardom RTCM (Radio Technical Commission for
Maritime services), znanim tudi kot RTCM SC-104. Glede na konfiguracijo DGPS je
navigacijsko natančnost mogoče izboljšati v 3D načinu DGPS, saj sprejemnik podpira
natančnosti, opisane v dokumentu RTCM SC-104 [14].
3.1.4 Delovna stanja in zahteve
Sprejemnik uporablja tri delovna stanja, in sicer stanje izklopa, stanje delovanja in stanje
pripravljenosti. Tabela 3.1 ponazarja signalne pogoje in zahteve za vsakega od teh stanj.
Ko je sprejemnik izklopljen, pomeni, da na sprejemnik ni priklopljena napajalna napetost.
Sprejemnik preide v delovno stanje, ko nanj priklopimo +5 ± 0,25 V enosmerne napetosti.
Sprejemnik preide iz delovnega načina v način pripravljenosti, ko bo napetostni signal
»PWRIN« odstranjen, pod pogojem, da bo zunanja enosmerna napetost na voljo na
vhodnem signalu »VBATT«. V tem stanju zunanja napetost omogoča napajanje za SRAM
(Static Random Access Memory) in RTC (Real Time Callaboration). V trenutku preklopa
v to stanje sprejemnik uporabi trenutni čas, vzdrţevan v RTC-ju, kot tudi ključne satelitske
podatke, shranjene v SRAM-u [14].
3.1.5 Vmesnik
Priključni vmesnik sprejemnika prikazuje slika 3.2. V tabeli 3.2 so predstavljeni vsi
priključki konektorja [14].
Potovalni računalnik z GPS Stran 18
Tabela 3.1: Priključitvene zahteve »Jupiter« sprejemnika GPS
Vhodna napetost
Zahteve stanj
Delovno stanje Način pripravljenosti
(5 VDC)
Način pripravljenosti
(3 VDC)
PRVIN napetost +5 ± 0,25 V 0 V ali GND 0 V ali GND
PRVIN (normalno) 195 mA (975 mW) / /
PRVIN (maksimalno) 230 mA (1150 mW) / /
VBATT napetost / +5 ± 0,25 V +3 ± 0,50 V
VBATT tok / 75 μA 40 μA
VBATT moč / 0,38 mW 0,12 mW
Slika 3.2: 2 x 10 priključni vmesnik
Tabela 3.2: Opis priključkov 2 x 10-pinskega vmesnika
PIN IME OPIS PIN IME OPIS
1 PREAMP Napetost predojačevalnika 11 SDO1
2 PWRIN_5 Napajanje + 5 VDC 12 SDI1
3 VBATT Napajanje preko baterije 13 GND ozemljitev
4 N/C / 14 N/C
5 M_RST Master Reset 15 SDI2
6 N/C / 16 GND ozemljitev
7 GPIO2 Izbira NMEA protokola 17 GND ozemljitev
8 GPIO3 ROM privzeti način 18 GND ozemljitev
9 GPIO4 / 19 TMARK
10 GND ozemljitev 20 10kHz
Priključek 1: Napajanje predojačevalnika za aktivno anteno (PREAMP). Največja
napetost je lahko 12 V. Tok ne sme presegati 100 mA. Večina aktivnih anten uporablja
enosmerno napetost 5 V [14].
Priključek 2: Napajanje (PWRIN_5). To je glavno napajanje. Zahteve za enosmerno
napajanje so prikazane v tabeli 3.1 [14].
Potovalni računalnik z GPS Stran 19
Priključek 3: Napajanje preko baterije (VBATT). Ta priključek se uporabi za napajanje
SRAM in RTC. Sprejemnik se samodejno preklopi v način pripravljenosti (VBATT),
ko je glavno napajanje odstranjeno. Ta funkcija omogoča sprejemniku sposobnost
vzdrţevanja podatkov o točnem času, izvoru in uporabi satelitov, ki se shranijo v
SRAM, ko je glavno napajanje odstranjeno. Obstaja pa tudi moţnost vgradnje
shranjevalnega kondenzatorja, kapacitivnosti 0,22 F ter maksimalne napetosti 5,5 V
[14].
Priključek 5: Master Reset (M_RST). Ta signal je potreben za vzpostavitev sistemskega
reseta sprejemnika. Lahko ga poganja neposredno zunanji mikrokrmilnik ali katero
drugo zunanje logično vezje, brez potrebe po uporabi dviţnih uporov. Sistemski reset
sprejemnika se generira tako, da se postavi signal M_RST na logično nizki nivo. Ta
signal se lahko uporablja tudi za zagotovitev nadzora, ko je sprejemnik v delovnem
stanju, ne da bi bilo potrebno sprejemnik izklopiti. Ko je signal M_RST postavljen na
logično nizki nivo, bo sprejemnik prešel v stanje nizke moči (za pribliţno 150 ns). Ko
signal postavimo nazaj na logično visok nivo, sprejemnik prične normalno delovati v
delovalnem načinu [14].
Priključek 7: Izbira protokola NMEA (GPIO2). Sprejemnik ima na voljo dva
sporočilna protokola, s katerima lahko komunicira preko V/I serijskih vrat. To sta
Rockwell-ov binarni sporočilni format in NMEA ASCII (American Standard Code for
Information Interchange) sporočilni format. Ko je ta signal (GPIO2) postavljen na
logično nizki nivo, prične sprejemnik komunicirati v sporočilnem formatu NMEA
(4800 baud/s, brez paritet, 8 podatkovnih bitov in 1 start in stop bit). Ko je signal
postavljen na logično visok nivo, pa sprejemnik prične uporabljati format, določen v
ROM (Read Only Memory) pomnilniku (privzeti način pin 8) [14].
Priključek 8: Privzeti način ROM (GPIO3). Ta signal določa, ali bodo oblike sporočila
privzete iz polnilnika ROM ali pa bodo uporabniško nastavljive shranjene v
SRAM/EEPROM (Electricaly Erasable Programmable Read Only Memory). Ko je ta
signal (GPIO3) postavljen na logično nizki nivo, se uporabljajo tovarniško privzete
vrednosti, shranjene v polnilniku ROM. Ko pa je signal postavljen na logično visok
nivo, sprejemnik začne uporabljati vrednosti, shranjene v SRAM/EEPROM. Privzete
vrednosti za protokol NMEA so 4800 baud/s brez paritete, 8 podatkovnih bitov ter 1
Potovalni računalnik z GPS Stran 20
start in stop bit. Privzete vrednosti za binarni protokol pa so 9600 baud/s, brez paritete,
8 podatkovnih bitov ter 1 start in stop bit (tabela 3.3) [14].
Priključeka 11 in 12: asinhrono serijska V/I vrata (SDO1 in SDI1). Ta dva priključka
se uporabljata za komunikacijo s sprejemnikom preko asinhrono serijskih V/I vrat, kjer
je SDO1 serijski izhod, SDI1 Pa serijski vhod.
Priključki 10, 13, 16, 17 in 18: ozemljitev (GND).
Tabela 3.3: Konfiguracija serijskega vmesnika »Jupiter« sprejemnika GPS
Izbira NMEA
protokola
(priključek 7)
Izbira ROM privzetega
načina (priključek 8) Rezultat
0 0
Izbrani protokol NMEA.
Komunikacijske nastavitve: 4800 baud/s, brez
paritete, 8 podatkovnih bitov, start in stop bit.
Sprejemnik uporabi privzete vrednosti, shranjene v
polnilniku ROM.
0 1
Izbrani protokol NMEA.
Komunikacijske nastavitve: 4800 baud/s, brez
paritete, 8 podatkovnih bitov, start in stop bit.
Sprejemnik izbere vrednosti podatkov, shranjenih
v SRAM ali EEPROM.
1 0
Izbrani binarni protokol.
Komunikacijske nastavitve: 9600 baud/s, brez
paritete, 8 podatkovnih bitov, start in stop bit.
Sprejemnik uporabi privzete vrednosti, shranjene v
polnilniku ROM.
1 1 Obliko sporočila določajo podatki, shranjeni v
SRAM ali EEPROM.
3.2 MULTIMEDIJSKA RAZVOJNA PLOŠČA
Multimedijska razvojna plošča je razširitvena plošča, ki jo je moţno priključiti na
katerikoli Microchipov komplet »PIC32 Starter Kit« [17].
Sprednja stran razvojne plošče (slika 3.3) vključuje:
1. 3,2-palčni (8,1 cm) QVGA ekran z dotično ploščico,
Potovalni računalnik z GPS Stran 21
2. uporabniško-kontrolne LED diode,
3. štirismerni »joystick«,
4. ukazni gumb,
5. priključek za slušalke,
6. izhodni audio priključek,
7. mikrofonski priključek,
8. napajalna LED dioda,
9. vhodno/izhodni razširitveni konektor.
Slika 3.3: Sprednji del Multimedijske razvojne plošče
Zadnja stran razvojne plošče (3.4) vključuje:
1. Solomon Systech SSD1926 grafični procesor,
2. reţa za microSD kartico,
3. priključek za napajanje (9-14 VDC),
4. merilec pospeška in temperaturni senzor (BMA150),
5. 24LC08 EEPROM,
6. 2 MB SPI Flash RAM (Flash Random Access Memory) (SST25VF016),
7. 24-bitni stereo audio kodek (WM8731),
8. CPLD za SPI in Chip Select konfiguracija,
1
2
3 4
5 6 7
8
9
Potovalni računalnik z GPS Stran 22
9. »PIC32 Starter kit« priključek,
10. vhodno/izhodni razširitveni konektor.
3.2.1 Prikazovalnik na dotik
Pravilno delovanje prikazovalnika nadzoruje grafični procesor Solomon System SSD1926.
Prikazovalnik je lahko nastavljen na 8-bitni ali 16-bitni prikaz [17]. Na sliki 3.5 je prikazan
3,2-palčni QVGA TFT prikazovalnik na dotik.
3.2.2 Grafični procesor SSD1926
Grafični procesor SSD1926 je namenjen za naprave, katere zajemajo in procesirajo slike.
Vsebuje enoto za obdelovanje slik in kodek JPEG za dekodiranje zajete slike v JPEG
format. Datoteke se lahko shranjujejo na SD/MMC kartico preko SD vmesnika. Prav tako
pa lahko datoteke, kot so JPEG, dekodira in prikazuje na prikazovalnik preko LCD (Liquid
Crystal Display) vmesnika. Ta vmesnik podpira različne vrste LCD-jev, kot so STN,
CSTN in TFT. SSD1926 LCD krmilnik podpira razločljivost z barvno globino 1, 2, 4, 8,
16 in 32-bitov na slikovno piko (b/p). Za 16 in 32 b/p SSD1926 ponuja grafični
pospeševalnik, kot so virtualni prikaz, zasuk slike, kazalčni zaslon, ipd. [15].
Slika 3.4: Zadnji del Multimedijske razvojne plošče
1 2 3
4 5
6
7 8
9
Potovalni računalnik z GPS Stran 23
Glavne značilnosti SSD1926 procesorja:
JPEG dekoder
a) Moţnost dekodiranja JPEG slik do velikosti 1280 x 1024 [15].
b) JPEG strojni moduli:
- diskretna kosinusna transformacija DCT (Discrete Cosine Transformation) in
inverzna diskretna kosinusna transformacija iDCT (Inverse Discrete Cosine
Transformation). Transformacija DCT se uporablja za kodiranje in dekodiranje
slikovnih in video signalov. To je tehnika, ki izraţa končno zaporedje podatkovnih
točk glede na vsoto kosinusne funkcije, oscilirane na različnih frekvencah, in je
prikazana kot mnoţica podatkovnih točk. iDCT pa je postopek obnove mnoţice
podatkovnih točk [15, 18];
- kvantizacijski izračun – kvantizacija je proces zmanjševanja števila moţnih
podatkovnih točk glede na velikost slike [15, 18];
- cik-cak zaporedje binarnega kodiranja [15];
- shranjevanje s pomočjo Huffmanove tabele [15].
c) JPEG dekoder lahko za ogled slike na LCD prikazovalniku sliko poveča za osem krat
[15].
2D grafični pospeševalnik omogoča:
a) obračanje zaslona in drsno pomikanje po zaslonu;
b) obračanje slik za 0, 90, 180 in 270 stopinj;
c) dva kurzorja s tremi barvami za izbiro preglednosti;
d) utripanje kurzorjev;
e) risanje črt, pravokotnikov in elipse …
LCD grafični krmilnik
Podpira razločljivost z barvno globino 1, 2, 4, 8, 16 in 32 b/p. V 32 b/p načinu je vsaka
pika sestavljena iz 8 bitov rdeče, 8 bitov zelene, 8 bitov modre in 8 bitov alpha kanalom za
nadzor preglednosti slike. V 1, 2, 4 in 8 b/p načinu lahko prikaţemo statično sliko, 2D
grafični pospeševalnik ni na voljo. Poljubna velikost slike je podprta do 512 horizontalne
razločljivosti [15].
LCD vmesnik podpira naslednje LCD prikazovalnike:
a) enobarvne in barvne prikazovalnike STN z 4/8/12/16-bitnim vmesnikom;
b) prikazovalnike TFT z 9/12/18/24-bitnim vmesnikom;
Potovalni računalnik z GPS Stran 24
c) 8-bitni Delta prikazovalnik s »sub-pixel« algoritmom natančnosti;
d) »Smart« LCD prikazovalnik z 8-bitnim MCU vmesnikom preko SPI.
3.2.3 Dotična ploščica
Ploščica, občutljiva na dotik, deluje na principu merjenja upornosti. Z mikrokrmilnikom
analogne napetosti digitaliziramo in na podlagi te informacije točno vemo, na katerem delu
zaslona smo pritisnili ploščico. Ploščica je samostojna in ima na spodnji strani ţe
predvideno lepilo, s katerim jo nalepimo na LCD [19].
Ploščica, občutljiva na dotik, je sestavljena iz dveh ploščic z uporovno plastjo na notranji
strani. Upornost teh plasti ne presega 1 kΩ. Na nasprotni strani ploščice so kontakti, s
katerimi komuniciramo z mikrokrmilnikom preko ploščatega kabla [19].
Slika 3.5: 3.2-palčni QVGA TFT prikazovalnik na dotik
Slika 3.6: Dotična ploščica
Potovalni računalnik z GPS Stran 25
Postopek določanja koordinat točke dotika razdelimo na določitev koordinat X in Y (slika
3.6). Za določanje koordinate X je potrebno povezati "levi" kontakt površine A na maso,
"desni" kontakt pa na napajalno napetost. To povzroči napetostni delilnik, ki ob pritisku na
ploščico odčita napetost preko kontakta "spodaj", na površini B. Napetost je v območju 0
V in napajalne napetosti. Če je točka pritiska na ploščico na "levi" strani, se bo napetost
pribliţevala 0 V in obratno, če je točka pritiska na "desni" strani, se bo napetost
pribliţevala napajalni napetosti. Za določanje koordinate Y pa je potrebno povezati
"spodnji" kontakt površine B na maso, "zgornji" kontakt pa na napajalno napetost. V tem
primeru se napetost odčita na "levem" kontaktu površine A. Kontakt "spodnje" površine B
in kontakt na "levi" strani površine A sta povezana na A/D konektor mikrokrmilnika. Z
merjenjem napetosti na teh kontaktih se dodeljujejo koordinate X, Y pritisnjene točke
(slika 3.7) [19].
Slika 3.7: Princip delovanja dotične ploščice.
3.3 TESTNA PLOŠČA
Uporabili smo testno ploščo Microchip »PIC32 Ethernet Starter Kit«, ki vsebuje 32-bitni
mikrokrmilnik PIC32MX795F512L, z 72 MHz jedrom MIPS32M4K, ki omogoča 1,5
DMIPS/MHz. Mikrokrmilnik ponuja do 512 kB bliskovnega pomnilnika in 32 kB RAM
pomnilnika [20]. Na sliki 3.8 je prikazana sprednja in zadnja stran testne plošče.
Sprednja stran vsebuje:
1. 32-bitni mikrokrmilnik PIC32MX795F512L;
2. mikrokrmilnik PIC32MX440F512H za prenos podatkov preko USB (Universal Serial
Bus);
Potovalni računalnik z GPS Stran 26
3. zeleni napajalni LED (Light Emitting Diode) indikator;
4. 8 MHz kristal;
5. USB priključek, tipa mini-A, za komunikacijo in prenos podatkov;
6. oranţni LED indikator za prenos podatkov;
7. potisna stikala za uporabniško definirane vhode;
8. LED diode za uporabniško definirane vhode;
9. USB priključek, tipa A, za komunikacijo in prenos podatkov;
10. »Jumper« za določitev načina dela;
11. RJ-45 Ethernet vrata;
12. Ethernet merilnik hitrosti 10/100;
13. 50 MHz Ethernet PHY oscilator;
14. 32 kHz oscilator;
15. USB OTG napajalnik za napajanje PIC32 USB aplikacije.GOL.
Slika 3.8: Sprednja in zadnja stran Microchip »PIC32 Ethernet Starter Kit«
Potovalni računalnik z GPS Stran 27
Zadnja stran vsebuje:
1. +3,3 V regulator napetosti za napajanje testne plošče preko USB ali razširitvene
plošče;
2. konektor za priklop razširitvene plošče;
3. USB, tipa micro AB, za priklop USB in OTG naprave;
4. zunanji Ethernet PHY.
3.3.1 Mikrokrmilnik PIC32MX795F512L
Mikrokrmilnik PIC32MX temelji na 32-bitnem procesorskem jedru M4K. Vsi procesorji
druţine PIC32MX uporabljajo visoko zmogljivo RISC (Reducet Instruction Set Core) CPU
(Control Processing Unit) in so programljivi v 32 in 16-bitnem načinu [21]. Slika 3.9
prikazuje blok diagram mikrokrmilnika PIC32MX.
PIC32 uporablja koncept, imenovan gospodarji na vodilu (Bus Master). Gospodarji na
vodilu vsebujejo nabor modulov, kateri lahko berejo ali pišejo transakcije v druge module.
Na primer, CPU lahko bere in piše v pomnilnik SRAM ali v katerokoli drugo periferno
napravo. Podobno lahko krmilnik DMA (Direct Memory Access) bere ali piše v katerokoli
periferno napravo na vodilu. Gospodarji na vodilu so CPU, ICD (International Code
Designator), USB, DMA in delujejo z enako hitrostjo kot CPU. Vsi gospodarji, razen CPU,
podpirajo sposobnost DMA krmilnika za samostojno opravljanje bralnih in pisalnih
transakcij. Prav tako lahko prenašajo V/I podatke brez pomoči CPU. Ne morejo pa
dostopati do CPU registrov. Samo CPU lahko dostopa do svojih registrov [21].
SYSCLK in PBCLK
Periferne enote, kot so predpomnilnik, USB, DMA, SRAM, prekinitve in V/I vrata
uporabljajo SYSCLK. Te periferije uporabljajo enako hitrost kot CPU, kar omogoča, da se
izvedejo v enem ciklu, medtem ko SPI (Serial Peripheral Interface bus), UART (Universal
Asynchronous Recive Transmitter), ADC (Analog to Digital Converter), RTCC (Real
Time Clock and Calender), I2C, ipd. uporabljajo PBCLK. Točna vrednost PBCLK je
določena z nastavitvijo perifernega mostu. PBCLK lahko deluje pri 1:1, 1:2, 1:4 in 1:8
hitrosti SYSCLK. Te enote so počasne in ne zahtevajo hitre odzivnosti podatkov. Če je
razmerje PBCLK z SYSCLK 1:1, bodo CPU in drugi gospodarji na vodilu dostopali do
PBCLK perifernih enot v času enega cikla. Če pa je razmerje 1:8, pa bodo potrebovali 8
Potovalni računalnik z GPS Stran 28
SYSLCK za dostop do PBCLK perifernih enot. Kadar CPU piše na SFR (Special Function
Register) pri razmerju 1:8, bo matrično vodilo prevzelo operacijo pisanja, ki se izvede v
času enega cikla, vendar bo dovolilo izvajanje naslednje operacije šele po izteku 8 ciklov.
Ko pa CPU izvaja operacijo branje, CPU čaka na natančno vrednost PBCLK delilnika in
nadaljuje operacijo po njegovem izteku [22].
Slika 3.9: PIC32MX blok diagram
Prekinitve
Prekinitev pri PIC32MX se lahko izvaja v samostojnem ali v več-vektorskem načinu. V
samostojnem načinu vse prekinitve uporabljajo isti vektor (slika 3.10). Pri več-vektorskem
182-bit
JTAG/BSCAN
US
B
Matrično vodilo
Prefetch
predpomnilnik
RAM
pomnilnik
Bliskovni
pomnilnik
Bli
skov
ni
krm
iln
ik
PMP/PSP
ADC
Generator
urinih
impulzov
RTCC
Prekinitveni krmilnik
DM
AC
ICD
PIC32MX CPU
DS
Priključki
Časovniki
Vhodno
zajemanje
I2C
UART
SSP/SPI
Periferni most
Dvojna
primerjava
Izodnja
primerjava
Generator
RESET
INT
IS
EJTAG
Potovalni računalnik z GPS Stran 29
načinu pa je na voljo 64 vektorjev. Vsak vektor ima do 8 različnih prioritetnih nivojev.
Vrednost 7 kaţe na najvišjo proriteto, 1 pa označuje najniţjo. Vrednost 0 nakazuje, da je
vektor onemogočen. Tako lahko določimo en prioritetni nivo za več kot en prekinitveni
vektor. Poleg privzete prioritete ima lahko vsak vektor do 4 podprioritetne nivoje.
Podprioritete določajo vrstni red, po katerem se bodo prekinitve izvajale, zlasti če obstaja
več kot ena prekinitev istega prioritetnega nivoja [23].
Slika 3.10: PIC32 prekinitveni način
UART
Univerzalni asinhroni sprejemnik in oddajnik (UART) je asinhronski komunikacijski
kanal, ki komunicira s perifernimi napravami preko RS-232, RS-485 in IrDA [24]. Modul
UART vključije »Baud Rate Generator« za določanje hitrosti komunikacije. Register
UxBRG nadzoruje 16-bitni časovnik. Najpogostejša oblika podatkov je 8 bitov, brez
paritete in 1 stop bitom, označen kot 8, N, 1. Število podatkovnih bitov, paritete in stop
bitov se določi v PDSEL<1:0> (UxMODE<2:1>) in ST"SEL (UxMODE<0>) registru. Za
pravilno komunikacijo mora biti nastavljen isti format podatkov in hitrost prenosa tako na
periferni napravi kot tudi na mikrokrmilniku. Komunikacijo UART omogočimo s
postavitvijo bita ON (UxMODE<15>), RXEN (UxSTA<12>) in TXEN (UxSTA<10>)
(slika 3.12). Ko je komunikacija omogočena, sta UxTX in UxRX priključka konfigurirana
kot izhod in vhod. Podatki se prejemajo preko priključka UxRX. Po vzorčenju signala
UxRX se s stop bitom prejeti podatek UxRSR prenese v vmesni pomnilnik FIFO (First In
First Out). Sprejem je omogočen z nastavitvijo bita RXEN (UxSTA<12>). Ko je FIFO
pomnilnik poln oziroma ko register UxRSR prejme vse znake, se bit OERR (UxSTA<1>)
postavi na ena. Podatki se hranijo v registru UxRSR, vendar se bo prenos v FIFO
5
3
1
Po
dp
rio
rite
tni
niv
oji
1
4 7
6
4
2
2
0
Pri
ori
tetn
i n
ivo
ji
62
63
0
Vek
torj
i
3
2
Potovalni računalnik z GPS Stran 30
pomnilnik nadaljeval šele po izbrisu bita OERR, zato je potrebno iz pomnilnika FIFO vse
znake najprej prebrati in nato počistiti OERR bit. S tem resetiramo pomnilnik FIFO in so
tako vsi predhodno prejeti podatki izgubljeni [24].
Slika 3.11: Blok diagram UART sprejemnika
3.4 PROTOTIP POTOVALNI RAČUNALNIK
Prototip potovalnega računalnika je sestavljen iz testne ploščice »PIC 32 starter kit«,
multimedijske razvojne plošče in Rockwell »Jupiter« sprejemnika GPS (slika 3.12 in slika
3.13). Prototip deluje na napetosti +5 V. Na priključka 1 in 2 sprejemnika GPS smo
BLCK
/ UxRTS
UxCTS
/ UxRTS
UxRTS
/ UxRTS
UxCTS
/ UxRTS
BCLK/UxRTS
/ UxRTS
UEN1
Izbira
UEN
UEN0
UxMODE UxSTA
UxRSR
Podatkovno vodilo
/ UxRTS
UxRXIF
/ UxRTS
UxTX
/ UxRTS
UxRX
/ UxRTS
RX8 FIFO pomnilnik
Predpomnilnik sprejemnika:
- ustvari zastavice;
- ustvari prekinitev;
- preusmeri podatkovne znake.
- zaznavanje start bita
- preverjanje paritete
- zaznavanje stop bita
- premik generator ure
1
0
UxRSR
Potovalni računalnik z GPS Stran 31
priključili napetost +5 V. Priključek 1 je napajanje aktivne antene, priključek 2 pa
napajanje sprejemnika. Z dviţnim uporom 10 kΩ postavimo priključek 8 na logično visok
nivo. S tem omogočimo uporabo podatkov shranjenih v polnilniku SRAM/EEPROM. To
so podatki o zadnjih koordinatah, datumu, času, satelitih, itd. Priključke 7, 10, 13, 16, 17 in
18 so priključeni na ozemljitev. S priključitvijo priključka 7 na ozemljitev izberemo
protokol NMEA. Priključek 11 in 12 pa se uporabljata za komunikacijo sprejemnika z
mikrokrmilnikom (slika 3.13).
Slika 3.12: Razstavljen prototip potovalnega računalnika GPS
Slika 3.13: Sestavljen prototip potovalnega računalnika GPS
Potovalni računalnik z GPS Stran 32
Slika 3.14: Vezava sprejemnika GPS
antena GPS
UxRX
UxTX
GND
5 V
10 kΩ
PIC 32 Rockwell »Jupiter«
sprejemnik GPS
1 V (antena)
2 V (sprejemnik)
8 izbira ROM
7 izbira NMEA
10 ozemljitev
13 ozemljitev
16 ozemljitev
17 ozemljitev
18 ozemljitev
11 serijski izhod
12 serijski vhod
Potovalni računalnik z GPS Stran 33
4 PROGRAMSKA OPREMA
Za razvoj programske opreme smo izbrali programski jezik ANSI (American National
Standards Institute) C in razvojno okolje MPLAB X IDE. Za izdelavo vizualne podobe
zaslona prikazovalnika smo uporabili dodatek »Graphics Display Designer« za MPLAB X.
Za pravilno delovanje dodatka je bilo potrebno namestiti najnovejšo različico aplikacijske
knjiţnice.
4.1 Razvojno okolje MPLAB X IDE
MPLAB X IDE je razvojno okolje, ki podpira razvoj aplikacij za mikrokrmilnike PIC in
dsPIC [16]. Program je brezplačen in je na voljo na spletni strani proizvajalca Microchip.
Slika 4.1 prikazuje razvojno okolje MPLAB X IDE.
Slika 4.1: Razvojno okolje MPLAB X IDE
Potovalni računalnik z GPS Stran 34
4.1.1 Grafična knjiţnica
Na Microchipovi spletni strani je brezplačno na voljo Microchipova aplikacijska knjiţnica
MLA (Microchip Libraries for Applications). MLA je zbirka več knjiţnic. Med njimi je
tudi grafična knjiţnica, ki smo jo uporabili pri razvoju programske opreme. Knjiţnice so
zapisane v obliki izvorne kode, kar uporabniku omogoča laţje načrtovanje strojne in
programske opreme za izdelavo aplikacije.
Knjiţnica je optimizirana za 16- in 32-bitne mikrokrmilnike in je namenjena za izdelavo
primitivnih grafičnih objektov, kot so črte, elipse, trikotniki ter za napredne grafične
objekte, kot so gumbi, drsniki, merilniki, ipd.
Knjiţnica omogoča enostavno vključevanje vhodnih naprav preko uporabniškega
vmesnika in podpira naslednje funkcije [27]:
1. 2D objekti, kot so črte, krogi, napisi, trikotniki, ipd.;
2. 3D objekti, kot so gumbi, merilniki, potrditvena polja, polja za vnos, drsniki, ipd.;
3. različno tipografijo in podporo več jezikov;
4. uporabniški vmesnik za zaznavanje dotika, tipkovnico, miško, ipd.;
5. slike, animacije.
Slika 4.2: Struktura Microchipove grafične knjiţnice
Uporabniški vmesnik
(miška, tipkovnica, dotična ploščica, ipd.)
Aplikacijski sloj
Sloj grafičnih objektov (GOL)
(gumb, drsnik, merilnik, ipd.)
Gonilniki prikazovalnika (DDD)
Sloj primitivnih grafičnih objektov
(črta, napis, trikotnik, ipd.)
Grafični prikazovalnik
Potovalni računalnik z GPS Stran 35
Na sliki 4.2 je prikazana struktura grafične knjiţnice. Program se nahaja v aplikacijskem
sloju, ki uporablja grafično knjiţnico. Sloj grafičnih objektov GOL (Graphics Objects
Layer) vsebuje napredne grafične objekte, do katerih dostopamo preko uporabniškega
vmesnika, ki sprejema sporočila, poslana iz aplikacije. Ta vmesnik podpira različne
vhodne naprave, kot so tipkovnica, miš, dotična ploščica, ipd. DDD (Display Divece
Driver) pa vsebuje gonilnike prikazovalnikov [27]. Osnovno uporabo grafične knjiţnice
prikazuje slika 4.3.
Slika 4.3: Osnovna uporaba grafične knjiţnice
Funkcija InitGraph (slika 4.3, vrstica 1) postavi kazalec pozicije X in Y na nič, ter
zaslon inicializira na črno barvo . Funkcija GOLCreateScheme (slika 4.3, vrstica 3)
določi stil uporabljenih objektov. Vsi objekti uporabljajo stilno shemo, s pomočjo katere
določimo barve objekta ter tipografijo uporabljenih črk. Stilne komponente objektov so
prikazane na sliki 4.4 [27].
Obe funkciji, InitGraph in GOLCreateScheme, izvedemo s klicem funkcije
GOL_Init (slika 4.3, vrstica 2) [27].
grafična inicializacija
ustvari stil sheme
ustvari objekt
risanje objekta
vhodne naprave
proces delovanja
GOLinit()
initGraph()
GolCreateScheme()
ObjCreate(,,)
GOLDraw()
Sporočilna struktura
GOLMsg()
2
2
.
4
.
5
.
6
.
7
.
1
.
3
.
Potovalni računalnik z GPS Stran 36
Slika 4.4: Stilne komponente objekta
Za tvorbo objektov je potrebno klicati funkcijo ObjCreate (slika 4.3, vrstica 4). Ta
funkcija zastopa objekte, kot so gumb, drsnik, merilnik, edit box, ipd. Sika 4.5 pa prikazuje
postopek tvorbe objekta gumb ter »edit box« [27].
Slika 4.5: Tvorba objekta gumb, »edit box«
TextColorDisabled
ColorDisabled
TextColor0
Color0
EmbossLtColor
EmbossDkColor
EmbossDkColor temna barva za 3D efekt objekta
EmbossLtColor svetla barva za 3D efekt objekta
TextColor0 barva teksta ki jo uporablja objekt
TextColorDisabled barva teksta ko je objekt izbran
Color0 barva objekta
ColorDisabled barva objekta ko je izbran
1 BtnCreate
2 BTN_3, //identifikacijsko ime objekta
3 10, //kazalec pozicije gumba levo
4 48, //kazalec pozicije gumba zgoraj
5 155, //kazalec pozicije gumba desno
6 127, //kazalec pozicije gumba spodaj
7 BTN_DRAW, //stanje objekta - risanje
8 NULL, //brez bitmap slike
9 "Poraba", //ime oziroma napis gumba
10 gumb1 //ime stilne sheme
11 ;
12 EbCreate
13 EDB_66, //identifikacijsko ime objekta
14 169, //kazalec pozicije gumba levo
15 127, //kazalec pozicije gumba zgoraj
16 256, //kazalec pozicije gumba desno
17 147, //kazalec pozicije gumba spodaj
18 EB_DRAW, //stanje objekta - risanje
19 " ", //napis objekta
20 16, //velikost pisave
21 editbox //ime stilne sheme
22 ;
Potovalni računalnik z GPS Stran 37
BtnCreate in EbCreate (slika 4.5, vrstici 1 in 12) zastopata funkcijo ObjCreate,
kjer Btn zastopa objekt gumb, Eb pa objekt »edit box«. Vsak od objektov v knjiţnici ima
svojo ObjCreate funkcijo. Ta funkcija vrača kazalec na novo narejen objekt. Tvorjene
objekte narišemo z uporabo funkcije GOLDraw (slika 4.3, vrstica 5), ki preveri stanje
risanja objekta. Spremembe stanja objekta lahko spreminjamo preko vhodnih naprav,
katere primerjamo s klicem funkcije GOLMsg (slika 4.3, vrstica 7). Če ustreza pogojem, ta
spremeni stanje objekta in zopet kliče funkcijo GOLDraw. Zunanje naprave komunicirajo z
objekti s pomočjo GOL_MSG sporočilne strukture. Slika 4.6 prikazuje osnovno strukturo
komunikacije, kjer polje type (slika 4.6, vrstica 2) določa tip vhodne naprave, ki je v
našem primeru dotična ploščica, medtem ko polje event (slika 4.6, vrstica 3) določa tip
dogodka. Polji type in event določata, kako bosta param1 in param2 (slika 4.6,
vrstici 4 in 5) interpretirana. Primer: ko pritisnemo na ekran, se podatki dotika prenesejo v
sporočilno strukturo GOL_MSG, ki jo ta prenese v knjiţnico sporočilne funkcije GOLMsg.
Objekt z X in Y pozicijama bo spremenil svoje stanje glede na prej nastavljeno stanje in
dogodek. To se stori s klicem funkcije GOLMsgCallback. Ta funkcija se kliče za vsako
novo sporočilo objekta (primer ali je gumb pritisnjen ali ne). Slika 4.7 prikazuje potek
izvajanja sporočilne strukture [27].
Slika 4.6: Sporočilna struktura GOL_MSG
4.1.2 Grafična zasnova zaslona
Grafični zasnova zaslona GDD je dodatek za MPLAB, ki omogoča uporabniku enostaven
dostop do objektov, katere ţeli uporabiti na zaslonu prikazovalnika. Na osnovi pripravljene
grafične zasnove se generira izvorna koda v jeziku C, ki se avtomatsko prenese v projekt
1 typedef struct
2 BYTE type;
3 BYTE event;
4 int param1;
5 int param2;
6 GOL_MSG;
type → TYPE_TOUCHSCREEN
event → možni dogodki so naslednji:
- EVENT_INVALID
- EVENT_MOVE
- EVENT_PRESS
- EVENT_RELEASE
parma1 → pozicija x-koordinate dotika
parma2 → pozicija y-koordinate dotika
Potovalni računalnik z GPS Stran 38
MPLAB X. GDD ustvari številne datoteke. Med njimi tudi datoteko GDD_Screen.c, kjer
so v obliki programske kode zapisani grafični zasloni. V GDD_Screen.c datoteki najdemo
stavke oziroma imena, ki se uporabljajo na zaslonu. To so predvsem imena objektov in
statični napisi (slika 4.8, vrstice od 1 do 13). V funkciji Createscreen1 so zapisane
stilne komponente tvorjenega objekta ter njihove pozicije na zaslonu (slika 4.8, vrstice od
18 do 23, slika 4.9, vrstice od 24 do 50). Funkcija CreatePrimitivesForscreen1
pa je namenjena tvorjenju primitivnih objektov, uporabljenih na zaslonu (slika 4.9, vrstice
od 54 do 64).
GDD X se lahko uporablja tudi kot samostojna aplikacija. V samostojnem načinu GDD X
prav tako ustvari C kodo, vendar jo shrani v mapo, ki jo lahko v projekt MPLAB X
vključimo ročno.
Slika 4.7: Potek izvajanja sporočilne strukture
Slika 4.8: Datoteka GDD_Screen.c -1-
1 const XCHAR screen1_BTN_1text[ ] = "Potrdi";
2 const XCHAR screen1_STE_2text[ ] = "Vpisi stanje stevca vozila";
3 const XCHAR screen1_EDB_218text[ ] = " ";
4 const XCHAR screen1_xstevecxtext[ ] = " ";
5 const XCHAR screen2_STE_9text[ ] = " ";
6 const XCHAR screen2_STE_200text[ ] = " ";
7 const XCHAR screen2_STE_8text[ ] = " ";
8 const XCHAR screen2_BTN_3text[ ] = "Poraba";
9 const XCHAR screen2_BTN_4text[ ] = "Hitrost";
10 const XCHAR screen2_BTN_5text[ ] = "Ura";
11 const XCHAR screen2_BTN_6text[ ] = "Koordinate";
12 const XCHAR screen2_BTN_7text[ ] = "Stevec";
13 const XCHAR screen2_xmenuextext[ ] = " ";
.
.
.
18 void Createscreen1(void)
19
20 GOLFree();
21 SetColor(RGBConvert(0, 0, 0));
23 ClearDevice();
24
25 if(gumb2 != NULL) free(gumb2);
26 gumb2 = GOLCreateScheme();
27
28 gumb2->Color0 = RGBConvert(0, 0, 0);
29 gumb2->Color1 = RGBConvert(0, 0, 0);
30 gumb2->TextColor0 = RGBConvert(200, 204, 248);
31 gumb2->TextColor1 = RGBConvert(248, 252, 248);
32 gumb2->EmbossDkColor = RGBConvert(0, 0, 0);
33 gumb2->EmbossLtColor = RGBConvert(0, 0, 0);
34 gumb2->TextColorDisabled = RGBConvert(248, 252, 248);
35 gumb2->ColorDisabled = RGBConvert(208, 224, 240);
36 gumb2->CommonBkColor = RGBConvert(208, 236, 240);
37 gumb2->pFont = (void*)&CordiaUPC_26;
GLAVNI
PROGRAM
Aplikacijski sloj
GOLMsgCallback(,,,)
GOLMsg( )
Sloj grafičnih objektov (GOL)
Potovalni računalnik z GPS Stran 39
Slika 4.9: Datoteka GDD_Screen.c -2-
4.2 PROGRAMSKA KODA
Uporabniški vmesnik potovalnega računalnika z GPS temelji na uporabi desetih zaslonov,
ki smo jih tvorli s pomočjo programskega dodatka GDD. Vsak zaslon ima svojo funkcijo, s
katero z gumbi, kot so »Potrdi«, »Vnesi«, »Nazaj«, omogočimo uporabniku celoten nadzor
nad napravo. Slika 4.10 prikazuje osnovno delovanje zaslonov potovalnega računalnika.
Po vklopu se najprej izriše zaslon 1, na katerem se izpiše »Vpiši stanje števca ter pritisni
tipko Potrdi«. S pritiskom na polje »EditBox« preidemo iz zaslona 1 na zaslon 2, kjer se
24
25 if(gumb2 != NULL) free(gumb2);
26 gumb2 = GOLCreateScheme();
27
28 gumb2->Color0 = RGBConvert(0, 0, 0);
29 gumb2->Color1 = RGBConvert(0, 0, 0);
30 gumb2->TextColor0 = RGBConvert(200, 204, 248);
31 gumb2->TextColor1 = RGBConvert(248, 252, 248);
32 gumb2->EmbossDkColor = RGBConvert(0, 0, 0);
33 gumb2->EmbossLtColor = RGBConvert(0, 0, 0);
34 gumb2->TextColorDisabled = RGBConvert(248, 252, 248);
35 gumb2->ColorDisabled = RGBConvert(208, 224, 240);
36 gumb2->CommonBkColor = RGBConvert(208, 236, 240);
37 gumb2->pFont = (void*)&CordiaUPC_26;
38
39 BUTTON *pBTN_1;
40 pBTN_1 = BtnCreate( BTN_1, //name
41 226, //left
42 163, //top
43 291, //right
44 217, //bottom
45 0, //radius
46 BTN_DRAW, //state
47 NULL, //bitmap
48 (XCHAR*)screen1_BTN_1text, //text
49 gumb2 //scheme
50 );
.
.
.
54 void CreatePrimitivesForscreen2(void)
55
56 SetLineType(0);
57 SetLineThickness(0);
58 SetColor(RGBConvert(248, 252, 248));
59 while(!Line( 7, //x1
60 37, //y1
61 306, //x2
62 37 //y2
63 )
64 );
.
.
.
Potovalni računalnik z GPS Stran 40
izriše polje številk za vnos podatka. Po vnešenem podatku o stanju števca vozila s tipko
»Vnesi« preidemo nazaj na zaslon 1, kjer s tipko »Potrdi« vnos potrdimo in preidemo na
zaslon »Glavni meni«. Na zaslonu se poleg ure in datuma izrišejo še tipke »Poraba«,
»Hitrost«, »Ura«, »Koordinate« ter »Števec«. V primeru slabega signala sprejemnika se na
zgornjem delu zaslona izpiše »NI SIGALA«. S pritiskom tipke »Poraba« preidemo na
zaslon 3, katerega namen je spremljanje porabe vozila. S pritiskom na polje »EditBox«
preidemo na zaslon 7, katerega namen je vnos podatkov o natočenem gorivu (zaslon 8) ter
o ceni natočenega goriva (zaslon 9). Po vnosu teh dveh podakov s tipko »Vnesi« preidemo
nazaj na zaslon 3, kjer se izpiše datum vnosa, trenutno stanje števca, natočeno gorivo v
litrih ter povprečna poraba vozila. S pritiskom tipke »Hitrost« na zaslonu »Glavni meni«
preidemo na zaslon 4, katerega namen je izpis trenutne hitrosti.
4.2.1 Povezava s sprejemnikom GPS
Za pridobivanje podatkov iz sprejemnika GPS, je bilo potrebno v programu uporabiti
prekinitveno rutino UART. Ta sproţi prekinitev, ko dobi informacijo, da je na voljo nov
podatek. Vsak prejeti znak se shrani v predpomnilnik za nadaljnjo obdelavo. Na začetku
programa je bilo potrebno določiti hitrost komunikacije UART, ki smo jo nastavili na
4800, saj sprejemnik komunicira na hitrosti 4800 baud/s, ter velikost predpomnilnika za
shranjevanje prejetih znakov, ki smo ga nastavili na 120. S tem smo se izognili
prekoračitvi predpomnilnika, saj so stavki NMEA lahko dolgi do 82 znakov.
#define UART1_BAUD (4800)
#define RX_BUFFER_SIZE 120
UART smo pravilno nastavili v funkciji main. PIC32 ima do šest komunikacijskih
kanalov UART, med njimi so tudi kanali UART z moţnostjo rokovanja s podatki. Z
ukazom UARTConfigure določimo uporabo komunikacijskega kanala UART1, z
UART_ENABLE_PINS_TX_RX_ONLY pa določimo osnovno delovanje kanala UART1
brez moţnosti rokovanja s podatki (slika 4.11, vrstica 5). Ko je polnilnik FIFO poln se
izvede prekinitev. Z ukazom UARTSetFifoMode določimo, kdaj naj se prekinitev
izvede. V našem primeru je to, za vsak na novo prejet podatek. S tem se izognemo
prekoračitvi polnilnika FIFO (slika 4.11, vrstica 7).
Potovalni računalnik z GPS Stran 41
Slika 4.10: Osnovno delovanje zaslonov potovalnega računalnika
Zaslon 9 Zaslon 8 Zaslon 7
Zaslon 6 Zaslon 5 Zaslon 4 Zaslon 3
Glavni meni Zaslon 2
Zaslon 1
EditBox Potrdi Vnesi
Poraba Hitrost Ura Koordinate
Vklop
Števec
Nazaj
EditBox Litri
EUR
Vnesi
Nazaj Nazaj Nazaj
Vnesi Vnesi
Potovalni računalnik z GPS Stran 42
Z ukazom UARTSetLineControl določimo komunikacijski protokol, ki ga zahteva
sprejemnik. Ta je 8-bitov, brez paritete in en stop bit (slika 4.11, vrstica 9). Z ukazom
UARTSetDataRate pa določimo hitrost komunikacije, ki smo jo pred tem nastavili na
4800 baud/s (slika 4.11, vrstica 11). Z ukazom UARTEnable omogočimo komunikacijo
UART1. Z ukazom INTEnable pa določimo, kdaj saj se prekinitev izvaja. V našem
primeru jo izvede priključek U1Rx za vsak prejeti podatek (slika 4.11, vrstica 15).
Potrebno je bilo nastaviti še prioritete UART ISR (slika 4.11, vrstici 17 in 18), prekinitveni
sistem na več-vektorski način (slika 4.11, vrstica 20), ter na koncu klicati funkcijo za
omogočanje prekinitve (slika 4.11, vrstica 22).
Slika 4.11: Konfiguracija UART1
V __ISR(_UART1_VECTOR,ipl2)IntUart1Handler prekinitveni funkciji
določimo spremenljivko SerRx (slika 4.12, vrstica 8), v katero shranjujemo vsak na novo
prejeti znak. Ker nas zanimajo le vrednosti podatkov GPRMC stavka NMEA, je bilo
potrebno določiti začetek in konec stavka NMEA. Zato smo vsak prejeti znak primerjali z
$GPRMC znaki, ter vsebino stavka, s pomočjo RxCtr števca, shranjevali v pomnilnik
rx_buffer. Števec RxCtr ob vsakem prejetem znaku povečujemo za ena (slika 4.12,
vrstica 9) oziroma ga postavimo na nič (slika 4.12, vrstica 16) v primeru, ko prejeti znak ni
enak znaku $, G, P, R, M, C, ali v primeru prekoračitve predpomnilnika
1 mPORTFClearBits(BIT_8);
2 mPORTFSetPinsDigitalOut(BIT_8);
3 mPORTFSetPinsDigitalIn(BIT_2);
4
5 UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY);
6
7 UARTSetFifoMode(UART1,UART_INTERRUPT_ON_TX_NOT_FULL|UART_INTERRUPT_ON_RX_NOT_EMPTY);
8
9 UARTSetLineControl(UART1,UART_DATA_SIZE_8_BITS|UART_PARITY_NONE|UART_STOP_BITS_1);
10
11 UARTSetDataRate(UART1, GetPeripheralClock(), UART1_BAUD);
12
13 UARTEnable(UART1,UART_ENABLE_FLAGS(UART_PERIPHERAL|UART_RX|UART_TX));
14
15 INTEnable(INT_U1RX, INT_ENABLED);
16
17 SetPriorityIntU1(UART_INT_PR2);
18 SetSubPriorityIntU1(UART_INT_SUB_PR0);
19
20 INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
21
22 INTEnableInterrupts();
Potovalni računalnik z GPS Stran 43
RX_BUFFER_SIZE. Z zadnjim prejetim znakom GPRMC stavka CR (Carriage Return)
(oziroma 0x0d heksadecimalno), vsebino pomnilnika rx_buffer prestavimo v
pomnilnik gps_buffer, ki ga kasneje uporabimo za obdelavo prejetih podatkov (slika
4.12, vrstice od 52 do 56).
Slika 4.12: Prekinitvena funkcija
1 void __ISR(_UART1_VECTOR, ipl2)IntUart1Handler(void) 2
3 unsigned int SerRx;
4 RSFlag=0;
5 if (mU1RXGetIntFlag())
6
7 IFS0bits.U1RXIF = 0;
8 SerRx = ReadUART1();
9 RxCtr++;
10 switch (RxCtr)
11
12 case 0:
13 if (SerRx=='$')
14 rx_buffer[RxCtr]=SerRx;
15 else
16 RxCtr=0;
17 break;
18 case 1:
19 if (SerRx=='G')
20 rx_buffer[RxCtr]=SerRx;
21 else
22 RxCtr=0;
23 break;
24 case 2:
25 if (SerRx=='P')
26 rx_buffer[RxCtr]=SerRx;
27 else
28 RxCtr=0;
29 break;
30 case 3:
31 if (SerRx=='R')
32 rx_buffer[RxCtr]=SerRx;
33 else
34 RxCtr=0;
35 break;
36 case 4:
37 if (SerRx=='M')
38 rx_buffer[RxCtr]=SerRx;
39 else
40 RxCtr=0;
41 break;
42 case 5:
43 if (SerRx=='C')
44 rx_buffer[RxCtr]=SerRx;
45 else
46 RxCtr=0;
47 break;
48
49 rx_buffer[RxCtr]=SerRx;
50 if (RxCtr == (RX_BUFFER_SIZE-1))
51 RxCtr = 0;
52 if ((SerRx == 0x0d)&&(RxCtr != 0))
53
54 memmove (gps_buffer,rx_buffer,RxCtr);
55 RSFlag = 1;
56
57 mU1RXClearIntFlag();
58
59
Potovalni računalnik z GPS Stran 44
4.2.2 Pomoţne funkcije
Namen uporabe pomoţnih funkcij je, da program razdelimo na več manjših
podprogramov. Vsak podprogram oziroma pomoţno funkcijo obravnavamo posebej. S tem
omogočimo boljšo preglednost programa. Funkcije so lahko napisane v poljubnem vrstnem
redu, v eni sami ali več izvornih datotekah. Klic funkcij je lahko kjerkoli v programu.
Funkcija razcleni_nmea se uporablja za razčlenjevanje stavka NMEA. Z ukazom
strtok(niz,",") razčlenimo stavek NMEA (slika 4.14) na podatke, ki so med seboj
ločeni z vejicami. Stavek NMEA je zapisan v formatu ASCII. Da lahko dobljene podatke
pravilno obdelujemo, jih je potrebno pretvoriti v ustrezno obliko. Podatek o uri (slika 4.14,
vrstice od 7 do 9) in datumu (slika 4.14 vrstice od 23 do 25) pretvorimo z ukazom atoi
(ASCII to intiger). Podatek o zemljepisni širini (slika 4.14, vrstice od 11 do 13),
zemljepisni dolţini (slika 4.15, vrstice od 15 do 17) in hitrosti (slika 4.14, vrstice od 19 do
21) pa pretvorimo z ukazom atof (ASCII to float).
IzpisUra funkcijo kličemo pri izpisu časovnih pasov na zaslonu 5 za izpis ure. Razpon
časovnega pasu je od UTC-12 do UTC+14. Na zaslonu se izpiše čas za Slovenijo, ki je v
časovnem pasu UTC+1 (v poletnem času UTC+2), Sydney (Avstralija) UTC+11 (v
zimskem času UTC+10), Shanghai (Kitajska) UTC+8, London (Velika Britanija) UTC (v
poletnem času UTC+1), Moskva (Rusija) UTC+4, Tokyo (Japonska) UTC+9 in Kairo
(Egipt) UTC+2. Slika 4.13 prikazuje zaslon z izpisi točnega časa.
Slika 4.13: Zaslon z izpisom točnega časa
Potovalni računalnik z GPS Stran 45
Slika 4.14: Funkcija za razčlenjevanje stavka NMEA
Stavek GPRMC vsebuje podatek o UTC času. S klicem funkcije IzpisUra (slika 4.15)
podatek o času s pomočjo ukaza atoi (slika 4.15, vrstica 7) pretvorimo v celo število
(primer 120529). Ta podatek nato razčlenimo na ure (slika 4.15, vrstica 10), minute (slika
4.15, vrstici 12 in 14) in sekunde (slika 4.15, vrstici 16 in 17), da lahko zapišemo čas v
ţeljeni obliki (12:05:29). Slika 4.16 in slika 4.17 prikazujeta primer programske kode za
izpis časa v Sydney-ju, Avstralija.
Slika 4.15: Funkcija za izpis časa
1 void IzpisUra(char *niz)
2
3 int aus,u_aus,m1_aus,m2_aus,s1_aus,s2_aus,c = 0;
4 int zacasni;
5 if (niz)
6
7 zacasni = atoi (niz);
8 aus = zacasni;
9 aus = aus + 110000;
10 u_aus = aus/10000;
11 aus = aus-(u_aus*10000);
12 m1_aus = aus/1000;
13 aus = aus-(m1_aus*1000);
14 m2_aus = aus/100;
15 aus = aus-(m2_aus*100);
16 s1_aus = aus/10;
17 s2_aus = aus-(s1_aus*10);
18 niz1=0x00;
19
1 int razcleni_nmea (char *niz)
2
3 int ura, datum;
4 float sirina,dolzina, hitrost;
5
6 char *tok = strtok(niz,","); //gprmc
7 tok = strtok(0,","); //utc ura
8 ura = atoi (tok); //pretvorimo v intiger
9 sprintf (UraBuffer,"%d",ura); //shranimo v buffer
10 tok = strtok(0,","); //status
12 sirina = atof (tok); //pretvotimo v float
13 sprintf (ZemljepisnaSirina,"%4.4f",sirina); //shranimo v buffer
14 tok = strtok(0,","); //orientacija1
15 tok = strtok(0,","); //zemljepisna dolzina
16 dolzina = atof (tok); //pretvotimo v float
17 sprintf (ZemljepisnaDolzina,"%4.4f",dolzina); //shranimo v buffer
18 tok = strtok(0,","); //orientacija2
19 tok = strtok(0,","); //hitrost
20 hitrost = atof (tok); //pretvotimo v float
21 sprintf (hitrost_buffer,"%4.7f",hitrost); //shranimo v buffer
22 tok = strtok(0,","); //track
23 tok = strtok(0,","); //datum
24 datum = atoi (tok); //pretvorimo v intiger
25 sprintf (datum_buffer,"%d",datum); //shranimo v buffer
26 tok = strtok(0,","); //magnetic
27 tok = strtok(0,","); //orientacija3
28 tok = strtok(0,","); //mode indicator
29 tok = strtok(0,","); //checksum
30
31
Potovalni računalnik z GPS Stran 46
UTC čas se izpisuje od 0 do 23, UTC+11 čas pa se izpisuje od 11 do 34. Kadar je UTC+11
enak 24 (slika 4.16, vrstica 1), smo izpisali vrednost ure 00 (slika 4.16, vrstica 4), če je
vrednost UTC+11 večja od 24 (slika 4.16, vrstica 6), pa smo odšteli 24 (slika 4.16, vrstica
13). Ko je vrednosti UTC+11 enaka 34 (slika 4.16, vrstica 9), smo izpisali vrednost ure 10
(slika 4.16, vrstica 10).
Slika 4.16: Izpis časa za Avstralijo
Funkcijo IzpisDatum kličemo za izpis datuma. Podatek o datumu najprej pretvorimo v
celo število, ki ga nato razčlenimo na dan, mesec in leto. Nato s pomočjo switch stavka
izpisujemo datum v ţeljeni obliki (slika 4.17, slika 4.18).
Slika 4.17: Funkcija za izpis datuma -1-
1 if (u_aus == 24)
2
3 c = 1;
4 sprintf(izpis_sydney,"00:%d%d:%d%d",m1_aus,m2_aus,s1_aus,s2_aus);
5
6 if (u_aus > 24)
7
8 c = 1;
9 if (u_aus == 34)
10 sprintf(izpis_sydney,"10:%d%d:%d%d",m1_aus,m2_aus,s1_aus,s2_aus);
11 else
12
13 u_aus-=24;
14 sprintf(izpis_sydney,"0%d:%d%d:%d%d",u_aus,m1_aus,m2_aus,s1_aus,s2_aus);
15
16
17 if (c == 0)
18 sprintf(izpis_sydney,"%d:%d%d:%d%d",u_aus,m1_aus,m2_aus,s1_aus,s2_aus);
1 void IzpisDatum (char *niz)
2
3 int zacasni;
4 int dan1,dan2,mesec,leto;
5
6 if (niz)
7
8 zacasni = atoi (niz);
9 dan1 = zacasni/100000;
10 zacasni = zacasni-(dan1*100000);
11 dan2 = zacasni/10000;
12 zacasni = zacasni-(dan2*10000);
13 mesec = zacasni/100;
14 zacasni = zacasni-(mesec*100);
15 leto = 2000+zacasni;
16
17 switch (mesec)
18
19 case 1:
20 sprintf 21(izpis_datum1,"%d%d.01.%d",dan1,dan2,leto);
22 break;
23 case 2:
24 sprintf 25(izpis_datum1,"%d%d.02.%d",dan1,dan2,leto);
25 break;
26 case 3:
27 sprintf (izpis_datum1,"%d%d.03.%d",dan1,dan2,leto);
28 break;
29 case 4:
30 sprintf (izpis_datum1,"%d%d.04.%d",dan1,dan2,leto);
31 break;
32 case 5:
33 sprintf (izpis_datum1,"%d%d.05.%d",dan1,dan2,leto);
34 break;
35 case 6:
Potovalni računalnik z GPS Stran 47
Slika 4.18: Funkcija za izpis datuma -2-
IzpisUraDatum funkcijo (slika 4.19, slika 4.20) uporabimo za izpis datuma in ure na
zaslonu »Glavni meni«, 3, 4, 5 in 6. niz1 (slika 4.19, vrstica 54) vsebuje podatek o času,
niz2 (slika 4.20 vrstica 71) pa podatek o datumu. Oba podatka najprej razčlenimo, ter ju
nato izpisujemo v ţeljeni obliki. Razčlenjen podatek o datumu s pomočjo switch stavka
izpisujemo tako, da se meseci izpisujejo poimensko. V primeru slabega signala se na
ekranu izpiše NI SIGNALA. Informacijo o signalu dobimo s pomočjo statusnega podatka
stavka GPRMC. Kadar je statusni podatek enak A, pomeni, da je signal aktiven, če pa je
statusni podatek enak V, je signal neaktiven.
20 sprintf 21(izpis_datum1,"%d%d.01.%d",dan1,dan2,leto);
22 break;
23 case 2:
24 sprintf 25(izpis_datum1,"%d%d.02.%d",dan1,dan2,leto);
25 break;
26 case 3:
27 sprintf (izpis_datum1,"%d%d.03.%d",dan1,dan2,leto);
28 break;
29 case 4:
30 sprintf (izpis_datum1,"%d%d.04.%d",dan1,dan2,leto);
31 break;
32 case 5:
33 sprintf (izpis_datum1,"%d%d.05.%d",dan1,dan2,leto);
34 break;
35 case 6:
36 sprintf (izpis_datum1,"%d%d.06.%d",dan1,dan2,leto);
37 break;
38 case 7:
39 sprintf (izpis_datum1,"%d%d.07.%d",dan1,dan2,leto);
40 break;
41 case 8:
42 sprintf (izpis_datum1,"%d%d.08.%d",dan1,dan2,leto);
43 break;
44 case 9:
45 sprintf (izpis_datum1,"%d%d.09.%d",dan1,dan2,leto);
46 break;
47 case 10:
48 sprintf (izpis_datum1,"%d%d.10.%d",dan1,dan2,leto);
49 break;
50 case 11:
51 sprintf (izpis_datum1,"%d%d.11.%d",dan1,dan2,leto);
52 break;
53 case 12:
54 sprintf (izpis_datum1,"%d%d.12.%d",dan1,dan2,leto);
55 break;
56
57 niz=0x00;
58
59
Potovalni računalnik z GPS Stran 48
Slika 4.19: Funkcija za izpis datuma in ure -1-
1 void IzpisUraDatum(char *niz1, char *niz2)
2
3 int u1,u2,m1,m2,s1,s2;
4 int zacasni;
5 int dan1,dan2,mesec,leto;
6 int zacasni1;
7
8 if (stevec2 != 0)
9
10 sprintf (izpis_ura," ");
11 sprintf (izpis_datum," ");
12 if (stevec2 == 15)
13 stevec2 = 7;
14 switch (stevec2)
15
16 case 3:
17 sprintf (ni_signala," NI SIGNALA ");
18 break;
19 case 4:
20 sprintf (ni_signala,". NI SIGNALA ");
21 break;
22 case 5:
23 sprintf (ni_signala,".. NI SIGNALA ");
24 break;
25 case 6:
26 sprintf (ni_signala,"... NI SIGNALA ");
27 break;
28 case 7:
29 sprintf (ni_signala,"....NI SIGNALA ");
30 break;
31 case 8:
32 sprintf (ni_signala," ...NI SIGNALA. ");
33 break;
34 case 9:
35 sprintf (ni_signala," ..NI SIGNALA.. ");
36 break;
37 case 10:
38 sprintf (ni_signala," .NI SIGNALA... ");
39 break;
40 case 11:
41 sprintf (ni_signala," NI SIGNALA....");
42 break;
43 case 12:
44 sprintf (ni_signala," .NI SIGNALA... ");
45 break;
46 case 13:
47 sprintf (ni_signala," ..NI SIGNALA.. ");
48 break;
49 case 14:
50 sprintf (ni_signala," ...NI SIGNALA. ");
51 break;
52
53
54 if (niz1)
55
56 zacasni = atoi (niz1);
57 zacasni = zacasni + 10000;
58 u1 = zacasni/100000;
59 zacasni = zacasni-(u1*100000);
60 u2 = zacasni/10000;
61 zacasni = zacasni-(u2*10000);
62 m1 = zacasni/1000;
63 zacasni = zacasni-(m1*1000);
64 m2 = zacasni/100;
65 zacasni = zacasni-(m2*100);
66 s1 = zacasni/10;
67 s2 = zacasni-(s1*10);
68 niz1=0x00;
69 sprintf (izpis_ura,"%d%d:%d%d:%d%d",u1,u2,m1,m2,s1,s2);
70
71 if (niz2)
72
73 zacasni1 = atoi (niz2);
74 dan1 = zacasni1/100000;
75 zacasni1 = zacasni1-(dan1*100000);
76 dan2 = zacasni1/10000;
77 zacasni1 = zacasni1-(dan2*10000);
= zacasni1-(dan1*100000);
dan2 = zacasni1/10000;
zacasni1 = zacasni1-(dan2*10000);
mesec = zacasni1/100;
zacasni1 = zacasni1-(mesec*100);
if (zacasni1 != 97)
Potovalni računalnik z GPS Stran 49
Slika 4.20: Funkcija za izpis datuma in ure -2-
Funkcija IzpisHitrostUraDatum je namenjena za izpis podatkov na zaslonu 4 (slika
4.21). Poleg točnega časa in datuma se izpisuje tudi podatek o hitrosti vozila. niz1
70
71 if (niz2)
72
73 zacasni1 = atoi (niz2);
74 dan1 = zacasni1/100000;
75 zacasni1 = zacasni1-(dan1*100000);
76 dan2 = zacasni1/10000;
77 zacasni1 = zacasni1-(dan2*10000);
78 mesec = zacasni1/100;
79 zacasni1 = zacasni1-(mesec*100);
80 if (zacasni1 != 97)
81
82 stevec2 = 0;
83 sprintf (ni_signala," ");
84
85 else
86 stevec2++;
87 leto = 2000+zacasni1;
88
89 switch (mesec)
90
91 case 1:
92 sprintf (izpis_datum,"%d%d. januar %d",dan1,dan2,leto);
93 break;
94 case 2:
95 sprintf (izpis_datum,"%d%d. februar %d",dan1,dan2,leto);
96 break;
97 case 3:
98 sprintf (izpis_datum,"%d%d. marec %d",dan1,dan2,leto);
99 break;
100 case 4:
101 sprintf (izpis_datum,"%d%d. april %d",dan1,dan2,leto);
102 break;
103 case 5:
104 sprintf (izpis_datum,"%d%d. maj %d",dan1,dan2,leto);
105 break;
106 case 6:
107 sprintf (izpis_datum,"%d%d. junij %d",dan1,dan2,leto);
108 break;
109 case 7:
110 sprintf (izpis_datum,"%d%d. julij %d",dan1,dan2,leto);
111 break;
112 case 8:
113 sprintf (izpis_datum,"%d%d. avgust %d",dan1,dan2,leto);
114 break;
115 case 9:
116 sprintf (izpis_datum,"%d%d. september %d",dan1,dan2,leto);
117 break;
118 case 10:
119 sprintf (izpis_datum,"%d%d. oktober %d",dan1,dan2,leto);
120 break;
121 case 11:
122 sprintf (izpis_datum,"%d%d. november %d",dan1,dan2,leto);
123 break;
124 case 12:
125 sprintf (izpis_datum,"%d%d. december %d",dan1,dan2,leto);
126 break;
127
128 niz2=0x00;
126
127
Potovalni računalnik z GPS Stran 50
vsebuje podatek o hitrosti, niz2 podatek o času in niz3 podatek o datumu. Slika 4.22
prikazuje programsko kodo za izpis hitrosti. Hitrost se izpisuje v vozlih, zato je potrebno
podatek pretvoriti v kilometre na uro (1 vozel = 1,85200 km/h). Dobimo enačbo 1.
Enačba 1: Izračun hitrosti km/h.
Za izpis prevoţene poti pa je potrebno podatek pretvoriti v metre na sekundo. Tako se
vrednost prevoţene poti vsako sekundo prišteva prejšnji vrednosti prevoţene poti (1 vozel
= 0,5144444444 m/s). Dobimo enačbo 2.
Enačba 2: Izračun hitrosti m/s
Slika 4.21: Zaslon za merjenje hitrosti
Slika 4.22: Funkcija za izpis hitrosti
m 1
s 0,51444
1,9438449
km 1
h 1,85200
0,539956803
1 void IzpisHitrostUraDatum(char *niz1, char *niz2, char *niz3)
2
3 float hitrostkmh, hitrostms;
4 float zacasni;
5 float x = 0.539956803;
6 float y = 1.9438449;
7 int u1,u2,m1,m2,s1,s2;
8 int zacasni2;
9 int dan1,dan2,mesec,leto;
10 int zacasni3;
11 // priprava za izpis UTC ure
12 if (niz1)
13
14 zacasni = atof (niz1);
15 hitrostkmh = zacasni/x;
16 sprintf (izpis_hitrost_kmh,"%4.2f",hitrostkmh);
17 hitrostms = zacasni/y;
18 sprintf (izpis_hitrost_ms,"%4.2f",hitrostms);
19
20
21 niz1=0x00;
22 .
23 .
Potovalni računalnik z GPS Stran 51
Funkcijo IzracunPoraba uporabimo za izračun povprečne porabe vozila (slika 4.23),
kjer EditBox1 vsebuje podatek o vneseni količini goriva, stevec_km pa vsebuje
podatek o prevoţenih kilometrih vozila (slika 4.24). Prikaz porabe vozila smo omejili na
najmanj 4 litre na 100 kilometrov in največ 10 litrov na 100 kilometrov. Kar je manj od 4
oziroma več od 10, se smatra kot napaka ali narobe vneseni podatek. Stevec3 šteje
pravilno izračunane rezultate porabe vozila. S tem omogočimo izračun povprečne porabe
vozila po enačbi 3, skupna poraba je vsota vseh pravilno izračunanih porab.
Enačba 3: Izračun porabe.
Slika 4.23: Zaslon za prikaz povprečne porabe vozila
Slika 4.24: Funkcija za izračun porabe
1 void IzracunPoraba ()
2
3 float a,b,c,d;
4 b = atof (EditBox1);
5 c = atof (stevec_km);
6 a = (b/c)*100;
7 if ( (a < 4) || (a > 10))
8
9 if (poraba < 4)
10 sprintf (Izracun,"....");
11 else
12 sprintf (Izracun,"%4.1f",poraba);
13
14 else
15
16 stevec3++;
17 poraba = poraba + a;
18 d = poraba/stevec3;
19 sprintf (Izracun,"%4.1f",d);
20
21
skupna poraba
stevec3
poraba
Potovalni računalnik z GPS Stran 52
4.2.3 Funkciji GOLMsgCallback in GOLDrawCallback
Za spremembo stanja objekta (primer, ali je tipka pritisnjena ali ne) je potrebno uporabiti
funkcijo GOLMsgCallback. Za odziv na spremenjeno stanje objekta pa uporabimo
funkcijo GOLDrawCallback. Na primer: identifikacijsko ime tipke Hitrost je BTN_4
(slika 4.25, vrstica 9). V funkciji GOLMsgCallback s pomočjo if stavka opazujemo
spremembo stanja objekta. Ko pride do spremembe, postavimo spremenljivko
tipkaHitrost na 1 (slika 4.25, vrstica 13), ter izberemo objekt xhitrostx (slika
4.25, vrstica 14). Pri izbiri objekta xhitrostx postavimo spremenljivko screen4
(slika 4.25, vrstica 20) na 1. S tem nakaţemo, da se nahajamo na zaslonu 4.
Slika 4.25: Funkcija GOLMsgCallback
V funkciji GOLDrawCallbac pa s pomočjo if stavka opazujemo, ali je spremenljivka
tipkaHitrost na 1 (slika 4.26, vrstica 5). Če je, izrišemo zaslon 4 (slika 4.26, vrstica
7) ter vse uporabljene primitivne objekte za zaslon 4 (črte, statične napise, ipd.) (slika 4.26,
vrstica 8). Po izrisu zaslona 4 postavimo spremenljivki tipkaHitrost (slika 4.26,
vrstica 10) ter screen2 (slika 4.26, vrstica 11) na 0.
Podatki iz sprejemnika se neprestano osveţujejo, zato je bilo potrebno določiti
spremenljivko, na katero se sklicujemo pri izpisu podatkov na zaslonih na katerih se
izpisuje čas. V GOLDraw funkciji kličemo podprogram PrimerjajUra (slika 4.27,
1 WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER *pObj, GOL_MSG *pMsg)
2
3 WORD objectID;
4
5 objectID = GetObjID(pObj);
6
7 GDDDemoGOLMsgCallback(objMsg, pObj, pMsg);
8
9 if (objectID == BTN_4) // tipka Hitrost
10
11 if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
12
13 tipkaHitrost = 1;
14 objectID = xhitrostx;
15
16
17
18 if (objectID == xhitrostx)
19
20 screen4 = 1;
21
22 return (1);
23
Potovalni računalnik z GPS Stran 53
vrstice od 11 do 15), v katerem smo ob vsaki spremembi časa (vsako sekundo)
spremenljivko Flag postavili na ena. Vsak zaslon ima svojo spremenljivko Flag. Primer:
zaslon 4 za spremljanje hitrosti ima spremenljivko Flag 2 (slika 4.27, vrstica 24).
Slika 4.26: Funkcija GOLDrawCallback
Slika 4.27: Določitev spremenljivke »Flag«
S sklicem na spremenljivko screen4 izpisujemo podatke na zaslonu 4. Slika 4.28
prikazuje zaslon 4 z vsemi identifikacijskimi imeni statičnih tekstovnih objektov. Z
1 WORD GOLDrawCallback(void)
2
3 GDDDemoGOLDrawCallback();
4
5 if (tipkaHitrost == 1)
6
7 Createscreen4();
8 CreatePrimitivesForscreen4();
9 pogoj=1;
10 tipkaHitrost = 0;
11 screen2 = 0;
12
1 if(GOLDraw()) // Draw GOL object
2
3 TouchGetMsg(&msg); // Get message from touch screen
4 if (RSFlag == 1)
5
6 razcleni_nmea (gps_buffer);
7 razcleni_nmea2 (rx_buffer2);
8 RSFlag=0;
9
10
11 PrimerjajUra (UraBuffer, ura_buffer);
12 PrimerjajUra1 (UraBuffer, ura1_buffer);
13 PrimerjajUra2 (UraBuffer, ura2_buffer);
14 PrimerjajUra3 (UraBuffer, ura3_buffer);
15 PrimerjajUra4 (UraBuffer, ura4_buffer);
16
17
18 void PrimerjajUra2 (char *niz1, char *niz2)
19
20 int a;
21 a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
22 if (a !=0)
23
24 Flag2 = 1;
25 memcpy (niz2, niz1, (unsigned)strlen(niz1));
26
27
Potovalni računalnik z GPS Stran 54
ukazom StSetText (slika 4.28, vrstica 6) izberemo objekt, na katerega bomo izpisovali
podatek, z ukazom SetState (slika 4.28, vrstica 7) pa ta podatek zapišemo.
Primer: stanje števca shranimo v pomnilnik editbox3 (slika 4.28, vrstica 5), ki ga nato
izpišemo na objekt STE_194.
Slika 4.28: Izpis podatkov na zaslonu 4
1 if (screen4 == 1)
2
3 if (pogoj == 1)
4
5 editbox3 = EditBox4;
6 StSetText(((STATICTEXT*)(GOLFindObject(STE_194))), editbox3);
7 SetState(((STATICTEXT*)(GOLFindObject(STE_194))), ST_DRAW);
8 pogoj = 0;
9
10 if (Flag2 == 1)
11
12 IzpisHitrostUraDatum(hitrost_buffer, ura2_buffer, datum_buffer);
13 datum = izpis_datum;
14 hitrost_kmh = izpis_hitrost_kmh;
15 ms = atof (izpis_hitrost_ms);
16 pot_izracunana = pot_izracunana + ms;
17 pot_izpisana = pot_izracunana/1000;
18 sprintf(izpis_pot,"%4.2 km",pot_izpisana);
19 pot = izpis_pot;
20
21 StSetText(((STATICTEXT*)(GOLFindObject(STE_46))), ura);
22 SetState(((STATICTEXT*)(GOLFindObject(STE_46))), ST_DRAW);
23 StSetText(((STATICTEXT*)(GOLFindObject(STE_53))), datum);
24 SetState(((STATICTEXT*)(GOLFindObject(STE_53))), ST_DRAW);
25 StSetText(((STATICTEXT*)(GOLFindObject(STE_47))), hitrost_kmh);
26 SetState(((STATICTEXT*)(GOLFindObject(STE_47))), ST_DRAW);
27 StSetText(((STATICTEXT*)(GOLFindObject(STE_195))), pot);
28 SetState(((STATICTEXT*)(GOLFindObject(STE_195))), ST_DRAW);
29 Flag2 = 0;
30
31
screen4
Stanje števca – STE_194
Trenutna pot – STE_195
Merilec hitrosti – STE_47
Datum – STE_53
Ura – STE_46
Potovalni računalnik z GPS Stran 55
5 SKLEP
V okviru diplomskega dela smo izdelali prototip potovalnega računalnika z GPS. Pri tem
smo uporabili Microchipove testne ploščice, saj bi bilo v primeru izdelave lastne ploščice
cenovno veliko draţje. Raziskali smo standarde, po katerih podobne naprave komunicirajo
s sateliti GPS in izdelali prototip, ki je sposoben zajemati podatke ter jih ustrezno
prikazovati na prikazovalniku z dotično ploščico. Pri izdelavi programske opreme smo
naleteli na teţave, predvsem pri vzpostavljanju povezave s sprejemnikom, ter pri
odstranjevanju nezaţeljenega utripanja prikazovalnika. Teţave smo uspešno rešili.
Testiranje prototipa potovalnega računalnika z GPS se je izvajalo večkrat. Pri testiranju
smo dobili vse ţeljene podatke. Podatki o uri, datumu, nadmorski višini, zemljepisni širini
in dolţini, ki smo jih prejeli preko sprejemnika GPS so bili pravilni. Vidnih je bilo devet
satelitov. Prototip bi lahko tudi nadgradili z dodatnimi moduli, kot so brezţična
komunikacija z drugimi napravami, dodatne V/I naprave, ki bi lahko izboljšale preglednost
nad vozilom, ter večjim zaslonom za lepši in bolj funkcionalni pregled podatkov.
Dosegli smo vse cilje, ki smo si jih zadali na začetku naloge. Osvojili smo veliko novih
spoznanj na področju programiranja mikrokrmilnikov in navigacije. Podrobneje smo
spoznali delovanje mikrokrmilnika PIC32 ter uporabo grafičnega prikazovalnika na dotik.
Potovalni računalnik z GPS Stran 56
6 LITERATURA
[1] The Library of Congress, Science Reference Services, (2011). [Spletni vir].
Dostopno na: http://www.loc.gov/rr/scitech/mysteries/global.html [3.3.2014].
[2] Wikipedia, Transit. [Spletni vir].
Dostopno na: http://en.wikipedia.org/wiki/Transit_%28satellite%29 [3.3.2014].
[3] Steven R. Strom (2002), Charting a Course Toward Global Navigation. [Spletni vir].
Dostopno na:
http://web.archive.org/web/20021101215923/http://www.aero.org/publications/rosslink
ummer2002/01.html. [3.3.2014].
[4] Wikipedia, Global Positioning System. [Spletni vir].
Dostopno na: http://en.wikipedia.org/wiki/Global_Positioning_System#cite_note-15.
[5.3.2014].
[5] Wikipedia, KAL 007. [Spletni vir].
Dostopno na: http://en.wikipedia.org/wiki/Korean_Air_Lines_Flight_007. [3.3.2014].
[6] Mitja Erţen (2008). GPS. Seminar pri Izbranih poglavjih iz uporabne fizike, FRI,
Univerza v Ljubljani. [Spletni vir].
Dostopno na: http://www-f1.ijs.si/~ziherl/GPS.pdf. [5.3.2014].
[7] Anes Durgutović (2005), Izbira in določevanje prostornin nepravilnih teles z uporabo
metode »RTK-GPS«, Diplomsko delo Naravoslovnotehniška fakulteta, Univerza v
Ljubljani. [Spletni vir]. Dostopno na:
http://www.geo.ntf.unilj.si/mvulic/diplome/GRADUATION_THESIS/Durgutovic/Anes
_Durutovic_IZMERA_DOLOcANJE_PROSTORNIN_NEPRAVIL_teles_rtk-gps.pdf.
[3.3.2014].
[8] Wikipedia, GPS signals. [Spletni vir].
Dostopno na: http://en.wikipedia.org/wiki/GPS_signals. [10.3.2014].
[9] Index of Dale DePriest's Navigation and GPS Articles, NMEA data. [Spletni vir].
Dostopno na: http://www.gpsinformation.org/dale/nmea.htm. [10.3.2014].
[10] Purg Damjan (2012), Sledenje vozil z napravo GPS v aplikacijah v okolju.net,
Diplomsko delo, FERI, Univerza v Mariboru. [Spletni vir].
Dostopno na: http://dkum.uni-mb.si/IzpisGradiva.php?id=38015. [10.3.2014].
[11] Raner Simon (2008), Zajemanje in obdelava podatkov navtične navigacijske naprave,
Diplomsko delo, FRI, Univerza v Ljubljani. [Spletni vir].
Dostopno na: http://dkum.ukm.si/Dokument.php?id=6566&lang=slv. [10.3.2014].
[12] Edge of space sciences, PRWIZCH stavek. [Spletni vir].
EDB_56
EDB_98
Potovalni računalnik z GPS Stran 57
Dostopno na: http://www.eoss.org/aprs/aprs_formats_eoss.htm. [20.3.2014].
[13] Jupiter GPS receiver module designer's guide, PRWIZCH stavek. [Spletni vir].
Dostopno na:
http://gpsd.berlios.de/vendordocs/jupiter/MN002000A_JupiterReceiver_DesignerGuide_p
rint.pdf. [10.3.2014].
[14] “Jupiter” GPS Receiver TU30-D145-027 Data Sheet. [Spletni vir].
Dostopno na: http://www.gpskit.nl/documents/rockwell/jupiter-gps-board.pdf.
[25.3.2014].
[15] Solomon SSD1926 Image Processor Data Sheet. [Spletni vir].
Dostopno na: http://www.allshore.com/pdf/SSD1926.PDF. [20.3.2014].
[16] MPLAB Integrated Development Enviroment. [Spletni vir]. Dostopno na:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1408.
[22.3.2014].
[17] Multimedia Expansion Board User's Guide. [Spletni vir].
Dostopno na:
http://ww1.microchip.com/downloads/en/DeviceDoc/Multimedia%20Board%20Users
20Guide%20(DS61160A).pdf. [22.3.2014].
[18] Mladen Mikulić (2012), Izvedba hitre diskretne kosinusne transformacije z vezji FPGA,
Diplomsko delo FERI , Univerza v Mariboru. [Spletni vir].
Dostopno na: http://dkum.uni-mb.si/Dokument.php?id=48336. [22.3.2014].
[19] OK. Now you need a touchscreen. [Spletni vir].
Dostopno na:
http://www.mikroe.com/downloads/get/460/en_mikroe_article_c_avr_01_09.pdf.
[15.4.2014].
[20] PIC32 Starter Kit User's Guide. [Spletni vir].
Dostopno na:
http://www.silica.com/fileadmin/02_Products/Productdetails/Microchip/PIC32_Starter_Ki
ts_Users_Guide.pdf. [15.4.2014].
[21] PIC32MX Family Data Sheet – Section 2. MCU. [Spletni vir].
Dostopno na:
http://eecs.wsu.edu/~aofallon/ee234/handouts/refMaual/PIC32%20Family%20Reference
%20Manual,%20Sect.%2002%20MCU.pdf. [15.4.2014].
[22] PIC32MX Family Data Sheet – Section 6. Oscillators. [Spletni vir].
Dostopno na: http://ww1.microchip.com/downloads/en/DeviceDoc/61112H.pdf.
[15.4.2014].
Potovalni računalnik z GPS Stran 58
[23] PIC32MX Family Data Sheet – Section 8. Interrupts. [Spletni vir].
Dostopno na: http://ww1.microchip.com/downloads/en/DeviceDoc/61108G.pdf.
[15.4.2014].
[24] PIC32MX Family Data Sheet – Section 21. UART. [Spletni vir].
Dostopno na: http://ww1.microchip.com/downloads/en/DeviceDoc/61107G.pdf.
[29.4.2014].
[25] NMEA – 2000. [Spletni vir].
Dostopno na: http://en.wikipedia.org/wiki/NMEA_2000. [29.4.2014].
[26] How a GPS Receiver Gets a Lock. [Spletni vir].
Dostopno na: http://www.gpsinformation.net/main/gpslock.htm. [29.4.2014].
[27] How to Use Widgets in Microchip Graphics Library. [Spletni vir].
Dostopno na: http://ww1.microchip.com/downloads/en/AppNotes/01136a.pdf.
[29.4.2014].
Potovalni računalnik z GPS Stran 59
7 PRILOGE
7.1 PROGRAMSKA KODA
/*****************************************************************************
* Microchip Graphics Library
* Graphics Display Designer (GDD) Template
*****************************************************************************
* FileName: Main.c
* Processor: PIC24F, PIC24H, dsPIC, PIC32
* Compiler: MPLAB C30/C32
* Company: Microchip Technology Incorporated
*
* Software License Agreement
*
* Copyright © 2010 Microchip Technology Inc. All rights reserved.
* Microchip licenses to you the right to use, modify, copy and distribute
* Software only when embedded on a Microchip microcontroller or digital
* signal controller, which is integrated into your product or third party
* product (pursuant to the sublicense terms in the accompanying license
* agreement).
*
* You should refer to the license agreement accompanying this Software
* for additional information regarding your rights and obligations.
*
* SOFTWARE AND DOCUMENTATION ARE PROVIDED ?AS IS? WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY
* OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR
* PURPOSE. IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR
* OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION,
* BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT
* DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL,
* INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA,
* COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY
* CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
* OR OTHER SIMILAR COSTS.
*
* Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*****************************************************************************/
#include "Main.h"
#include "GDD_Screens.h"
#define GetSystemClock() (80000000ul)
#define UART1_BAUD (4800)
#define RX_BUFFER_SIZE 120
UXCHAR rx_buffer[RX_BUFFER_SIZE];
UXCHAR rx_buffer2[RX_BUFFER_SIZE];
UXCHAR gps_buffer[RX_BUFFER_SIZE];
UXCHAR ni_signala [33];
UXCHAR UraBuffer[14];
UXCHAR ura_buffer[14]; //screeb2
UXCHAR ura1_buffer[14]; //screen5
UXCHAR ura2_buffer[14]; // screen4
Potovalni računalnik z GPS Stran 60
UXCHAR ura3_buffer[14]; //screen3
UXCHAR ura4_buffer[14]; //screen6
UXCHAR izpis_ura[30]; // v vseh screenih
UXCHAR izpis_sydney[30]; //screen5
UXCHAR izpis_shanghai[30]; //screen5
UXCHAR izpis_london[30]; //screen5
UXCHAR izpis_moskva[30]; //screen5
UXCHAR izpis_tokyo[30]; //screen5
UXCHAR izpis_kairo[30]; //screen5
XCHAR *ura; //v vseh screenih
XCHAR *ura_sydney; //screen5
XCHAR *ura_shanghai; //screen5
XCHAR *ura_london; //screen5
XCHAR *ura_moskva; //screen5
XCHAR *ura_tokyo; //screen5
XCHAR *ura_kairo; //screen5
UXCHAR hitrost_buffer[30]; //screen4
UXCHAR izpis_hitrost_kmh[30]; //screen4
UXCHAR izpis_hitrost_ms[30]; //screen4
XCHAR *hitrost_kmh; //screen4
XCHAR *signal; //screen2
UXCHAR StatusBuffer[14];
XCHAR *pot; //screen4
float ms, pot_izracunana,pot_izpisana; //screen4
UXCHAR izpis_pot[30]; //screen4
UXCHAR datum_buffer[14]; //v vseh screenih
UXCHAR izpis_datum[30];
UXCHAR izpis_datum1[30];
UXCHAR ZemljepisnaSirina[30];
UXCHAR ZemljepisnaDolzina[30];
UXCHAR NadmorskaVisina[30];
UXCHAR cena_izracun[30];
XCHAR *cena;
float litri,eur,izracun,poraba;
XCHAR *editbox1;
XCHAR *editbox2;
XCHAR *editbox3;
XCHAR *editbox4;
XCHAR *s9podatek;
XCHAR *s10podatek;
XCHAR *s11podatek;
XCHAR *s12podatek;
UXCHAR EditBox1[30];
UXCHAR EditBox2[30];
UXCHAR EditBox3[30];
UXCHAR EditBox10[30];
UXCHAR EditBox4[30];
UXCHAR stevec_km[30];
EDITBOX *pEb1;
EDITBOX *pEb2;
EDITBOX *pEb3;
EDITBOX *pEb4;
EDITBOX *pEb5;
EDITBOX *pEb6;
EDITBOX *pEb7;
EDITBOX *pEb8;
EDITBOX *pEb9;
EDITBOX *pEb10;
EDITBOX *pEb11;
EDITBOX *pEb12;
EDITBOX *pEb13;
Potovalni računalnik z GPS Stran 61
EDITBOX *pEb14;
EDITBOX *pEb15;
int s9 = 0;
int s10 = 0;
int s11 = 0;
int s12 = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
int g = 0;
int h = 0;
int i = 0;
int j = 0;
int pogoj = 0;
int pogoj1 = 0;
int stanje1,stanje2,stanje_skupno;
XCHAR *datum;
XCHAR *dolzina;
XCHAR *sirina;
XCHAR *nadmorska;
XCHAR *datum1;
XCHAR *datum2;
XCHAR *datum3;
XCHAR *datum4;
XCHAR *datum5;
XCHAR *kilometri1;
XCHAR *kilometri2;
XCHAR *kilometri3;
XCHAR *kilometri4;
XCHAR *kilometri5;
XCHAR *litri1;
XCHAR *litri2;
XCHAR *litri3;
XCHAR *litri4;
XCHAR *litri5;
int izracun1,izracun11,izracun2,izracun22;
XCHAR *poraba1;
XCHAR *poraba2;
XCHAR *poraba3;
XCHAR *poraba4;
XCHAR *poraba5;
XCHAR *poraba_izracun;
UXCHAR PorabaIzracun[30];
UXCHAR PorabaIzracun_[30];
UXCHAR Izracun[30];
UXCHAR stevecxy[30];
UXCHAR porabaxy[30];
UXCHAR izpis_poraba[30];
UXCHAR izpis_poraba2[30];
UXCHAR izpis_poraba3[30];
UXCHAR izpis_poraba4[30];
UXCHAR izpis_poraba5[30];
UXCHAR izpis_datum2[30];
UXCHAR izpis_datum3[30];
UXCHAR izpis_datum4[30];
UXCHAR izpis_datum5[30];
UXCHAR izpis_kilometri2[30];
UXCHAR izpis_kilometri3[30];
UXCHAR izpis_kilometri4[30];
UXCHAR izpis_kilometri5[30];
UXCHAR izpis_litri2[30];
UXCHAR izpis_litri3[30];
UXCHAR izpis_litri4[30];
UXCHAR izpis_litri5[30];
unsigned int RxCtr=0; // stetje prispelih znakov
unsigned int RxCtr2=0; // stetje prispelih znakov
unsigned char RSFlag=0; // zastavica za signaliziranje, ali je podatek prispel
unsigned char TxCtr=0; // stetje oddajnih znakov
unsigned char TxMaxChr=0; // maksimalno st. znakov ki jih moramo oddati
unsigned int zastavica;
Potovalni računalnik z GPS Stran 62
unsigned int Flag;
unsigned int Flag1;
unsigned int Flag2;
unsigned int Flag3;
unsigned int Flag4;
unsigned int DatumFlag;
unsigned int tipkaOK, tipkaPoraba, tipkaHitrost, tipkaUra, tipkaKoordinate, tipkaStroski;
unsigned int tipkaNazaj1, tipkaNazaj2, tipkaNazaj3, tipkaNazaj4, tipkaNazaj5, tipkaNazaj6;
unsigned int vnos, vnos1, vnos2, vnos3, vnos4, vnesi;
unsigned int
s9tipka1,s9tipka2,s9tipka3,s9tipka4,s9tipka5,s9tipka6,s9tipka7,s9tipka8,s9tipka9,s9tipka0;
unsigned int s9tipkaDEL,s9tipkavejica,s9tipkaVnesi;
unsigned int
s10tipka1,s10tipka2,s10tipka3,s10tipka4,s10tipka5,s10tipka6,s10tipka7,s10tipka8,s10tipka9,s
10tipka0;
unsigned int s10tipkaDEL,s10tipkavejica,s10tipkaVnesi;
unsigned int
s11tipka1,s11tipka2,s11tipka3,s11tipka4,s11tipka5,s11tipka6,s11tipka7,s11tipka8,s11tipka9,s
11tipka0;
unsigned int s11tipkaDEL,s11tipkavejica,s11tipkaVnesi;
unsigned int
s12tipka1,s12tipka2,s12tipka3,s12tipka4,s12tipka5,s12tipka6,s12tipka7,s12tipka8,s12tipka9,s
12tipka0;
unsigned int s12tipkaDEL,s12tipkaVnesi;
unsigned int stanje_tipke = 0;
unsigned int screen1 = 0;
unsigned int screen2 = 0;
unsigned int screen3 = 0;
unsigned int screen4 = 0;
unsigned int screen5 = 0;
unsigned int screen6 = 0;
unsigned int screen7 = 0;
unsigned int screen8 = 0;
unsigned int screen9 = 0;
unsigned int screen10 = 0;
unsigned int screen11 = 0;
unsigned int screen12 = 0;
unsigned int stevec = 0;
unsigned int stevec2 = 1;
int stevec3 = 0;
int stanje = 0;
//int a = 0;
void checkForSerialCommand(void);
// Configuration bits
#if defined(__dsPIC33F__) || defined(__PIC24H__)
_FOSCSEL(FNOSC_PRI);
_FOSC(FCKSM_CSECMD &OSCIOFNC_OFF &POSCMD_XT);
_FWDT(FWDTEN_OFF);
#elif defined(__dsPIC33E__) || defined(__PIC24E__)
_FOSCSEL(FNOSC_FRC);
_FOSC(FCKSM_CSECMD & POSCMD_XT & OSCIOFNC_OFF & IOL1WAY_OFF);
_FWDT(FWDTEN_OFF);
_FPOR(FPWRT_PWR128 & BOREN_ON & ALTI2C1_ON & ALTI2C2_ON);
_FICD(ICS_PGD1 & RSTPRI_PF & JTAGEN_OFF);
#elif defined(__PIC32MX__)
#pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FWDTEN = OFF,
FCKSM = CSECME, FPBDIV = DIV_1
#pragma config OSCIOFNC = ON, POSCMOD = XT, FSOSCEN = ON, FNOSC = PRIPLL
#pragma config CP = OFF, BWP = OFF, PWP = OFF
#endif
/////////////////////////////////////////////////////////////////////////////
// SPI Device Initialization Function
/////////////////////////////////////////////////////////////////////////////
#if defined (USE_SST25VF016)
// initialize GFX3 SST25 flash SPI
#define FlashInit(pInitData) SST25Init((DRV_SPI_INIT_DATA*)pInitData)
#elif defined (USE_MCHP25LC256)
// initialize EEPROM on Explorer 16
#define FlashInit(pInitData) MCHP25LC256Init((DRV_SPI_INIT_DATA*)pInitData)
#elif defined (USE_M25P80)
Potovalni računalnik z GPS Stran 63
#define FlashInit(pInitData) SST25Init((DRV_SPI_INIT_DATA*)pInitData)
#endif
/////////////////////////////////////////////////////////////////////////////
// SPI Channel settings
/////////////////////////////////////////////////////////////////////////////
#if defined (SPI_CHANNEL_1_ENABLE) || defined (SPI_CHANNEL_2_ENABLE) || defined
(SPI_CHANNEL_3_ENABLE) || defined (SPI_CHANNEL_4_ENABLE)
#if defined (USE_SST25VF016)
#ifdef __PIC32MX
const DRV_SPI_INIT_DATA SPI_Init_Data = SST25_SPI_CHANNEL, 1, 0, 0, 1, 1, 0;
#ifdef USE_TOUCHSCREEN_AR1020
const DRV_SPI_INIT_DATA ar1020SpiInit = AR1020_SPI_CHANNEL, 44, 0, 0,
0, 0, 0;
#endif
#else
const DRV_SPI_INIT_DATA SPI_Init_Data = SST25_SPI_CHANNEL, 3, 6, 0, 1, 1, 0;
#ifdef USE_TOUCHSCREEN_AR1020
const DRV_SPI_INIT_DATA ar1020SpiInit = AR1020_SPI_CHANNEL, 2, 3, 0,
0, 0, 0;
#endif
#endif
#elif defined (USE_MCHP25LC256)
const DRV_SPI_INIT_DATA SPI_Init_Data = MCHP25LC256_SPI_CHANNEL, 6, 3, 0, 1, 1,
0;
#elif defined (USE_M25P80)
const DRV_SPI_INIT_DATA SPI_Init_Data = SST25_SPI_CHANNEL, 3, 6, 0, 1, 1, 0;
#endif
#endif
/////////////////////////////////////////////////////////////////////////////
// TouchScreen Init Values
/////////////////////////////////////////////////////////////////////////////
#ifdef USE_TOUCHSCREEN_RESISTIVE
#define TOUCH_INIT_VALUES (NULL)
#endif
#ifdef USE_TOUCHSCREEN_AR1020
#define TOUCH_INIT_VALUES ((void *)&ar1020SpiInit)
#endif
/////////////////////////////////////////////////////////////////////////////
// LOCAL PROTOTYPES
/////////////////////////////////////////////////////////////////////////////
void TickInit(void); // starts tick counter
void InitializeBoard(void);
int razcleni_nmea (char *niz);
int razcleni_nmea2 (char *niz);
void IzpisUra(char *niz);
void IzpisDatum (char *niz);
void IzpisPoraba ();
void IzracunPoraba ();
void IzpisUraDatum(char *niz1, char *niz2);
void PrekopirajBuffer (char *niz1, char *niz2);
void PrimerjajUra (char *niz1, char *niz2);
void PrimerjajUra1 (char *niz1, char *niz2);
void PrimerjajUra2 (char *niz1, char *niz2);
void PrimerjajUra3 (char *niz1, char *niz2);
void PrimerjajUra4 (char *niz1, char *niz2);
void IzpisHitrostUraDatum(char *niz1, char *niz2, char *niz3);
//typedef enum START_WAIT, RECEIVING, MSG_RECEIVED state = START_WAIT;
/* */
int main(void)
mPORTFClearBits(BIT_8);
mPORTFSetPinsDigitalOut(BIT_8);
mPORTFSetPinsDigitalIn(BIT_2);
// nastavitve za UART1 - 4800-N-8-1, brez RTS in CTS (handshake)
UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY);
UARTSetFifoMode(UART1, UART_INTERRUPT_ON_TX_NOT_FULL|UART_INTERRUPT_ON_RX_NOT_EMPTY);
UARTSetLineControl(UART1, UART_DATA_SIZE_8_BITS|UART_PARITY_NONE|UART_STOP_BITS_1);
Potovalni računalnik z GPS Stran 64
UARTSetDataRate(UART1, GetPeripheralClock(), UART1_BAUD);
UARTEnable(UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL|UART_RX|UART_TX));
// prekinitve za Rx in Tx
INTEnable(INT_U1RX, INT_ENABLED);
INTEnable(INT_U1TX, INT_DISABLED);
// nastavitev UART ISR prioritete
SetPriorityIntU1(UART_INT_PR2);
SetSubPriorityIntU1(UART_INT_SUB_PR0);
// nastavitev sistema na mulit-vektorski nacin
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
// omogoci prekinitve
INTEnableInterrupts();
GOL_MSG msg; // GOL message structure to interact with GOL
InitializeBoard();
GDDDemoCreateFirstScreen();
while(1)
//razcleni_nmea (rx_buffer);
//izpis_podatkov();
if(GOLDraw()) // Draw GOL object
TouchGetMsg(&msg); // Get message from touch screen
if (RSFlag == 1)
razcleni_nmea (gps_buffer);
razcleni_nmea2 (rx_buffer2);
//PrekopirajBuffer (gps_buffer, rmc_buffer);
RSFlag=0;
//razcleni_nmea (rmc_buffer);
PrimerjajUra (UraBuffer, ura_buffer);
PrimerjajUra1 (UraBuffer, ura1_buffer);
PrimerjajUra2 (UraBuffer, ura2_buffer);
PrimerjajUra3 (UraBuffer, ura3_buffer);
PrimerjajUra4 (UraBuffer, ura4_buffer);
//PrimerjajDatum (datum1_buffer, datum_buffer);
//PrekopirajBuffer (ura1_buffer, ura_buffer);
//PrekopirajBuffer (datum1_buffer, datum_buffer);
#if (NUM_GDD_SCREENS > 1)
// GDD Readme:
// The following line of code allows a GDD user to touch the touchscreen
// to cycle through different static screens for viewing. This is useful as a
// quick way to view how each screen looks on the physical target hardware.
// This line of code should eventually be commented out for actual development.
// Also note that widget/object names can be found in GDD_Screens.h
//if(msg.uiEvent == EVENT_RELEASE) GDDDemoNextScreen();
#endif
GOLMsg(&msg); // Process message
//end while
/////////////////////////////////////////////////////////////////////////////
// Function: WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg)
// Input: objMsg - translated message for the object,
// pObj - pointer to the object,
// pMsg - pointer to the non-translated, raw GOL message
// Output: if the function returns non-zero the message will be processed by default
// Overview: it's a user defined function. GOLMsg() function calls it each
// time the valid message for the object received
Potovalni računalnik z GPS Stran 65
/////////////////////////////////////////////////////////////////////////////
WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER *pObj, GOL_MSG *pMsg)
WORD objectID;
objectID = GetObjID(pObj);
GDDDemoGOLMsgCallback(objMsg, pObj, pMsg);
// Add additional code here...
if (objectID == BTN_1) // tipka OK
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaOK = 1;
objectID = xmenuex;
if (objectID == BTN_3) // tipka Poraba
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaPoraba = 1;
objectID = xporabax;
if (objectID == BTN_11) // tipka Nazaj
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaNazaj1 = 1;
objectID = xmenuex;
if (objectID == EDB_66) // editbox za vnos
if(objMsg == EB_MSG_TOUCHSCREEN) // ali je bila pritisnjena
vnos = 1;
stevec++;
if (objectID == EDB_56) // editbox za vnos
if(objMsg == EB_MSG_TOUCHSCREEN) // ali je bila pritisnjena
vnos1 = 1;
objectID = xvpis2x;
if (objectID == EDB_98) // editbox za vnos
if(objMsg == EB_MSG_TOUCHSCREEN) // ali je bila pritisnjena
vnos2 = 1;
objectID = xvpis3x;
if (objectID == EDB_218) // editbox za vnos
if(objMsg == EB_MSG_TOUCHSCREEN) // ali je bila pritisnjena
vnos4 = 1;
objectID = xvpis5x;
if (objectID == BTN_108) // tipka za vrnitev na screen3
Potovalni računalnik z GPS Stran 66
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
vnesi = 1;
objectID = xporabax;
if (objectID == BTN_126) // tipka za vnos stevilke 1 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka1 = 1;
//objectID = xvpis2x;
if (objectID == BTN_127) // tipka za vnos stevilke 2 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka2 = 1;
//objectID = xvpis2x;
if (objectID == BTN_128) // tipka za vnos stevilke 3 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka3 = 1;
//objectID = xvpis2x;
if (objectID == BTN_129) // tipka za vnos stevilke 4 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka4 = 1;
//objectID = xvpis2x;
if (objectID == BTN_130) // tipka za vnos stevilke 5 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka5 = 1;
//objectID = xvpis2x;
if (objectID == BTN_131) // tipka za vnos stevilke 6 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka6 = 1;
//objectID = xvpis2x;
if (objectID == BTN_132) // tipka za vnos stevilke 7 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka7 = 1;
//objectID = xvpis2x;
if (objectID == BTN_133) // tipka za vnos stevilke 8 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
Potovalni računalnik z GPS Stran 67
s9tipka8 = 1;
//objectID = xvpis2x;
if (objectID == BTN_134) // tipka za vnos stevilke 9 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka9 = 1;
//objectID = xvpis2x;
if (objectID == BTN_135) // tipka za vnos stevilke 0 v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipka0 = 1;
//objectID = xvpis2x;
if (objectID == BTN_136) // tipka za vnos vejice v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipkavejica = 1;
//objectID = xvpis2x;
if (objectID == BTN_137) // tipka za brisanje v screen9
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipkaDEL = 1;
//objectID = xvpis2x;
if (objectID == BTN_138) // tipka za vnos podatkov v screen9 in skoci
na screen8
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s9tipkaVnesi = 1;
objectID = xvpis1x;
//objectID = xvpis2x;
if (objectID == BTN_153) // tipka za vnos stevilke 1 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka1 = 1;
//objectID = xvpis2x;
if (objectID == BTN_154) // tipka za vnos stevilke 2 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka2 = 1;
//objectID = xvpis2x;
if (objectID == BTN_155) // tipka za vnos stevilke 3 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
Potovalni računalnik z GPS Stran 68
s10tipka3 = 1;
//objectID = xvpis2x;
if (objectID == BTN_156) // tipka za vnos stevilke 4 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka4 = 1;
//objectID = xvpis2x;
if (objectID == BTN_157) // tipka za vnos stevilke 5 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka5 = 1;
//objectID = xvpis2x;
if (objectID == BTN_158) // tipka za vnos stevilke 6 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka6 = 1;
//objectID = xvpis2x;
if (objectID == BTN_159) // tipka za vnos stevilke 7 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka7 = 1;
//objectID = xvpis2x;
if (objectID == BTN_160) // tipka za vnos stevilke 8 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka8 = 1;
//objectID = xvpis2x;
if (objectID == BTN_161) // tipka za vnos stevilke 9 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka9 = 1;
//objectID = xvpis2x;
if (objectID == BTN_162) // tipka za vnos stevilke 0 v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipka0 = 1;
//objectID = xvpis2x;
if (objectID == BTN_163) // tipka za vnos vejice v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipkavejica = 1;
Potovalni računalnik z GPS Stran 69
//objectID = xvpis2x;
if (objectID == BTN_164) // tipka za brisanje v screen10
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipkaDEL = 1;
//objectID = xvpis2x;
if (objectID == BTN_165) // tipka za vnos podatkov v screen10 in
skoci na screen8
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s10tipkaVnesi = 1;
objectID = xvpis1x;
//objectID = xvpis2x;
if (objectID == BTN_206) // tipka za vnos stevilke 1 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka1 = 1;
//objectID = xvpis2x;
if (objectID == BTN_207) // tipka za vnos stevilke 2 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka2 = 1;
//objectID = xvpis2x;
if (objectID == BTN_208) // tipka za vnos stevilke 3 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka3 = 1;
//objectID = xvpis2x;
if (objectID == BTN_209) // tipka za vnos stevilke 4 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka4 = 1;
//objectID = xvpis2x;
if (objectID == BTN_210) // tipka za vnos stevilke 5 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka5 = 1;
//objectID = xvpis2x;
if (objectID == BTN_211) // tipka za vnos stevilke 6 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
Potovalni računalnik z GPS Stran 70
s12tipka6 = 1;
//objectID = xvpis2x;
if (objectID == BTN_212) // tipka za vnos stevilke 7 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka7 = 1;
//objectID = xvpis2x;
if (objectID == BTN_213) // tipka za vnos stevilke 8 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka8 = 1;
//objectID = xvpis2x;
if (objectID == BTN_214) // tipka za vnos stevilke 9 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka9 = 1;
//objectID = xvpis2x;
if (objectID == BTN_215) // tipka za vnos stevilke 0 v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipka0 = 1;
//objectID = xvpis2x;
if (objectID == BTN_217) // tipka za brisanje v screen12
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipkaDEL = 1;
//objectID = xvpis2x;
if (objectID == BTN_232) // tipka za vnos podatkov v screen12 in
skoci na screen8
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
s12tipkaVnesi = 1;
objectID = xstevecx;
//objectID = xvpis2x;
if (objectID == BTN_4) // tipka Hitrost
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaHitrost = 1;
objectID = xhitrostx;
if (objectID == BTN_12) // tipka Nazaj
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
Potovalni računalnik z GPS Stran 71
tipkaNazaj2 = 1;
objectID = xmenuex;
if (objectID == BTN_5) // tipka Ura
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaUra = 1;
objectID = xurax;
if (objectID == BTN_34) // tipka Nazaj
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaNazaj3 = 1;
objectID = xmenuex;
if (objectID == BTN_6) // tipka Koordinate
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaKoordinate = 1;
objectID = xkoordinatex;
if (objectID == BTN_36) // tipka Nazaj
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaNazaj4 = 1;
objectID = xmenuex;
if (objectID == BTN_7) // tipka Stroski
if(objMsg == BTN_MSG_RELEASED) // ali je bila pritisnjena
tipkaStroski = 1;
objectID = xstevecx;
if (objectID == xmenuex)
screen2 = 1;
if (objectID == xporabax)
screen3 = 1;
if (objectID == xhitrostx)
screen4 = 1;
if (objectID == xurax)
screen5 = 1;
if (objectID == xkoordinatex)
screen6 = 1;
Potovalni računalnik z GPS Stran 72
if (objectID == xvpis1x)
screen8 = 1;
if (objectID == xvpis2x)
screen9 = 1;
if (objectID == xvpis3x)
screen10 = 1;
if (objectID == xvpis5x)
screen12 = 1;
if (objectID == xstevecx)
screen1 = 1;
return (1);
/////////////////////////////////////////////////////////////////////////////
// Function: WORD GOLDrawCallback()
// Output: if the function returns non-zero the draw control will be passed to GOL
// Overview: it's a user defined function. GOLDraw() function calls it each
// time when GOL objects drawing is completed. User drawing should be done here.
// GOL will not change color, line type and clipping region settings while
// this function returns zero.
/////////////////////////////////////////////////////////////////////////////
WORD GOLDrawCallback(void)
GDDDemoGOLDrawCallback();
// Add additional code here...
if (tipkaOK == 1)
Createscreen2();
tipkaOK = 0;
screen1 = 0;
if (tipkaPoraba == 1)
Createscreen3();
CreatePrimitivesForscreen3();
pogoj1=1;
tipkaPoraba = 0;
screen2 = 0;
if (tipkaNazaj1 == 1)
Createscreen2();
tipkaNazaj1 = 0;
screen3 = 0;
if (vnos == 1)
Createscreen8();
Potovalni računalnik z GPS Stran 73
CreatePrimitivesForscreen8();
vnos = 0;
screen3 = 0;
switch (stevec)
case 1:
break;
case 2:
memcpy (izpis_datum2,izpis_datum1,30);
memcpy (izpis_kilometri2,stevec_km,30);
memcpy (izpis_litri2,EditBox1,30);
memcpy (izpis_poraba2,izpis_poraba,30);
break;
case 3:
memcpy (izpis_datum3,izpis_datum2,30);
memcpy (izpis_kilometri3,izpis_kilometri2,30);
memcpy (izpis_litri3,izpis_litri2,30);
memcpy (izpis_poraba3,izpis_poraba2,30);
memcpy (izpis_datum2,izpis_datum1,30);
memcpy (izpis_kilometri2,stevec_km,30);
memcpy (izpis_litri2,EditBox1,30);
memcpy (izpis_poraba2,izpis_poraba,30);
break;
case 4:
memcpy (izpis_datum4,izpis_datum3,30);
memcpy (izpis_kilometri4,izpis_kilometri3,30);
memcpy (izpis_litri4,izpis_litri3,30);
memcpy (izpis_poraba4,izpis_poraba3,30);
memcpy (izpis_datum3,izpis_datum2,30);
memcpy (izpis_kilometri3,izpis_kilometri2,30);
memcpy (izpis_litri3,izpis_litri2,30);
memcpy (izpis_poraba3,izpis_poraba2,30);
memcpy (izpis_datum2,izpis_datum1,30);
memcpy (izpis_kilometri2,stevec_km,30);
memcpy (izpis_litri2,EditBox1,30);
memcpy (izpis_poraba2,izpis_poraba,30);
break;
case 5:
memcpy (izpis_datum5,izpis_datum4,30);
memcpy (izpis_kilometri5,izpis_kilometri4,30);
memcpy (izpis_litri5,izpis_litri4,30);
memcpy (izpis_poraba5,izpis_poraba4,30);
memcpy (izpis_datum4,izpis_datum3,30);
memcpy (izpis_kilometri4,izpis_kilometri3,30);
memcpy (izpis_litri4,izpis_litri3,30);
memcpy (izpis_poraba4,izpis_poraba3,30);
memcpy (izpis_datum3,izpis_datum2,30);
memcpy (izpis_kilometri3,izpis_kilometri2,30);
memcpy (izpis_litri3,izpis_litri2,30);
memcpy (izpis_poraba3,izpis_poraba2,30);
memcpy (izpis_datum2,izpis_datum1,30);
memcpy (izpis_kilometri2,stevec_km,30);
memcpy (izpis_litri2,EditBox1,30);
memcpy (izpis_poraba2,izpis_poraba,30);
break;
if (vnos1 == 1)
Createscreen9();
CreatePrimitivesForscreen9();
vnos1 = 0;
screen8 = 0;
a = 1;
if (vnos2 == 1)
Potovalni računalnik z GPS Stran 74
Createscreen10();
CreatePrimitivesForscreen10();
vnos2 = 0;
screen8 = 0;
b = 1;
if (vnos4 == 1)
Createscreen12();
vnos4 = 0;
screen1 = 0;
d = 1;
if (vnesi == 1)
pogoj1=1;
sprintf (EditBox1,"%s L",EditBox1);
stanje1 = atoi(EditBox10);
stanje2 = atoi(EditBox4);
if (stanje1 == stanje2)
sprintf (stevec_km,"%d km",stanje2);
if (stanje1 > stanje2)
sprintf (stevec_km,"NAPAKA");
if (stanje1 < stanje2)
stanje_skupno = stanje2-stanje1;
sprintf (stevec_km,"%d km",stanje_skupno);
if (stanje1 == 0)
sprintf (stevec_km,"%d km",stanje2);
memcpy (EditBox10,EditBox4,30);
IzracunPoraba();
poraba_izracun = Izracun;
vnesi = 0;
s9=0;
s10=0;
s11=0;
s12=0;
screen8 = 0;
if (stevec == 5)
stevec = 4;
Createscreen3();
CreatePrimitivesForscreen3();
if (s9tipka1 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'1');
SetState(pEb1, EB_DRAW);
s9tipka1 = 0;
//screen8 = 0;
if (s9tipka2 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'2');
SetState(pEb1, EB_DRAW);
s9tipka2 = 0;
//screen8 = 0;
if (s9tipka3 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'3');
SetState(pEb1, EB_DRAW);
s9tipka3 = 0;
//screen8 = 0;
Potovalni računalnik z GPS Stran 75
if (s9tipka4 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'4');
SetState(pEb1, EB_DRAW);
s9tipka4 = 0;
//screen8 = 0;
if (s9tipka5 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'5');
SetState(pEb1, EB_DRAW);
s9tipka5 = 0;
//screen8 = 0;
if (s9tipka6 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'6');
SetState(pEb1, EB_DRAW);
s9tipka6 = 0;
//screen8 = 0;
if (s9tipka7 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'7');
SetState(pEb1, EB_DRAW);
s9tipka7 = 0;
//screen8 = 0;
if (s9tipka8 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'8');
SetState(pEb1, EB_DRAW);
s9tipka8 = 0;
//screen8 = 0;
if (s9tipka9 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'9');
SetState(pEb1, EB_DRAW);
s9tipka9 = 0;
//screen8 = 0;
if (s9tipka0 == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,'0');
SetState(pEb1, EB_DRAW);
s9tipka0 = 0;
//screen8 = 0;
if (s9tipkavejica == 1)
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbAddChar(pEb1,',');
SetState(pEb1, EB_DRAW);
s9tipkavejica = 0;
//screen8 = 0;
if (s9tipkaDEL == 1)
Potovalni računalnik z GPS Stran 76
pEb1 = (EDITBOX*)GOLFindObject(EDB_109);
EbDeleteChar(pEb1);
SetState(pEb1, EB_DRAW);
s9tipkaDEL = 0;
if (s9tipkaVnesi == 1)
EbGetText (pEb1);
s9podatek = pEb1->pBuffer;
sprintf (EditBox1,"%s",s9podatek);
s9 = 1;
Createscreen8();
CreatePrimitivesForscreen8();
screen9 = 0;
s9tipkaVnesi = 0;
e = 1;
if (s10tipka1 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'1');
SetState(pEb2, EB_DRAW);
s10tipka1 = 0;
//screen8 = 0;
if (s10tipka2 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'2');
SetState(pEb2, EB_DRAW);
s10tipka2 = 0;
//screen8 = 0;
if (s10tipka3 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'3');
SetState(pEb2, EB_DRAW);
s10tipka3 = 0;
//screen8 = 0;
if (s10tipka4 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'4');
SetState(pEb2, EB_DRAW);
s10tipka4 = 0;
//screen8 = 0;
if (s10tipka5 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'5');
SetState(pEb2, EB_DRAW);
s10tipka5 = 0;
//screen8 = 0;
if (s10tipka6 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'6');
SetState(pEb2, EB_DRAW);
s10tipka6 = 0;
//screen8 = 0;
if (s10tipka7 == 1)
Potovalni računalnik z GPS Stran 77
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'7');
SetState(pEb2, EB_DRAW);
s10tipka7 = 0;
//screen8 = 0;
if (s10tipka8 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'8');
SetState(pEb2, EB_DRAW);
s10tipka8 = 0;
//screen8 = 0;
if (s10tipka9 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'9');
SetState(pEb2, EB_DRAW);
s10tipka9 = 0;
//screen8 = 0;
if (s10tipka0 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,'0');
SetState(pEb2, EB_DRAW);
s10tipka0 = 0;
//screen8 = 0;
if (s10tipkavejica == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbAddChar(pEb2,',');
SetState(pEb2, EB_DRAW);
s10tipkavejica = 0;
//screen8 = 0;
if (s10tipkaDEL == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_148);
EbDeleteChar(pEb2);
SetState(pEb2, EB_DRAW);
s10tipkaDEL = 0;
if (s10tipkaVnesi == 1)
EbGetText (pEb2);
s10podatek = pEb2->pBuffer;
sprintf (EditBox2,"%s",s10podatek);
s10 = 1;
Createscreen8();
CreatePrimitivesForscreen8();
screen10 = 0;
s10tipkaVnesi = 0;
e = 1;
if (s12tipka1 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'1');
SetState(pEb4, EB_DRAW);
s12tipka1 = 0;
//screen8 = 0;
if (s12tipka2 == 1)
Potovalni računalnik z GPS Stran 78
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'2');
SetState(pEb4, EB_DRAW);
s12tipka2 = 0;
//screen8 = 0;
if (s12tipka3 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'3');
SetState(pEb4, EB_DRAW);
s12tipka3 = 0;
//screen8 = 0;
if (s12tipka4 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'4');
SetState(pEb4, EB_DRAW);
s12tipka4 = 0;
//screen8 = 0;
if (s12tipka5 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'5');
SetState(pEb4, EB_DRAW);
s12tipka5 = 0;
//screen8 = 0;
if (s12tipka6 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'6');
SetState(pEb4, EB_DRAW);
s12tipka6 = 0;
//screen8 = 0;
if (s12tipka7 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'7');
SetState(pEb4, EB_DRAW);
s12tipka7 = 0;
//screen8 = 0;
if (s12tipka8 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'8');
SetState(pEb4, EB_DRAW);
s12tipka8 = 0;
//screen8 = 0;
if (s12tipka9 == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'9');
SetState(pEb4, EB_DRAW);
s12tipka9 = 0;
//screen8 = 0;
if (s12tipka0 == 1)
pEb2 = (EDITBOX*)GOLFindObject(EDB_204);
EbAddChar(pEb4,'0');
SetState(pEb4, EB_DRAW);
s12tipka0 = 0;
Potovalni računalnik z GPS Stran 79
//screen8 = 0;
if (s12tipkaDEL == 1)
pEb4 = (EDITBOX*)GOLFindObject(EDB_204);
EbDeleteChar(pEb4);
SetState(pEb4, EB_DRAW);
s12tipkaDEL = 0;
if (s12tipkaVnesi == 1)
EbGetText (pEb4);
s12podatek = pEb4->pBuffer;
sprintf (EditBox4,"%s",s12podatek);
s12 = 1;
Createscreen1();
screen12 = 0;
s12tipkaVnesi = 0;
f = 1;
if (tipkaStroski == 1)
Createscreen1();
tipkaStroski = 0;
f=1;
s12=1;
screen2 = 0;
if (tipkaHitrost == 1)
Createscreen4();
CreatePrimitivesForscreen4();
tipkaHitrost = 0;
pogoj = 1;
screen2 = 0;
if (tipkaNazaj2 == 1)
Createscreen2();
tipkaNazaj2 = 0;
screen4 = 0;
if (tipkaUra == 1)
Createscreen5();
CreatePrimitivesForscreen5();
tipkaUra = 0;
screen2 = 0;
if (tipkaNazaj3 == 1)
Createscreen2();
tipkaNazaj3 = 0;
screen5 = 0;
if (tipkaKoordinate == 1)
Createscreen6();
CreatePrimitivesForscreen6();
tipkaKoordinate = 0;
screen2 = 0;
if (tipkaNazaj4 == 1)
Createscreen2();
Potovalni računalnik z GPS Stran 80
tipkaNazaj4 = 0;
screen6 = 0;
if (screen1 == 1)
if (f == 1)
if (s12 == 1)
editbox4 = EditBox4;
pEb12 = (EDITBOX*)GOLFindObject(EDB_218);
EbSetText (pEb12,editbox4);
SetState(pEb12, EB_DRAW);
//s10 = 0;
f = 0;
if (screen8 == 1)
if (e == 1)
if (s9 == 1)
editbox1 = EditBox1;
pEb5 = (EDITBOX*)GOLFindObject(EDB_56);
EbSetText (pEb5,editbox1);
SetState(pEb5, EB_DRAW);
//s9 = 0;
if (s10 == 1)
editbox2 = EditBox2;
pEb6 = (EDITBOX*)GOLFindObject(EDB_98);
EbSetText (pEb6,editbox2);
SetState(pEb6, EB_DRAW);
//s10 = 0;
eur = atof (EditBox2);
litri = atof (EditBox1);
izracun = eur/litri;
sprintf (cena_izracun,"%4.2f",izracun);
cena = cena_izracun;
StSetText(((STATICTEXT*)(GOLFindObject(STE_233))), cena);
SetState(((STATICTEXT*)(GOLFindObject(STE_233))), ST_DRAW);
e = 0;
if (screen9 == 1)
if (a == 1)
if (s10 == 1)
editbox2 = EditBox2;
pEb9 = (EDITBOX*)GOLFindObject(EDB_115);
EbSetText (pEb9,editbox2);
SetState(pEb9, EB_DRAW);
//s10 = 0;
a = 0;
if (screen10 == 1)
if (b == 1)
Potovalni računalnik z GPS Stran 81
if (s9 == 1)
editbox1 = EditBox1;
pEb11 = (EDITBOX*)GOLFindObject(EDB_143);
EbSetText (pEb11,editbox1);
SetState(pEb11, EB_DRAW);
//s9 = 0;
b = 0;
if (screen12 == 1)
if (d == 1)
editbox4 = EditBox4;
pEb15 = (EDITBOX*)GOLFindObject(EDB_204);
EbSetText (pEb15,editbox4);
SetState(pEb15, EB_DRAW);
//s11 = 0;
d = 0;
if (screen2 == 1)
if (Flag == 1)
IzpisUraDatum(ura_buffer, datum_buffer);
ura = izpis_ura;
datum = izpis_datum;
signal = ni_signala;
if (stevec2 !=0)
StSetText(((STATICTEXT*)(GOLFindObject(STE_200))), signal);
SetState(((STATICTEXT*)(GOLFindObject(STE_200))), ST_DRAW);
if (stevec2 == 0)
StSetText(((STATICTEXT*)(GOLFindObject(STE_200))), signal);
SetState(((STATICTEXT*)(GOLFindObject(STE_200))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_8))), ura);
SetState(((STATICTEXT*)(GOLFindObject(STE_8))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_9))), datum);
SetState(((STATICTEXT*)(GOLFindObject(STE_9))), ST_DRAW);
Flag = 0;
if (screen3 == 1)
if (pogoj1 == 1)
switch (stevec)
case 0:
break;
case 1:
IzpisDatum(datum_buffer);
IzpisPoraba();
poraba1 = izpis_poraba;
datum1 = izpis_datum1;
kilometri1 = stevec_km;
litri1 = EditBox1;
StSetText(((STATICTEXT*)(GOLFindObject(STE_77))), poraba_izracun);
SetState(((STATICTEXT*)(GOLFindObject(STE_77))), ST_DRAW);
Potovalni računalnik z GPS Stran 82
StSetText(((STATICTEXT*)(GOLFindObject(STE_55))), datum1);
SetState(((STATICTEXT*)(GOLFindObject(STE_55))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_78))), kilometri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_78))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_79))), litri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_79))), ST_DRAW);
pEb14 = (EDITBOX*)GOLFindObject(EDB_66);
EbSetText (pEb14,poraba1);
SetState(pEb14, EB_DRAW);
datum2 = izpis_datum2;
kilometri2 = izpis_kilometri2;
litri2 = izpis_litri2;
poraba2 = izpis_poraba2;
StSetText(((STATICTEXT*)(GOLFindObject(STE_70))), datum2);
SetState(((STATICTEXT*)(GOLFindObject(STE_70))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_80))), kilometri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_80))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_84))), litri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_84))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_196))), poraba2);
SetState(((STATICTEXT*)(GOLFindObject(STE_196))), ST_DRAW);
datum3 = izpis_datum3;
kilometri3 = izpis_kilometri3;
litri3 = izpis_litri3;
poraba3 = izpis_poraba3;
StSetText(((STATICTEXT*)(GOLFindObject(STE_71))), datum3);
SetState(((STATICTEXT*)(GOLFindObject(STE_71))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_81))), kilometri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_81))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_85))), litri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_85))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_197))), poraba3);
SetState(((STATICTEXT*)(GOLFindObject(STE_197))), ST_DRAW);
datum4 = izpis_datum4;
kilometri4 = izpis_kilometri4;
litri4 = izpis_litri4;
poraba4 = izpis_poraba4;
StSetText(((STATICTEXT*)(GOLFindObject(STE_72))), datum4);
SetState(((STATICTEXT*)(GOLFindObject(STE_72))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_82))), kilometri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_82))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_86))), litri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_86))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_198))), poraba4);
SetState(((STATICTEXT*)(GOLFindObject(STE_198))), ST_DRAW);
datum5 = izpis_datum5;
kilometri5 = izpis_kilometri5;
litri5 = izpis_litri5;
poraba5 = izpis_poraba5;
StSetText(((STATICTEXT*)(GOLFindObject(STE_73))), datum5);
SetState(((STATICTEXT*)(GOLFindObject(STE_73))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_83))), kilometri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_83))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_87))), litri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_87))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_199))), poraba5);
SetState(((STATICTEXT*)(GOLFindObject(STE_199))), ST_DRAW);
break;
case 2:
IzpisDatum(datum_buffer);
IzpisPoraba();
poraba1 = izpis_poraba;
datum1 = izpis_datum1;
kilometri1 = stevec_km;
litri1 = EditBox1;
StSetText(((STATICTEXT*)(GOLFindObject(STE_77))), poraba_izracun);
SetState(((STATICTEXT*)(GOLFindObject(STE_77))), ST_DRAW);
Potovalni računalnik z GPS Stran 83
StSetText(((STATICTEXT*)(GOLFindObject(STE_55))), datum1);
SetState(((STATICTEXT*)(GOLFindObject(STE_55))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_78))), kilometri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_78))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_79))), litri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_79))), ST_DRAW);
pEb14 = (EDITBOX*)GOLFindObject(EDB_66);
EbSetText (pEb14,poraba1);
SetState(pEb14, EB_DRAW);
datum2 = izpis_datum2;
kilometri2 = izpis_kilometri2;
litri2 = izpis_litri2;
poraba2 = izpis_poraba2;
StSetText(((STATICTEXT*)(GOLFindObject(STE_70))), datum2);
SetState(((STATICTEXT*)(GOLFindObject(STE_70))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_80))), kilometri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_80))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_84))), litri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_84))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_196))), poraba2);
SetState(((STATICTEXT*)(GOLFindObject(STE_196))), ST_DRAW);
datum3 = izpis_datum3;
kilometri3 = izpis_kilometri3;
litri3 = izpis_litri3;
poraba3 = izpis_poraba3;
StSetText(((STATICTEXT*)(GOLFindObject(STE_71))), datum3);
SetState(((STATICTEXT*)(GOLFindObject(STE_71))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_81))), kilometri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_81))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_85))), litri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_85))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_197))), poraba3);
SetState(((STATICTEXT*)(GOLFindObject(STE_197))), ST_DRAW);
datum4 = izpis_datum4;
kilometri4 = izpis_kilometri4;
litri4 = izpis_litri4;
poraba4 = izpis_poraba4;
StSetText(((STATICTEXT*)(GOLFindObject(STE_72))), datum4);
SetState(((STATICTEXT*)(GOLFindObject(STE_72))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_82))), kilometri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_82))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_86))), litri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_86))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_198))), poraba4);
SetState(((STATICTEXT*)(GOLFindObject(STE_198))), ST_DRAW);
datum5 = izpis_datum5;
kilometri5 = izpis_kilometri5;
litri5 = izpis_litri5;
poraba5 = izpis_poraba5;
StSetText(((STATICTEXT*)(GOLFindObject(STE_73))), datum5);
SetState(((STATICTEXT*)(GOLFindObject(STE_73))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_83))), kilometri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_83))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_87))), litri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_87))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_199))), poraba5);
SetState(((STATICTEXT*)(GOLFindObject(STE_199))), ST_DRAW);
break;
case 3:
IzpisDatum(datum_buffer);
IzpisPoraba();
poraba1 = izpis_poraba;
datum1 = izpis_datum1;
kilometri1 = stevec_km;
litri1 = EditBox1;
StSetText(((STATICTEXT*)(GOLFindObject(STE_77))), poraba_izracun);
SetState(((STATICTEXT*)(GOLFindObject(STE_77))), ST_DRAW);
Potovalni računalnik z GPS Stran 84
StSetText(((STATICTEXT*)(GOLFindObject(STE_55))), datum1);
SetState(((STATICTEXT*)(GOLFindObject(STE_55))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_78))), kilometri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_78))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_79))), litri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_79))), ST_DRAW);
pEb14 = (EDITBOX*)GOLFindObject(EDB_66);
EbSetText (pEb14,poraba1);
SetState(pEb14, EB_DRAW);
datum2 = izpis_datum2;
kilometri2 = izpis_kilometri2;
litri2 = izpis_litri2;
poraba2 = izpis_poraba2;
StSetText(((STATICTEXT*)(GOLFindObject(STE_70))), datum2);
SetState(((STATICTEXT*)(GOLFindObject(STE_70))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_80))), kilometri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_80))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_84))), litri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_84))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_196))), poraba2);
SetState(((STATICTEXT*)(GOLFindObject(STE_196))), ST_DRAW);
datum3 = izpis_datum3;
kilometri3 = izpis_kilometri3;
litri3 = izpis_litri3;
poraba3 = izpis_poraba3;
StSetText(((STATICTEXT*)(GOLFindObject(STE_71))), datum3);
SetState(((STATICTEXT*)(GOLFindObject(STE_71))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_81))), kilometri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_81))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_85))), litri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_85))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_197))), poraba3);
SetState(((STATICTEXT*)(GOLFindObject(STE_197))), ST_DRAW);
datum4 = izpis_datum4;
kilometri4 = izpis_kilometri4;
litri4 = izpis_litri4;
poraba4 = izpis_poraba4;
StSetText(((STATICTEXT*)(GOLFindObject(STE_72))), datum4);
SetState(((STATICTEXT*)(GOLFindObject(STE_72))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_82))), kilometri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_82))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_86))), litri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_86))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_198))), poraba4);
SetState(((STATICTEXT*)(GOLFindObject(STE_198))), ST_DRAW);
datum5 = izpis_datum5;
kilometri5 = izpis_kilometri5;
litri5 = izpis_litri5;
poraba5 = izpis_poraba5;
StSetText(((STATICTEXT*)(GOLFindObject(STE_73))), datum5);
SetState(((STATICTEXT*)(GOLFindObject(STE_73))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_83))), kilometri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_83))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_87))), litri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_87))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_199))), poraba5);
SetState(((STATICTEXT*)(GOLFindObject(STE_199))), ST_DRAW);
break;
case 4:
IzpisDatum(datum_buffer);
IzpisPoraba();
poraba1 = izpis_poraba;
datum1 = izpis_datum1;
kilometri1 = stevec_km;
litri1 = EditBox1;
StSetText(((STATICTEXT*)(GOLFindObject(STE_77))), poraba_izracun);
SetState(((STATICTEXT*)(GOLFindObject(STE_77))), ST_DRAW);
Potovalni računalnik z GPS Stran 85
StSetText(((STATICTEXT*)(GOLFindObject(STE_55))), datum1);
SetState(((STATICTEXT*)(GOLFindObject(STE_55))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_78))), kilometri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_78))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_79))), litri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_79))), ST_DRAW);
pEb14 = (EDITBOX*)GOLFindObject(EDB_66);
EbSetText (pEb14,poraba1);
SetState(pEb14, EB_DRAW);
datum2 = izpis_datum2;
kilometri2 = izpis_kilometri2;
litri2 = izpis_litri2;
poraba2 = izpis_poraba2;
StSetText(((STATICTEXT*)(GOLFindObject(STE_70))), datum2);
SetState(((STATICTEXT*)(GOLFindObject(STE_70))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_80))), kilometri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_80))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_84))), litri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_84))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_196))), poraba2);
SetState(((STATICTEXT*)(GOLFindObject(STE_196))), ST_DRAW);
datum3 = izpis_datum3;
kilometri3 = izpis_kilometri3;
litri3 = izpis_litri3;
poraba3 = izpis_poraba3;
StSetText(((STATICTEXT*)(GOLFindObject(STE_71))), datum3);
SetState(((STATICTEXT*)(GOLFindObject(STE_71))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_81))), kilometri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_81))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_85))), litri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_85))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_197))), poraba3);
SetState(((STATICTEXT*)(GOLFindObject(STE_197))), ST_DRAW);
datum4 = izpis_datum4;
kilometri4 = izpis_kilometri4;
litri4 = izpis_litri4;
poraba4 = izpis_poraba4;
StSetText(((STATICTEXT*)(GOLFindObject(STE_72))), datum4);
SetState(((STATICTEXT*)(GOLFindObject(STE_72))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_82))), kilometri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_82))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_86))), litri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_86))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_198))), poraba4);
SetState(((STATICTEXT*)(GOLFindObject(STE_198))), ST_DRAW);
datum5 = izpis_datum5;
kilometri5 = izpis_kilometri5;
litri5 = izpis_litri5;
poraba5 = izpis_poraba5;
StSetText(((STATICTEXT*)(GOLFindObject(STE_73))), datum5);
SetState(((STATICTEXT*)(GOLFindObject(STE_73))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_83))), kilometri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_83))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_87))), litri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_87))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_199))), poraba5);
SetState(((STATICTEXT*)(GOLFindObject(STE_199))), ST_DRAW);
break;
case 5:
IzpisDatum(datum_buffer);
IzpisPoraba();
poraba1 = izpis_poraba;
datum1 = izpis_datum1;
kilometri1 = stevec_km;
litri1 = EditBox1;
StSetText(((STATICTEXT*)(GOLFindObject(STE_77))), poraba_izracun);
SetState(((STATICTEXT*)(GOLFindObject(STE_77))), ST_DRAW);
Potovalni računalnik z GPS Stran 86
StSetText(((STATICTEXT*)(GOLFindObject(STE_55))), datum1);
SetState(((STATICTEXT*)(GOLFindObject(STE_55))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_78))), kilometri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_78))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_79))), litri1);
SetState(((STATICTEXT*)(GOLFindObject(STE_79))), ST_DRAW);
pEb14 = (EDITBOX*)GOLFindObject(EDB_66);
EbSetText (pEb14,poraba1);
SetState(pEb14, EB_DRAW);
datum2 = izpis_datum2;
kilometri2 = izpis_kilometri2;
litri2 = izpis_litri2;
poraba2 = izpis_poraba2;
StSetText(((STATICTEXT*)(GOLFindObject(STE_70))), datum2);
SetState(((STATICTEXT*)(GOLFindObject(STE_70))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_80))), kilometri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_80))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_84))), litri2);
SetState(((STATICTEXT*)(GOLFindObject(STE_84))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_196))), poraba2);
SetState(((STATICTEXT*)(GOLFindObject(STE_196))), ST_DRAW);
datum3 = izpis_datum3;
kilometri3 = izpis_kilometri3;
litri3 = izpis_litri3;
poraba3 = izpis_poraba3;
StSetText(((STATICTEXT*)(GOLFindObject(STE_71))), datum3);
SetState(((STATICTEXT*)(GOLFindObject(STE_71))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_81))), kilometri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_81))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_85))), litri3);
SetState(((STATICTEXT*)(GOLFindObject(STE_85))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_197))), poraba3);
SetState(((STATICTEXT*)(GOLFindObject(STE_197))), ST_DRAW);
datum4 = izpis_datum4;
kilometri4 = izpis_kilometri4;
litri4 = izpis_litri4;
poraba4 = izpis_poraba4;
StSetText(((STATICTEXT*)(GOLFindObject(STE_72))), datum4);
SetState(((STATICTEXT*)(GOLFindObject(STE_72))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_82))), kilometri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_82))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_86))), litri4);
SetState(((STATICTEXT*)(GOLFindObject(STE_86))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_198))), poraba4);
SetState(((STATICTEXT*)(GOLFindObject(STE_198))), ST_DRAW);
datum5 = izpis_datum5;
kilometri5 = izpis_kilometri5;
litri5 = izpis_litri5;
poraba5 = izpis_poraba5;
StSetText(((STATICTEXT*)(GOLFindObject(STE_73))), datum5);
SetState(((STATICTEXT*)(GOLFindObject(STE_73))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_83))), kilometri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_83))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_87))), litri5);
SetState(((STATICTEXT*)(GOLFindObject(STE_87))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_199))), poraba5);
SetState(((STATICTEXT*)(GOLFindObject(STE_199))), ST_DRAW);
break;
pogoj1 = 0;
if (Flag3 == 1)
IzpisUraDatum(ura3_buffer, datum_buffer);
ura = izpis_ura;
datum = izpis_datum;
Potovalni računalnik z GPS Stran 87
StSetText(((STATICTEXT*)(GOLFindObject(STE_52))), ura);
SetState(((STATICTEXT*)(GOLFindObject(STE_52))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_54))), datum);
SetState(((STATICTEXT*)(GOLFindObject(STE_54))), ST_DRAW);
Flag3 = 0;
if (screen4 == 1)
if (pogoj == 1)
editbox3 = EditBox4;
StSetText(((STATICTEXT*)(GOLFindObject(STE_194))), editbox3);
SetState(((STATICTEXT*)(GOLFindObject(STE_194))), ST_DRAW);
pogoj = 0;
if (Flag2 == 1)
//IzpisUraDatum(ura_buffer, datum_buffer);
IzpisHitrostUraDatum(hitrost_buffer, ura2_buffer, datum_buffer);
//IzpisHitrost(hitrost_buffer);
ura = izpis_ura;
datum = izpis_datum;
hitrost_kmh = izpis_hitrost_kmh;
ms = atof (izpis_hitrost_ms);
pot_izracunana = pot_izracunana + ms;
pot_izpisana = pot_izracunana/1000;
sprintf(izpis_pot,"%4.2 km",pot_izpisana);
pot = izpis_pot;
StSetText(((STATICTEXT*)(GOLFindObject(STE_46))), ura);
SetState(((STATICTEXT*)(GOLFindObject(STE_46))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_53))), datum);
SetState(((STATICTEXT*)(GOLFindObject(STE_53))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_47))), hitrost_kmh);
SetState(((STATICTEXT*)(GOLFindObject(STE_47))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_195))), pot);
SetState(((STATICTEXT*)(GOLFindObject(STE_195))), ST_DRAW);
Flag2 = 0;
if (screen5 == 1)
if (Flag1 == 1)
IzpisUra(UraBuffer);
IzpisUraDatum(ura1_buffer, datum_buffer);
ura = izpis_ura;
datum = izpis_datum;
//ura = izpis_ura1;
ura_sydney = izpis_sydney;
ura_shanghai = izpis_shanghai;
ura_london = izpis_london;
ura_moskva = izpis_moskva;
ura_tokyo = izpis_tokyo;
ura_kairo = izpis_kairo;
StSetText(((STATICTEXT*)(GOLFindObject(STE_15))), ura);
SetState(((STATICTEXT*)(GOLFindObject(STE_15))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_58))), datum);
SetState(((STATICTEXT*)(GOLFindObject(STE_58))), ST_DRAW);
//StSetText(((STATICTEXT*)(GOLFindObject(STE_40))), ura_newyork);
//SetState(((STATICTEXT*)(GOLFindObject(STE_40))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_20))), ura_sydney);
SetState(((STATICTEXT*)(GOLFindObject(STE_20))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_21))), ura_shanghai);
Potovalni računalnik z GPS Stran 88
SetState(((STATICTEXT*)(GOLFindObject(STE_21))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_22))), ura_london);
SetState(((STATICTEXT*)(GOLFindObject(STE_22))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_23))), ura_moskva);
SetState(((STATICTEXT*)(GOLFindObject(STE_23))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_24))), ura_tokyo);
SetState(((STATICTEXT*)(GOLFindObject(STE_24))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_25))), ura_kairo);
SetState(((STATICTEXT*)(GOLFindObject(STE_25))), ST_DRAW);
Flag1 = 0;
if (screen6 == 1)
if (Flag4 == 1)
IzpisUraDatum(ura4_buffer, datum_buffer);
ura = izpis_ura;
datum = izpis_datum;
sirina = ZemljepisnaSirina;
dolzina = ZemljepisnaDolzina;
nadmorska = NadmorskaVisina;
StSetText(((STATICTEXT*)(GOLFindObject(STE_185))), ura);
SetState(((STATICTEXT*)(GOLFindObject(STE_185))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_186))), datum);
SetState(((STATICTEXT*)(GOLFindObject(STE_186))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_192))), sirina);
SetState(((STATICTEXT*)(GOLFindObject(STE_192))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_193))), dolzina);
SetState(((STATICTEXT*)(GOLFindObject(STE_193))), ST_DRAW);
StSetText(((STATICTEXT*)(GOLFindObject(STE_204))), nadmorska);
SetState(((STATICTEXT*)(GOLFindObject(STE_204))), ST_DRAW);
Flag4 = 0;
return (1);
/*void PrekopirajBuffer (char *niz1, char *niz2)
int a;
a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
if (a !=0)
zastavica = 1;
memcpy (niz2, niz1, (unsigned)strlen(niz1));
*/
void PrimerjajUra (char *niz1, char *niz2)
int a;
a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
if (a !=0)
Flag = 1;
memcpy (niz2, niz1, (unsigned)strlen(niz1));
void PrimerjajUra1 (char *niz1, char *niz2)
int a;
a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
Potovalni računalnik z GPS Stran 89
if (a !=0)
Flag1 = 1;
memcpy (niz2, niz1, (unsigned)strlen(niz1));
void PrimerjajUra2 (char *niz1, char *niz2)
int a;
a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
if (a !=0)
Flag2 = 1;
memcpy (niz2, niz1, (unsigned)strlen(niz1));
void PrimerjajUra3 (char *niz1, char *niz2)
int a;
a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
if (a !=0)
Flag3 = 1;
memcpy (niz2, niz1, (unsigned)strlen(niz1));
void PrimerjajUra4 (char *niz1, char *niz2)
int a;
a = memcmp (niz1, niz2, (unsigned)strlen(niz1));
if (a !=0)
Flag4 = 1;
memcpy (niz2, niz1, (unsigned)strlen(niz1));
void IzpisPoraba ()
float a,b,c;
b = atof (EditBox1);
c = atof (stevec_km);
a = (b/c)*100;
if ((a < 4) || (a > 10))
sprintf (izpis_poraba,".... L/100km");
else
sprintf (izpis_poraba,"%4.2f L/100km",a);
void IzracunPoraba ()
float a,b,c,d;
//poraba = atof (Izracun);
b = atof (EditBox1);
c = atof (stevec_km);
a = (b/c)*100;
if ( (a < 4) || (a > 10))
if (poraba < 4)
sprintf (Izracun,"....");
else
sprintf (Izracun,"%4.1f",poraba);
else
stevec3++;
Potovalni računalnik z GPS Stran 90
poraba = poraba + a;
d = poraba/stevec3;
sprintf (Izracun,"%4.1f",d);
void IzpisDatum (char *niz)
int zacasni;
int dan1,dan2,mesec,leto;
if (niz)
zacasni = atoi (niz);
dan1 = zacasni/100000;
zacasni = zacasni-(dan1*100000);
dan2 = zacasni/10000;
zacasni = zacasni-(dan2*10000);
mesec = zacasni/100;
zacasni = zacasni-(mesec*100);
leto = 2000+zacasni;
switch (mesec)
case 1:
sprintf (izpis_datum1,"%d%d.01.%d",dan1,dan2,leto);
break;
case 2:
sprintf (izpis_datum1,"%d%d.02.%d",dan1,dan2,leto);
break;
case 3:
sprintf (izpis_datum1,"%d%d.03.%d",dan1,dan2,leto);
break;
case 4:
sprintf (izpis_datum1,"%d%d.04.%d",dan1,dan2,leto);
break;
case 5:
sprintf (izpis_datum1,"%d%d.05.%d",dan1,dan2,leto);
break;
case 6:
sprintf (izpis_datum1,"%d%d.06.%d",dan1,dan2,leto);
break;
case 7:
sprintf (izpis_datum1,"%d%d.07.%d",dan1,dan2,leto);
break;
case 8:
sprintf (izpis_datum1,"%d%d.08.%d",dan1,dan2,leto);
break;
case 9:
sprintf (izpis_datum1,"%d%d.09.%d",dan1,dan2,leto);
break;
case 10:
sprintf (izpis_datum1,"%d%d.10.%d",dan1,dan2,leto);
break;
case 11:
sprintf (izpis_datum1,"%d%d.11.%d",dan1,dan2,leto);
break;
case 12:
sprintf (izpis_datum1,"%d%d.12.%d",dan1,dan2,leto);
break;
niz=0x00;
void IzpisUraDatum(char *niz1, char *niz2)
int u1,u2,m1,m2,s1,s2;
int zacasni;
int dan1,dan2,mesec,leto;
int zacasni1;
Potovalni računalnik z GPS Stran 91
// priprava za izpis UTC ure
if (stevec2 != 0)
//stevec2++;
sprintf (izpis_ura," ");
sprintf (izpis_datum," ");
if (stevec2 == 15)
stevec2 = 7;
switch (stevec2)
case 3:
sprintf (ni_signala," NI SIGNALA ");
break;
case 4:
sprintf (ni_signala,". NI SIGNALA ");
break;
case 5:
sprintf (ni_signala,".. NI SIGNALA ");
break;
case 6:
sprintf (ni_signala,"... NI SIGNALA ");
break;
case 7:
sprintf (ni_signala,"....NI SIGNALA ");
break;
case 8:
sprintf (ni_signala," ...NI SIGNALA. ");
break;
case 9:
sprintf (ni_signala," ..NI SIGNALA.. ");
break;
case 10:
sprintf (ni_signala," .NI SIGNALA... ");
break;
case 11:
sprintf (ni_signala," NI SIGNALA....");
break;
case 12:
sprintf (ni_signala," .NI SIGNALA... ");
break;
case 13:
sprintf (ni_signala," ..NI SIGNALA.. ");
break;
case 14:
sprintf (ni_signala," ...NI SIGNALA. ");
break;
if (niz1)
zacasni = atoi (niz1);
zacasni = zacasni + 10000;
u1 = zacasni/100000;
zacasni = zacasni-(u1*100000);
u2 = zacasni/10000;
zacasni = zacasni-(u2*10000);
m1 = zacasni/1000;
zacasni = zacasni-(m1*1000);
m2 = zacasni/100;
zacasni = zacasni-(m2*100);
s1 = zacasni/10;
s2 = zacasni-(s1*10);
niz1=0x00;
sprintf (izpis_ura,"%d%d:%d%d:%d%d",u1,u2,m1,m2,s1,s2);
if (niz2)
zacasni1 = atoi (niz2);
dan1 = zacasni1/100000;
zacasni1 = zacasni1-(dan1*100000);
dan2 = zacasni1/10000;
Potovalni računalnik z GPS Stran 92
zacasni1 = zacasni1-(dan2*10000);
mesec = zacasni1/100;
zacasni1 = zacasni1-(mesec*100);
if (zacasni1 != 97)
stevec2 = 0;
sprintf (ni_signala," ");
else
stevec2++;
leto = 2000+zacasni1;
switch (mesec)
case 1:
sprintf (izpis_datum,"%d%d. januar %d",dan1,dan2,leto);
break;
case 2:
sprintf (izpis_datum,"%d%d. februar %d",dan1,dan2,leto);
break;
case 3:
sprintf (izpis_datum,"%d%d. marec %d",dan1,dan2,leto);
break;
case 4:
sprintf (izpis_datum,"%d%d. april %d",dan1,dan2,leto);
break;
case 5:
sprintf (izpis_datum,"%d%d. maj %d",dan1,dan2,leto);
break;
case 6:
sprintf (izpis_datum,"%d%d. junij %d",dan1,dan2,leto);
break;
case 7:
sprintf (izpis_datum,"%d%d. julij %d",dan1,dan2,leto);
break;
case 8:
sprintf (izpis_datum,"%d%d. avgust %d",dan1,dan2,leto);
break;
case 9:
sprintf (izpis_datum,"%d%d. september %d",dan1,dan2,leto);
break;
case 10:
sprintf (izpis_datum,"%d%d. oktober %d",dan1,dan2,leto);
break;
case 11:
sprintf (izpis_datum,"%d%d. november %d",dan1,dan2,leto);
break;
case 12:
sprintf (izpis_datum,"%d%d. december %d",dan1,dan2,leto);
break;
niz2=0x00;
void IzpisUra(char *niz1)
//int slo,u_slo,m1_slo,m2_slo,s1_slo,s2_slo,a = 0;
int u_zda,m1_zda,m2_zda,s1_zda,s2_zda,b = 0;
int aus,u_aus,m1_aus,m2_aus,s1_aus,s2_aus,c = 0;
int chn,u_chn,m1_chn,m2_chn,s1_chn,s2_chn,d = 0;
int gbr,u_gbr,m1_gbr,m2_gbr,s1_gbr,s2_gbr,e = 0;
int rus,u_rus,m1_rus,m2_rus,s1_rus,s2_rus,f = 0;
int jpn,u_jpn,m1_jpn,m2_jpn,s1_jpn,s2_jpn,g = 0;
int egy,u_egy,m1_egy,m2_egy,s1_egy,s2_egy,h = 0;
int zacasni;
long int zda;
// priprava za izpis UTC ure
if (niz1)
zacasni = atoi (niz1);
Potovalni računalnik z GPS Stran 93
zda = zacasni;
aus = zacasni;
chn = zacasni;
gbr = zacasni;
rus = zacasni;
jpn = zacasni;
egy = zacasni;
// izracun za izpis ure v New Yorku
zda = zda + 190000;
u_zda = zda/10000;
zda = zda-(u_zda*10000);
m1_zda = zda/1000;
zda = zda-(m1_zda*1000);
m2_zda = zda/100;
zda = zda-(m2_zda*100);
s1_zda = zda/10;
s2_zda = zda-(s1_zda*10);
niz1=0x00;
// izpis ure za Avstralijo
aus = aus + 110000;
u_aus = aus/10000;
aus = aus-(u_aus*10000);
m1_aus = aus/1000;
aus = aus-(m1_aus*1000);
m2_aus = aus/100;
aus = aus-(m2_aus*100);
s1_aus = aus/10;
s2_aus = aus-(s1_aus*10);
niz1=0x00;
if (u_aus == 24)
c = 1;
sprintf (izpis_sydney,"00:%d%d:%d%d",m1_aus,m2_aus,s1_aus,s2_aus);
if (u_aus > 24)
c = 1;
if (u_aus == 34)
sprintf (izpis_sydney,"10:%d%d:%d%d",m1_aus,m2_aus,s1_aus,s2_aus);
else
u_aus -=24;
sprintf (izpis_sydney,"0%d:%d%d:%d%d",u_aus,m1_aus,m2_aus,s1_aus,s2_aus);
if (c == 0)
sprintf (izpis_sydney,"%d:%d%d:%d%d",u_aus,m1_aus,m2_aus,s1_aus,s2_aus);
// izpis ure za Kitajsko
chn = chn + 80000;
u_chn = chn/10000;
chn = chn-(u_chn*10000);
m1_chn = chn/1000;
chn = chn-(m1_chn*1000);
m2_chn = chn/100;
chn = chn-(m2_chn*100);
s1_chn = chn/10;
s2_chn = chn-(s1_chn*10);
niz1=0x00;
if (u_chn == 24)
d = 1;
sprintf (izpis_shanghai,"00:%d%d:%d%d",m1_chn,m2_chn,s1_chn,s2_chn);
if (u_chn > 24)
d = 1;
u_chn -=24;
sprintf (izpis_shanghai,"0%d:%d%d:%d%d",u_chn,m1_chn,m2_chn,s1_chn,s2_chn);
Potovalni računalnik z GPS Stran 94
if (u_chn < 10)
d = 1;
sprintf (izpis_shanghai,"0%d:%d%d:%d%d",u_chn,m1_chn,m2_chn,s1_chn,s2_chn);
if (d == 0)
sprintf (izpis_shanghai,"%d:%d%d:%d%d",u_chn,m1_chn,m2_chn,s1_chn,s2_chn);
// izpis ure za Britanijo
u_gbr = gbr/10000;
gbr = gbr-(u_gbr*10000);
m1_gbr = gbr/1000;
gbr = gbr-(m1_gbr*1000);
m2_gbr = gbr/100;
gbr = gbr-(m2_gbr*100);
s1_gbr = gbr/10;
s2_gbr = gbr-(s1_chn*10);
niz1=0x00;
if (u_gbr < 10)
e = 1;
sprintf (izpis_london,"0%d:%d%d:%d%d",u_gbr,m1_gbr,m2_gbr,s1_gbr,s2_gbr);
if (u_gbr == 0)
e = 1;
sprintf (izpis_london,"00:%d%d:%d%d",m1_gbr,m2_gbr,s1_gbr,s2_gbr);
if (e == 0)
sprintf (izpis_london,"%d:%d%d:%d%d",u_gbr,m1_gbr,m2_gbr,s1_gbr,s2_gbr);
// izpis ure za Rusijo
rus = rus + 40000;
u_rus = rus/10000;
rus = rus-(u_rus*10000);
m1_rus = rus/1000;
rus = rus-(m1_rus*1000);
m2_rus = rus/100;
rus = rus-(m2_rus*100);
s1_rus = rus/10;
s2_rus = rus-(s1_rus*10);
niz1=0x00;
if (u_rus < 10)
f = 1;
sprintf (izpis_moskva,"0%d:%d%d:%d%d",u_rus,m1_rus,m2_rus,s1_rus,s2_rus);
if (u_gbr == 24)
f = 1;
sprintf (izpis_moskva,"00:%d%d:%d%d",m1_gbr,m2_gbr,s1_gbr,s2_gbr);
if (u_rus > 24)
f = 1;
u_rus -=24;
sprintf (izpis_moskva,"0%d:%d%d:%d%d",u_rus,m1_rus,m2_rus,s1_rus,s2_rus);
if (f == 0)
sprintf (izpis_moskva,"%d:%d%d:%d%d",u_rus,m1_rus,m2_rus,s1_rus,s2_rus);
// izpis ure za Japonsko
jpn = jpn + 90000;
u_jpn = jpn/10000;
jpn = jpn-(u_jpn*10000);
m1_jpn = jpn/1000;
jpn = jpn-(m1_jpn*1000);
m2_jpn = jpn/100;
jpn = jpn-(m2_jpn*100);
s1_jpn = jpn/10;
s2_jpn = jpn-(s1_jpn*10);
niz1=0x00;
Potovalni računalnik z GPS Stran 95
if (u_jpn == 24)
g = 1;
sprintf (izpis_tokyo,"00:%d%d:%d%d",m1_jpn,m2_jpn,s1_jpn,s2_jpn);
if (u_jpn > 24)
g = 1;
u_jpn -=24;
sprintf (izpis_tokyo,"0%d:%d%d:%d%d",u_jpn,m1_jpn,m2_jpn,s1_jpn,s2_jpn);
if (u_jpn < 10)
g = 1;
sprintf (izpis_tokyo,"0%d:%d%d:%d%d",u_jpn,m1_jpn,m2_jpn,s1_jpn,s2_jpn);
if (g == 0)
sprintf (izpis_tokyo,"%d:%d%d:%d%d",u_jpn,m1_jpn,m2_jpn,s1_jpn,s2_jpn);
// izpis ure za Egipt
egy = egy + 20000;
u_egy = egy/10000;
egy = egy-(u_egy*10000);
m1_egy = egy/1000;
egy = egy-(m1_egy*1000);
m2_egy = egy/100;
egy = egy-(m2_egy*100);
s1_egy = egy/10;
s2_egy = egy-(s1_egy*10);
niz1=0x00;
if (u_egy == 24)
h = 1;
sprintf (izpis_kairo,"00:%d%d:%d%d",m1_egy,m2_egy,s1_egy,s2_egy);
if (u_egy > 24)
h = 1;
u_egy -=24;
sprintf (izpis_kairo,"0%d:%d%d:%d%d",u_egy,m1_egy,m2_egy,s1_egy,s2_egy);
if (u_egy < 10)
h = 1;
sprintf (izpis_kairo,"0%d:%d%d:%d%d",u_egy,m1_egy,m2_egy,s1_egy,s2_egy);
if (h == 0)
sprintf (izpis_kairo,"%d:%d%d:%d%d",u_egy,m1_egy,m2_egy,s1_egy,s2_egy);
void IzpisHitrostUraDatum(char *niz1, char *niz2, char *niz3)
float hitrostkmh, hitrostms;
float zacasni;
float x = 0.539956803;
float y = 1.9438449;
int u1,u2,m1,m2,s1,s2;
int zacasni2;
int dan1,dan2,mesec,leto;
int zacasni3;
// priprava za izpis UTC ure
if (niz1)
zacasni = atof (niz1);
hitrostkmh = zacasni/x;
sprintf (izpis_hitrost_kmh,"%4.2f",hitrostkmh);
hitrostms = zacasni/y;
sprintf (izpis_hitrost_ms,"%4.2f",hitrostms);
Potovalni računalnik z GPS Stran 96
niz1=0x00;
// priprava za izpis UTC ure
if (niz2)
zacasni2 = atoi (niz2);
zacasni2 = zacasni2 + 10000;
u1 = zacasni2/100000;
zacasni2 = zacasni2-(u1*100000);
u2 = zacasni2/10000;
zacasni2 = zacasni2-(u2*10000);
m1 = zacasni2/1000;
zacasni2 = zacasni2-(m1*1000);
m2 = zacasni2/100;
zacasni2 = zacasni2-(m2*100);
s1 = zacasni2/10;
s2 = zacasni2-(s1*10);
niz2=0x00;
sprintf (izpis_ura,"%d%d:%d%d:%d%d",u1,u2,m1,m2,s1,s2);
if (niz3)
zacasni3 = atoi (niz3);
dan1 = zacasni3/100000;
zacasni3 = zacasni3-(dan1*100000);
dan2 = zacasni3/10000;
zacasni3 = zacasni3-(dan2*10000);
mesec = zacasni3/100;
zacasni3 = zacasni3-(mesec*100);
leto = 2000+zacasni3;
switch (mesec)
case 1:
sprintf (izpis_datum,"%d%d. januar %d",dan1,dan2,leto);
break;
case 2:
sprintf (izpis_datum,"%d%d. februar %d",dan1,dan2,leto);
break;
case 3:
sprintf (izpis_datum,"%d%d. marec %d",dan1,dan2,leto);
break;
case 4:
sprintf (izpis_datum,"%d%d. april %d",dan1,dan2,leto);
break;
case 5:
sprintf (izpis_datum,"%d%d. maj %d",dan1,dan2,leto);
break;
case 6:
sprintf (izpis_datum,"%d%d. junij %d",dan1,dan2,leto);
break;
case 7:
sprintf (izpis_datum,"%d%d. julij %d",dan1,dan2,leto);
break;
case 8:
sprintf (izpis_datum,"%d%d. avgust %d",dan1,dan2,leto);
break;
case 9:
sprintf (izpis_datum,"%d%d. september %d",dan1,dan2,leto);
break;
case 10:
sprintf (izpis_datum,"%d%d. oktober %d",dan1,dan2,leto);
break;
case 11:
sprintf (izpis_datum,"%d%d. november %d",dan1,dan2,leto);
break;
case 12:
sprintf (izpis_datum,"%d%d. december %d",dan1,dan2,leto);
break;
niz3=0x00;
Potovalni računalnik z GPS Stran 97
//typedef enum START_WAIT, RECEIVING, MSG_RECEIVED stanje = START_WAIT;
void __ISR(_UART1_VECTOR, ipl2)IntUart1Handler(void)
unsigned int SerRx;
//MSG_RECEIVED = 1;
RSFlag=0;
if (mU1RXGetIntFlag())
IFS0bits.U1RXIF = 0;
SerRx = ReadUART1();
RxCtr++;
RxCtr2++;
switch (RxCtr)
case 0:
if (SerRx=='$')
rx_buffer[RxCtr]=SerRx;
else
RxCtr=0;
break;
case 1:
if (SerRx=='G')
rx_buffer[RxCtr]=SerRx;
else
RxCtr=0;
break;
case 2:
if (SerRx=='P')
rx_buffer[RxCtr]=SerRx;
else
RxCtr=0;
break;
case 3:
if (SerRx=='R')
rx_buffer[RxCtr]=SerRx;
else
RxCtr=0;
break;
case 4:
if (SerRx=='M')
rx_buffer[RxCtr]=SerRx;
else
RxCtr=0;
break;
case 5:
if (SerRx=='C')
rx_buffer[RxCtr]=SerRx;
else
RxCtr=0;
break;
switch (RxCtr2)
case 0:
if (SerRx=='$')
rx_buffer2[RxCtr2]=SerRx;
else
RxCtr2=0;
break;
case 1:
if (SerRx=='G')
rx_buffer2[RxCtr2]=SerRx;
else
RxCtr2=0;
break;
case 2:
if (SerRx=='P')
rx_buffer2[RxCtr2]=SerRx;
else
Potovalni računalnik z GPS Stran 98
RxCtr2=0;
break;
case 3:
if (SerRx=='G')
rx_buffer2[RxCtr2]=SerRx;
else
RxCtr2=0;
break;
case 4:
if (SerRx=='G')
rx_buffer2[RxCtr2]=SerRx;
else
RxCtr2=0;
break;
case 5:
if (SerRx=='A')
rx_buffer2[RxCtr2]=SerRx;
else
RxCtr2=0;
break;
rx_buffer[RxCtr]=SerRx;
rx_buffer2[RxCtr2]=SerRx;
if (RxCtr == (RX_BUFFER_SIZE-1))
RxCtr = 0;
if (RxCtr2 == (RX_BUFFER_SIZE-1))
RxCtr2 = 0;
if ((SerRx == 0x0d)&&(RxCtr != 0))
memmove (gps_buffer,rx_buffer,RxCtr);
RSFlag = 1;
mU1RXClearIntFlag();
int razcleni_nmea (char *niz)
int ura, datum, hitrost,status;
float sirina,dolzina;
char *tok = strtok(niz,","); //gprmc
// ime = tok;
tok = strtok(0,","); //utc ura
ura = atoi (tok);
sprintf (UraBuffer,"%d",ura);
tok = strtok(0,","); //status
status = atoi (tok);
sprintf (StatusBuffer,"%d",status);
tok = strtok(0,","); //zemljepisna sirina
sirina = atof (tok);
sprintf (ZemljepisnaSirina,"%4.4f",sirina);
tok = strtok(0,","); //orientacija1
tok = strtok(0,","); //zemljepisna dolzina
dolzina = atof (tok);
sprintf (ZemljepisnaDolzina,"%4.4f",dolzina);
tok = strtok(0,","); //orientacija2
tok = strtok(0,","); //hitrost
hitrost = atof (tok);
sprintf (hitrost_buffer,"%4.7f",hitrost);
tok = strtok(0,","); //track
tok = strtok(0,","); //datum
datum = atoi (tok);
sprintf (datum_buffer,"%d",datum);
tok = strtok(0,","); //magnetic
tok = strtok(0,","); //orientacija3
tok = strtok(0,","); //mode indicator
tok = strtok(0,","); //checksum
int razcleni_nmea2 (char *niz)
Potovalni računalnik z GPS Stran 99
float nadmorska;
char *tok = strtok(niz,","); //gpgga
tok = strtok(0,","); //utc ura
tok = strtok(0,","); //zemljepisna sirina
tok = strtok(0,","); //orientacija1
tok = strtok(0,","); //zemljepisna dolzina
tok = strtok(0,","); //orientacija2
tok = strtok(0,","); //kvaliteta
tok = strtok(0,","); //stevilo satelitov
tok = strtok(0,","); //HDOP
tok = strtok(0,","); //antena
tok = strtok(0,","); //metri
tok = strtok(0,","); //nadmorska
nadmorska = atof (tok);
sprintf (NadmorskaVisina,"%4.2f m",nadmorska);
tok = strtok(0,","); //metri
tok = strtok(0,","); //obdobje
tok = strtok(0,","); //ID
tok = strtok(0,","); //checksum
/////////////////////////////////////////////////////////////////////////////
// Function: Timer3 ISR
// Input: none
// Output: none
// Overview: increments tick counter. Tick is approx. 1 ms.
/////////////////////////////////////////////////////////////////////////////
#ifdef __PIC32MX__
#define __T3_ISR __ISR(_TIMER_3_VECTOR, ipl4)
#else
#define __T3_ISR __attribute__((interrupt, shadow, auto_psv))
#endif
/* */
void __T3_ISR _T3Interrupt(void)
TMR3 = 0;
// Clear flag
#ifdef __PIC32MX__
mT3ClearIntFlag();
#else
IFS0bits.T3IF = 0;
#endif
TouchDetectPosition();
/////////////////////////////////////////////////////////////////////////////
// Function: void TickInit(void)
// Input: none
// Output: none
// Overview: Initilizes the tick timer.
/////////////////////////////////////////////////////////////////////////////
/*********************************************************************
* Section: Tick Delay
*********************************************************************/
#define SAMPLE_PERIOD 500 // us
#define TICK_PERIOD (GetPeripheralClock() * SAMPLE_PERIOD) / 4000000
/* */
void TickInit(void)
// Initialize Timer4
#ifdef __PIC32MX__
OpenTimer3(T3_ON | T3_PS_1_8, TICK_PERIOD);
ConfigIntTimer3(T3_INT_ON | T3_INT_PRIOR_4);
#else
TMR3 = 0;
Potovalni računalnik z GPS Stran 100
PR3 = TICK_PERIOD;
IFS0bits.T3IF = 0; //Clear flag
IEC0bits.T3IE = 1; //Enable interrupt
T3CONbits.TON = 1; //Run timer
#endif
/////////////////////////////////////////////////////////////////////////////
// Function: InitializeBoard()
// Input: none
// Output: none
// Overview: Initializes the hardware components including the PIC device
// used.
/////////////////////////////////////////////////////////////////////////////
void InitializeBoard(void)
#if defined (PIC24FJ256DA210_DEV_BOARD) && defined(USE_KEYBOARD)
ANSA = 0x0000;
ANSB = 0x0020; // RB5 as potentiometer input
ANSC = 0x0010; // RC4 as touch screen X+, RC14 as external source of secondary
oscillator
ANSD = 0x0000;
ANSE = 0x0000; // RE9 used as S2
ANSF = 0x0000;
ANSG = 0x0080; // RG8 used as S1, RG7 as touch screen Y+
#else
/////////////////////////////////////////////////////////////////////////////
// ADC Explorer 16 Development Board Errata (work around 2)
// RB15 should be output
/////////////////////////////////////////////////////////////////////////////
#ifndef MEB_BOARD
LATBbits.LATB15 = 0;
TRISBbits.TRISB15 = 0;
#endif
#endif
#ifdef MEB_BOARD
CPLDInitialize();
CPLDSetGraphicsConfiguration(GRAPHICS_HW_CONFIG);
CPLDSetSPIFlashConfiguration(SPI_FLASH_CHANNEL);
#endif // #ifdef MEB_BOARD
#if defined(__dsPIC33F__) || defined(__PIC24H__) || defined(__dsPIC33E__) ||
defined(__PIC24E__)
// Configure Oscillator to operate the device at 40Mhz
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
#if defined(__dsPIC33E__) || defined(__PIC24E__)
//Fosc = 8M * 60/(2*2) = 120MHz for 8M input clock
PLLFBD = 58; // M=60
#else
// Fosc= 8M*40(2*2)=80Mhz for 8M input clock
PLLFBD = 38; // M=40
#endif
CLKDIVbits.PLLPOST = 0; // N1=2
CLKDIVbits.PLLPRE = 0; // N2=2
OSCTUN = 0; // Tune FRC oscillator, if FRC is used
// Disable Watch Dog Timer
RCONbits.SWDTEN = 0;
// Clock switching to incorporate PLL
__builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary
// Oscillator with PLL (NOSC=0b011)
__builtin_write_OSCCONL(0x01); // Start clock switching
while(OSCCONbits.COSC != 0b011);
Potovalni računalnik z GPS Stran 101
// Wait for Clock switch to occur
// Wait for PLL to lock
while(OSCCONbits.LOCK != 1)
;
#if defined(__dsPIC33F__) || defined(__PIC24H__)
// Set PMD0 pin functionality to digital
AD1PCFGL = AD1PCFGL | 0x1000;
#if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__)
AD1PCFGLbits.PCFG6 = 1;
AD1PCFGLbits.PCFG7 = 1;
AD1PCFGLbits.PCFG8 = 1;
#endif
#elif defined(__dsPIC33E__) || defined(__PIC24E__)
ANSELE = 0x00;
ANSELDbits.ANSD6 = 0;
// Set all touch screen related pins to Analog mode.
ANSELBbits.ANSB11 = 1;
#endif
#elif defined(__PIC32MX__)
INTEnableSystemMultiVectoredInt();
SYSTEMConfigPerformance(GetSystemClock());
#endif // #if defined(__dsPIC33F__) || defined(__PIC24H__)
#if defined (EXPLORER_16)
/************************************************************************
* For Explorer 16 RD12 is connected to EEPROM chip select.
* To prevent a conflict between this EEPROM and SST25 flash
* the chip select of the EEPROM SPI should be pulled up.
************************************************************************/
// Set IOs directions for EEPROM SPI
MCHP25LC256_CS_LAT = 1; // set initial CS value to 1 (not asserted)
MCHP25LC256_CS_TRIS = 0; // set CS pin to output
#endif // #if defined (EXPLORER_16)
// Initialize graphics library and create default style scheme for GOL
GOLInit();
// Set the other chip selects to a known state
#ifdef MIKRO_BOARD
// SD Card chip select
LATGbits.LATG9 = 1;
TRISGbits.TRISG9 = 0;
// MP3 Codac
// reset
LATAbits.LATA5 = 0;
TRISAbits.TRISA5 = 0;
// chip select
LATAbits.LATA2 = 1;
TRISAbits.TRISA2 = 0;
// chip select
LATAbits.LATA3 = 1;
TRISAbits.TRISA3 = 0;
AD1PCFGbits.PCFG11 = 1;
AD1PCFGbits.PCFG10 = 1;
#endif
//The following are PIC device specific settings for the SPI channel
//used.
//Set IOs directions for SST25 SPI
#if defined (GFX_PICTAIL_V3) || defined (MEB_BOARD) || defined(GFX_PICTAIL_LCC) ||
defined(MIKRO_BOARD) || defined(GFX_PICTAIL_V3E)
SST25_CS_LAT = 1;
SST25_CS_TRIS = 0;
Potovalni računalnik z GPS Stran 102
#ifndef __PIC32MX__
SST25_SCK_TRIS = 0;
SST25_SDO_TRIS = 0;
SST25_SDI_TRIS = 1;
#if defined(__PIC24FJ256GB210__) || defined(__dsPIC33E__) ||
defined(__PIC24E__)
SST25_SDI_ANS = 0;
#endif
#endif
#elif defined (PIC24FJ256DA210_DEV_BOARD)
SST25_CS_LAT = 1;
SST25_CS_TRIS = 0;
// Set the pins to be digital
SST25_SDI_ANS = 0;
SST25_SDO_ANS = 0;
SST25_SCK_TRIS = 0;
SST25_SDO_TRIS = 0;
SST25_SDI_TRIS = 1;
#endif
// set the peripheral pin select for the PSI channel used
#if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__)
AD1PCFGL = 0xFFFF;
RPOR9bits.RP18R = 11; // assign RP18 for SCK2
RPOR8bits.RP16R = 10; // assign RP16 for SDO2
RPINR22bits.SDI2R = 17; // assign RP17 for SDI2
#elif defined(__PIC24FJ256GB110__) || defined(__PIC24FJ256GA110__) || defined
(__PIC24FJ256GB210__)
__builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS
RPOR10bits.RP21R = 11; // assign RP21 for SCK2
RPOR9bits.RP19R = 10; // assign RP19 for SDO2
RPINR22bits.SDI2R = 26; // assign RP26 for SDI2
__builtin_write_OSCCONL(OSCCON | 0x40); // lock PPS
#elif defined(__PIC24FJ256DA210__)
__builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS
#if (SST25_SPI_CHANNEL == 1)
RPOR1bits.RP2R = 8; // assign RP2 for SCK1
RPOR0bits.RP1R = 7; // assign RP1 for SDO1
RPINR20bits.SDI1R = 0; // assign RP0 for SDI1
#elif (SST25_SPI_CHANNEL == 2)
RPOR1bits.RP2R = 11; // assign RP2 for SCK2
RPOR0bits.RP1R = 10; // assign RP1 for SDO2
RPINR22bits.SDI2R = 0; // assign RP0 for SDI2
#endif
__builtin_write_OSCCONL(OSCCON | 0x40); // lock PPS
#endif
// initialize the Flash Memory driver
FlashInit(&SPI_Init_Data);
// initialize the timer that manages the tick counter
TickInit();
// initialize the components for Resistive Touch Screen
TouchInit(NVMWrite, NVMRead, NVMSectorErase, TOUCH_INIT_VALUES);
HardwareButtonInit(); // Initialize the hardware buttons
Potovalni računalnik z GPS Stran 103
7.2 Naslov študenta
Ime in priimek: Domen Murn
Naslov: Planinska cesta 19a
Pošta: 8290 Sevnica
Tel.študenta: 040-514-980
e-mail študenta: [email protected]
7.3 Kratek ţivljenjepis
Rojen: 21.7.1980
Šolanje: OŠ Jurija Dalmatina Krško;
Štiriletni program tehniškega izobraţevanja – elektrotehnik (Srednja šola Krško);
FERI MB, Elektrotehnika – Elektronika
Potovalni računalnik z GPS Stran 104
Potovalni računalnik z GPS Stran 105
Potovalni računalnik z GPS Stran 106