Avatar billede shadowmage Nybegynder
21. august 2003 - 09:43 Der er 20 kommentarer og
1 løsning

Hjælp til forklaring af C++ projekt.

Hejsa alle.

Jeg er ved vejs ende af et skoleophold, hvor vi har haft fire uger til lære og lave et vejrkit i C/C++. Ved hjælp af et kit og pc, så kan man via knapper sætte vindstyrke, lufttryk og vindretning og på pc'en skal man sætte en grafisk system op (i tekstmode) og vise det på skærmen, samt lave en logfil.

Jeg har nu fået møget til at fungere (med meget hjælp fra forskellige kilder), men jeg frygter forsvaret af projektet der kommer en gang i næste uge. Jeg er nemlig i tvivl i en hel del af de funktioner og kommandoer der stå i projektet.

Så hvis en kunne være så elskværdig at skrive en linie eller to til hver lille ting der står (jeg ved det, kæmpe projekt) og forklare hvad de forskellige ting gør.



#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <bios.h>
#include <dos.h>
#include <time.h>

#define COM1    0
#define COM2    1
#define SETTINGS _COM_4800 | _COM_CHR8 | _COM_STOP1 | _COM_NOPARITY
#define DataReady 0x100

//Global karakter
unsigned char InDat[4];


/*******************************************************/
/*            Initialisering af seriel                */
/*******************************************************/

void init(void)
{
  _bios_serialcom(_COM_INIT, COM1, SETTINGS);
}

/*******************************************************/
/*                Seriel funktion                    */
/*******************************************************/

void seriel(void)
{
    init();
    int status;
    char i = 0; //S‘tter i til nul.

    _bios_serialcom(_COM_RECEIVE, COM1, 0);
    _bios_serialcom(_COM_SEND, COM1, 0x7F);

    while(i < 3)
    {
        status = _bios_serialcom(_COM_STATUS, COM1, 0);

        if(status & DataReady)
            InDat[i++] = _bios_serialcom(_COM_RECEIVE, COM1, 0);
    }
}
/*******************************************************/
/*                          Log                        */
/*******************************************************/

int log(float vh, float lt)

{
    int handle;
    char date[30], name[12];
    static time_t oldtid;

    time_t nytid;
    struct time t;
    struct date d;
    gettime(&t);
    getdate(&d);

    nytid = time(NULL);
    if (nytid > oldtid)
    {
        oldtid = nytid + 9;
        textcolor(LIGHTGRAY);
        gotoxy(45, 1);
        cprintf("Sidst skrevet til logfilen: %02d:%02d:%02d\n", t.ti_hour, t.ti_min, t.ti_sec);

        sprintf(date, "%02d:%02d:%02d;%.2f;%.2f\n", t.ti_hour, t.ti_min, t.ti_sec, vh, lt);
        sprintf(name, "%4d%02d%02d.csv", d.da_year, d.da_mon, d.da_day);

        handle = open(name, O_CREAT | O_WRONLY | O_APPEND | O_TEXT);
        write(handle, date, strlen(date));
        close(handle);
    }
    return(0);
}

/*******************************************************/
/*                    Sk‘rm Layout                    */
/*******************************************************/

void layout(void)
{
    _setcursortype(_NOCURSOR);
    textcolor(CYAN);
    gotoxy(5, 3);     cprintf("Beskrivelse af nuv‘rende vejrforhold:");

    textcolor(LIGHTGREEN);
    gotoxy(16, 9); cprintf("Vindhastighed:");
    gotoxy(33, 9); cprintf("Tidspunkt:");
    gotoxy(47, 9); cprintf("Luftryk:");
    gotoxy(59, 9); cprintf("Tidspunkt:");
    gotoxy(2, 11); cprintf("Nuv‘rende: ");
    gotoxy(2, 12); cprintf("--------------------------------------------------------------------------");
    gotoxy(2, 14); cprintf("Maksv‘rdi: ");
    gotoxy(2, 15); cprintf("--------------------------------------------------------------------------");
    gotoxy(2, 17); cprintf("Minimunv‘rdi: ");
    gotoxy(2, 18); cprintf("--------------------------------------------------------------------------");

    textcolor(YELLOW);
    gotoxy(3, 20);  cprintf("Vindhastigheden i forskellige enheder:");

    textcolor(WHITE);
    gotoxy(5, 23);
    cprintf("0        1        2        3        4        5");
    gotoxy(5, 25);
    cprintf("0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0");

}

/*******************************************************/
/*                        Time                        */
/*******************************************************/

