Exercise+5.2

=Exercise 1= toc I denne opgave skal vi lave en funktion kaldet airspeedHdl den skal fungere som skal bruge receiveMsg fra opgave 5.1, dvs. den skal vente på et input fra en message kø og udskriver den modtaget værdi i konsollen.

code format="cpp" void* airspeedHdl(void* dummy) {   AirspeedMsg airSpeed; // Kø ID bliver oprettet long int id = msgget((key_t) 201, 0666 | IPC_CREAT); while(true) {   receiveMsg((int) id, airSpeed); cout << "\nAirspeed: " << airSpeed.getSpeed << endl; }   return 0; } code På samme måde skal vi lave funktion headingHdl code format="cpp" void* headingHdl(void* dummy) {   HeadingMsg heading; // Kø ID bliver oprettet long int id = msgget((key_t) 202, 0666 | IPC_CREAT); while(true) {   receiveMsg((int) id, heading); cout << "\nHeading: " << heading.getHeading << endl; }   return 0; } code

=Exercise 2= I denne opgave opretter vi funktionen interpreter den skal vente på et input fra funktionen inputHdl. Når interpreter modtager data, fra input message køen skal den sende den indtastede værdi videre til den korrekte message kø, dvs. enten airspeed eller heading.

code format="cpp" void* interpreter(void* dummy) {   InputMsg inter; AirspeedMsg air; HeadingMsg head;

long int id = msgget((key_t) 200, 0666 | IPC_CREAT); while(true){ receiveMsg((int) id, inter);

if (inter.getInputType == InputMsg::AIRSPEED) {       cout << "\nMODTAGET AIRSPEED" << endl; long int id_air = msgget((key_t) 201, 0666 | IPC_CREAT); air.setSpeed(inter.getInputValue); sendMsg((int)id_air, air); }   if (inter.getInputType == InputMsg::HEADING) {       long int id_head = msgget((key_t) 202, 0666 | IPC_CREAT); head.setHeading(inter.getInputValue); sendMsg((int)id_head, head); }   }    return 0; } code

=Exercise 3= Vi opretter funktionen inputHdl, som skal udskrive en tekst hvor brugeren bliver bedt om at vælge om det er (a)irspeed eller (h)eading værdi han vil ændre. Til at tjekke på hvilken tast brugeren har trykket bruger vi en switch/case. Hvis han trykker "q" skal programmet lukke, dette gøres ved at release en semafor, som bliver medsendt. Når brugeren har indtastet en korrekt værdi skal denne ved hjælp af input message køen sendes videre til interpreter.

code format="cpp" void* inputHdl(void* quitSemId) {   sem_t* semId = (sem_t*) (quitSemId); bool XHead = false, XAir = false; char T;   unsigned int tal, tal2; InputMsg input;

while(true){ cout << "(A)irspeed, (H)eading, (Q)uit: "; cin >> T;

long int id = msgget((key_t) 200, 0666 | IPC_CREAT);

switch (T) {   case 'a' : input.setInputType(InputMsg::AIRSPEED); do{ cout << "\nEnter airspeed between 100 and 800: "; cin >> tal; if (tal > 99 && tal < 801) XAir = true; else cout << "\nError: Airspeed must be between 100 and 800" << endl; } while(XAir == false); input.setInputValue(tal); sendMsg((int)id, input); break;

case 'h' : input.setInputType(InputMsg::HEADING); do { cout << "\nEnter heading between 0 and 360: "; cin >> tal2; if (tal2 > 0 && tal2 < 361 || tal2 == 0) XHead = true; else cout << "\nError: heading must be between 0 and 360" << endl; } while(XHead == false); input.setInputValue(tal2); sendMsg((int)id, input); break;

case 'q' : sem_post(semId); }

}   return 0; } code

=Exercise 4= I denne sidste opgave skal vi oprette en main, men denne har vi fået sammen med handout. Vi har testet vores system således at følgende scenario er opfyldt:

INP: What do you wish to set: (A)irspeed, (H)eading or 'Q' to quit? A INP: Enter airspeed between 100 and 800: 240 SPD: speed set to 240 kts INP: What do you wish to set: (A)irspeed, (H)eading or 'Q' to quit? H INP: Enter heading between 0 and 360: 3360 INP: Error: heading must be between 0 and 360 INP: Enter heading between 0 and 360: 120 HDG: heading set to 120 degs INP: What do you wish to set: (A)irspeed, (H)eading or 'Q' to quit? Q Good bye...