void time(void)
{
    char klokken[12];
    struct time t;
    struct date d;
    gettime(&t);
    getdate(&d);

    sprintf(klokken, "%02d:%02d:%02d\n", t.ti_hour, t.ti_min, t.ti_sec);

    textcolor(LIGHTGRAY);
    gotoxy(1, 1);    
    cprintf("%4d-%02d-%02d", d.da_year, d.da_mon, d.da_day);
    gotoxy(14, 1);  cprintf(klokken);
    gotoxy(33, 11);    cprintf(klokken);
    gotoxy(60, 11); cprintf(klokken);
}

/*******************************************************/
/*                Signal/Styrke/Forhold                */
/*******************************************************/

void signal(float vh)
{
    textcolor(CYAN);
    if(vh < 0.3)
    {
        gotoxy(7, 6);
        cprintf("Signal ' ' - Styrke '0' - 'Stille'          ");
    }

    if(vh >= 0.3 & vh < 1.6)
    {
        gotoxy(7, 6);
        cprintf("Signal ' ' - Styrke '1' - 'N‘sten stille'  ");
    }

    if(vh >= 1.6 & vh < 3.40)
    {
        gotoxy(7, 6);
        cprintf("Signal '1' - Styrke '2' - 'Svag vind'      ");
    }

    if(vh >= 3.40 & vh < 5.50)
    {
        gotoxy(7, 6);
        cprintf("Signal '1' - Styrke '3' - 'Let vind'        ");
    }

    if(vh >= 5.50 & vh < 8.0)
    {
        gotoxy(7, 6);
        cprintf("Signal '1' - Styrke '4' - 'J‘vn vind'      ");
    }

    if(vh >= 8.0 & vh < 10.80)
    {
        gotoxy(7, 6);
        cprintf("Signal '2' - Styrke '5' - 'Frisk vind'      ");
    }

    if(vh >= 10.80 & vh < 13.90)
    {
        gotoxy(7, 6);
        cprintf("Signal '2' - Styrke '6' - 'H†rd vind'      ");
    }

    if(vh >= 13.90 & vh < 17.20)
    {
        gotoxy(7, 6);
        cprintf("Signal '3' - Styrke '7' - 'Stiv kuling'    ");
    }

    if(vh >= 17.20 & vh < 20.80)
    {
        gotoxy(7, 6);
        cprintf("Signal '3' - Styrke '8' - 'H†rd kuling'    ");
    }

    if(vh >= 20.80 & vh < 24.50)
    {
        gotoxy(7, 6);
        cprintf("Signal '4' - Styrke '9' - 'Stormende kuling'");
    }

    if(vh >= 24.50 & vh < 28.50)
    {
        gotoxy(7, 6);
        cprintf("Signal '4' - Styrke '10' - 'Storm'          ");
    }

    if(vh >= 28.50 & vh < 32.80)
    {
        gotoxy(7, 6);
        cprintf("Signal '5' - Styrke '11' - 'St‘rk storm'    ");
    }

    if(vh > 32.80)
    {
        gotoxy(7, 6);
        cprintf("Signal '5' - Styrke '12' - 'Orkan'          ");
    }
}

/*******************************************************/
/*                      Vind retning                  */
/*******************************************************/

void retning(char kompas)
{
    textcolor(CYAN);
    gotoxy(7, 5); cprintf("Det bl‘ser fra");
    switch(kompas)
    {
        case 0x00: gotoxy(22, 5); cprintf("N  "); break;
        case 0x01: gotoxy(22, 5); cprintf("NNE"); break;
        case 0x03: gotoxy(22, 5); cprintf("NE "); break;
        case 0x02: gotoxy(22, 5); cprintf("ENE"); break;
        case 0x06: gotoxy(22, 5); cprintf("E  "); break;
        case 0x07: gotoxy(22, 5); cprintf("ESE"); break;
        case 0x04: gotoxy(22, 5); cprintf("SSE"); break;
        case 0x0C: gotoxy(22, 5); cprintf("S  "); break;
        case 0x0D: gotoxy(22, 5); cprintf("SSW"); break;
        case 0x0F: gotoxy(22, 5); cprintf("SW "); break;
        case 0x0E: gotoxy(22, 5); cprintf("WSW"); break;
        case 0x0A: gotoxy(22, 5); cprintf("W  "); break;
        case 0x0B: gotoxy(22, 5); cprintf("WNW"); break;
        case 0x09: gotoxy(22, 5); cprintf("NW "); break;
        case 0x08: gotoxy(22, 5); cprintf("NNW"); break;
    }
}

/*******************************************************/
/*                  Max/min v‘rdier                  */
/*******************************************************/


void minmax(float vh, float lt)
{
    static float minvh = 51, maxvh, minlt = 1100, maxlt;
    char print1[25] = "", print2[25] = "", print3[25] = "", print4[25] = "", tid[12];
    struct time t;
    gettime(&t);
    sprintf(tid, "%02d:%02d:%02d\n", t.ti_hour, t.ti_min, t.ti_sec);

    if (vh < minvh)
    {
        minvh = vh;
        sprintf(print1, "%6.2f m/s      %s", minvh, tid);
    }

    if (vh > maxvh)
    {
        maxvh = vh;
        sprintf(print2, "%6.2f m/s      %s", maxvh, tid);
    }

    if(lt < minlt)
    {
        minlt = lt;
        sprintf(print3, "%6.1f mBar    %s", minlt, tid);
    }

    if(lt > maxlt)
    {
        maxlt = lt;
        sprintf(print4, "%6.1f mBar    %s", maxlt, tid);
    }
    textcolor(LIGHTGRAY);
    gotoxy(17, 17); cprintf(print1);
    gotoxy(17, 14); cprintf(print2);
    gotoxy(45, 17); cprintf(print3);
    gotoxy(45, 14); cprintf(print4);
}

/*******************************************************/
/*            Udskrift af indkommende Data            */
/*******************************************************/

float data(void)
{

    char kompas, i;
    float vh, lt, km, mi, knob;

    i = (InDat[2] >> 2) & 0x03;
    vh = (0.05 * (float)InDat[0]) + (12.75 * (float)i);

    i = InDat[2] & 0x03;
    lt = (0.29411 * (float)InDat[1]) + (75 * (float)i) + 800;

    kompas = (InDat[2] >> 4) &  0x0F;

    km = (vh * 3.6);
    mi = ((float)vh * 2.24);
    knob = ((float)vh * 1.94384617);

    signal(vh);
    retning(kompas);
    minmax(vh, lt);
    log(vh, lt);

    textcolor(LIGHTGRAY);
    gotoxy(17, 11); cprintf("%6.2f m/s", vh);
    gotoxy(45, 11); cprintf("%6.1f mBar", lt);
    textcolor(YELLOW);
    gotoxy(5, 21); cprintf("Vinden bl‘ser med: %3.2f m/s. %3.2f km/t. %3.2f mi/t. %3.2f knob.", vh, km, mph, knob);

    return(vh);
}

/*******************************************************/
/*                        M†lebar                    */
/*******************************************************/

void bar(float vh)
{

    int i;

    textcolor(BLACK);
    gotoxy(5, 24);
    for(i = 0; i < 75; i++)
        cprintf("Û");

    if(vh < 1.6)
    {
        gotoxy(5, 24);
        textcolor(LIGHTBLUE);
        cprintf("Û");
    }

    if(vh >= 2 & vh < 14)
    {
        gotoxy(5, 24);
        textcolor(LIGHTBLUE);
        cprintf("ÛÛ");
        textcolor(LIGHTGREEN);
        for(i = 2; i < vh; i++)
            cprintf("Û");
    }

    if(vh >= 14 & vh < 29)
    {
        gotoxy(5, 24);
        textcolor(LIGHTBLUE);
        cprintf("ÛÛ");
        textcolor(LIGHTGREEN);
        cprintf("ÛÛÛÛÛÛÛÛÛÛÛÛ");
        textcolor(YELLOW);
        for(i = 14; i < vh; i++)
            cprintf("Û");
    }

    if(vh > 29)
    {
        gotoxy(5, 24);
        textcolor(LIGHTBLUE);
        cprintf("ÛÛ");
        textcolor(LIGHTGREEN);
        cprintf("ÛÛÛÛÛÛÛÛÛÛÛÛ");
        textcolor(YELLOW);
        cprintf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ");
        textcolor(RED);
        for(i = 29; i < vh; i++)
                cprintf("Û");
    }

}

/*******************************************************/
/*                        MAIN                        */
/*******************************************************/

void main(void)
{
    float vh;
    clrscr();

    while(!kbhit())
    {
        seriel();
        time();
        vh = data();
        layout();
//        log();
        bar(vh);
    }
}
Avatar billede Diojr Praktikant
21. august 2003 - 09:44 #1
Umiddelbart tror jeg det smarteste ville være, hvis du simpelthen havde lavet din egen kode...
Avatar billede martin.jensen Nybegynder
21. august 2003 - 09:47 #2
At begynde at forklare i detaljer hvad hver enkelt funktio gør er nok lidt mere end man normalt ville gøre her. Kan du ikke udpege præcist hvad det er du gerne vil vide lidt om i koden.
Avatar billede shadowmage Nybegynder
21. august 2003 - 09:54 #3
Hmmm...tjo, det er måske rimelig meget. Men jeg har faktisk lavet det meste. Bare med hjælp fra folk. Har nu kun haft to uger til at lære det, og to uger til lave projektet. Det er begrænset hvor effektiv man kan blive af det.

Men især funktionen "seriel" er lidt mystisk overfor mig.

"Log" gemmer sig også lidt i skyggerne. Især angående time.
   
  " time_t nytid;
    struct time t;
    struct date d;
    gettime(&t);
    getdate(&d);

    nytid = time(NULL); "

Nå man laver en variable "static", hvad gør man så helt præcis?
Avatar billede squashguy Nybegynder
21. august 2003 - 09:58 #4
som jeg ser det, læser seriel 3 bytes fra din comport.

static bevarer indholdet af din variablen til næste funktionskald.
Avatar billede arne_v Ekspert
21. august 2003 - 09:59 #5
Når man laver en variabel inde i en funktion statis, så bevares værdien
mellem kald af funktionen.

Når man laver en variabel udenfor funktioer static så kan den kun
ses af funktioner i samme fil.
Avatar billede mcgoat Nybegynder
21. august 2003 - 10:00 #6
Har selv været på det ophold... man kan sagtens nå at lave det hele selv, man har jo en lære at spørge hvis man ikke kan finde ud af det...
Så ville nok have været en god ide at lave det selv fra starten af...
Avatar billede squashguy Nybegynder
21. august 2003 - 10:05 #7
mcgoat... det kommer an på hvor mange timer man sidder med 7-kabalen...
Avatar billede shadowmage Nybegynder
21. august 2003 - 10:06 #8
Yæs yæs...

Men min hjerne har ikke absorberet alt hvad der poppet ud, og mange af de ting som vi har lavet - har læren selv skrevet. Noget copy-paste fra hans side. Uden den store forklaring på hvordan og hvorledes.

Jeg har i store træk styr på hvordan min kode virker. Men jeg er lidt usikker, da jeg ikke føler at jeg kan med 100 % sikkerhed forklare de enkelte liniers funktioner.
Avatar billede arne_v Ekspert
21. august 2003 - 10:07 #9
struct time
struct date
gettime
getdate

siger navnene jo nærmest hvad de gør.

De er iævrigt ikke ikke-standard.

time

er derimod standard og normalt ville man bruge time sammen med
f.eks. localtime til at lave det andet med.
Avatar billede arne_v Ekspert
21. august 2003 - 10:09 #10
time returnerer en time_t.

Normalt er time_t bare et andet navn for en int og den indeholder
normalt antal sekunder siden 1. januar 1970.
Avatar billede shadowmage Nybegynder
21. august 2003 - 10:14 #11
Angående min seriel funktion.

Så vidt jeg kan regne ud, så sender den 0x7F og henter data på com. Men når vi går ind i min "if".
if(status & DataReady)

Hvad betyder det? Hvis: status & DataReady? Hvis hvad? Hvad skal der opfyldes før at gøre den if?
Avatar billede mcgoat Nybegynder
21. august 2003 - 10:21 #12
Mener at kunne huske at det betyder at hvis porten er klar OG der er data klar til afhentning på porten
Avatar billede mcgoat Nybegynder
21. august 2003 - 10:22 #13
yes yes, det er det vist.....
Avatar billede fn1977 Nybegynder
21. august 2003 - 10:26 #14
if komandoen er sandt hvis værdien er større end null... eller som i dette tilfælde hvid det indeholder noget... status og DataReady er defineret inden for ti linjer før
Avatar billede shadowmage Nybegynder
21. august 2003 - 10:27 #15
Okay. Tak.

Så, angående min log funktion.

Istedet for vores standard "void xxx(void)", så er det int xxx(variabler).

Hvilken forskel gør det, og hvorfor skal man så have en return til slut?
Avatar billede martin.jensen Nybegynder
21. august 2003 - 10:29 #16
Den type der står foran din funktion er den type som funktionen returnerer. Void betyder "ingenting" og fortæller at denne type ikke returnerer noget som helst og derfor ikke behøver en return() funktionskald til sidst. Så¨grunden til at din int xxx() skal have en return er fordi funktionen er angivet til at returnerer en int.
Avatar billede squashguy Nybegynder
21. august 2003 - 10:33 #17
status & DataReady: kontrollerer om bit 2 er sat
Avatar billede martin.jensen Nybegynder
21. august 2003 - 10:38 #18
status & DataReady: kontrollerer om bit 8 er sat og ikke bit 2 :-)
Avatar billede squashguy Nybegynder
21. august 2003 - 10:40 #19
hehe korrekt, sad lige i min egen drømmeverden :)
Avatar billede martin.jensen Nybegynder
21. august 2003 - 10:43 #20
Her er for øvrigt en glimrende side der måske kan hjælpe lidt mht. COM portens opsætning og nogle af de variable der bliver brugt i dit program.

http://www.metlin.org/pgms/rs232.html
Avatar billede mcgoat Nybegynder
03. september 2003 - 09:32 #21
mjallow....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester