program Main_Roboter; type stan = record MOUzatrzymany: boolean; SAczujnikA: SensorState; ELwejscie: integer; SCczujnikC: SensorState; MPpozycia: integer; KLdlugosc: integer; AL1wyjscieJeden: integer; AL2wyjscieDwa: integer; AL3wyjscieTrzy: integer; SDczujnikD: SensorState; SEczujnikE: SensorState; SFczujnikF: SensorState; CDguzikD: ControlState; CEguzikE: ControlState; CFguzikF: ControlState; GRIPtrzyma: boolean; LPostatniapozycia: integer; RRrobin: integer; DIRukas: integer; end; pozyciaKartezyczna = record x, y, z: real; inklinacia, rotacia: real; end; pozyciaCylindryczna = record cialo, inklinacia, rotacia: real; radius, z: real; end; const WYS_KLOCKA = 25; MAKS_ILOSC_KLOCKOW = 5; OFFSET_WYSOKOSCIOWY = 22; OFFSET_GET = 4; OFFSET_PUT = 4; var okno: Rect; win: WindowPtr; winRec: WindowRecord; predkosc: integer; czasowy: boolean; naszStan: stan; naszStanKopia: stan; literka: char; sukces: boolean; pozKart: array[0..10] of pozyciaKartezyczna; pozCyl: array[0..5] of pozyciaCylindryczna; procedure ZrobKopieStanu; begin with naszStanKopia do begin MOUzatrzymany := naszStan.MOUzatrzymany; SAczujnikA := naszStan.SAczujnikA; ELwejscie := naszStan.ELwejscie; SCczujnikC := naszStan.SCczujnikC; MPpozycia := naszStan.MPpozycia; KLdlugosc := naszStan.KLdlugosc; AL1wyjscieJeden := naszStan.AL1wyjscieJeden; AL2wyjscieDwa := naszStan.AL2wyjscieDwa; AL3wyjscieTrzy := naszStan.AL3wyjscieTrzy; SDczujnikD := naszStan.SDczujnikD; SEczujnikE := naszStan.SEczujnikE; SFczujnikF := naszStan.SFczujnikF; CDguzikD := naszStan.CDguzikD; CEguzikE := naszStan.CEguzikE; CFguzikF := naszStan.CFguzikF; GRIPtrzyma := naszStan.GRIPtrzyma; LPostatniapozycia := naszStan.LPostatniapozycia; RRrobin := naszStan.RRrobin; DIRukas := naszStan.DIRukas; end; end; procedure WypiszStan; begin writeln(''); writeln(''); writeln('D‘st as eisen (onsen) Zoustand:'); with naszStan do begin writeln('Ofbroch duerch de Benotzer: ', MOUzatrzymany); writeln('Mir sin an Direktiv ', DIRukas); writeln('Et lait eppes am Agang: ', SAczujnikA); writeln('Et sin ', ELwejscie, ' Agangslager beluecht'); writeln('Et lait eppes an d«Miessstatioun : ', SCczujnikC); writeln('De Moossviergang as an der Etapp: ', MPpozycia); writeln('LŠngt vom St‘ck Holz: ', KLdlugosc); writeln('Am Ausgangslager Eent leien ', AL1wyjscieJeden, ' St‘cker Holz'); writeln('Am Ausgangslager Zwee leien ', AL2wyjscieDwa, ' St‘cker Holz'); writeln('Am Ausgangslager DrŠi leien ', AL3wyjscieTrzy, ' St‘cker Holz'); writeln('Am Ansgang Eent lait eppes: ', SDczujnikD); writeln('Am Ansgang Zwee lait eppes: ', SEczujnikE); writeln('Am Ansgang DrŠi lait eppes: ', SFczujnikF); writeln('De KnŠppchen um Ausgang Eent as gedrŽckt: ', CDguzikD); writeln('De KnŠppchen um Ausgang Zwee as gedrŽckt: ', CEguzikE); writeln('De KnŠppchen um Ausgang DrŠi as gedrŽckt: ', CFguzikF); writeln('De GrŠifaarm p‘tzt zou: ', GRIPtrzyma); writeln('Ons lŠscht Positioun wor: ', LPostatniapozycia); writeln('Als lŠscht hate mer den Ausgang vum Ausgangslaager ', RRrobin, ' aus beliwwert.'); end; end; function ZaproponojPriorytety: integer; var prop: integer; begin prop := -1; if (naszStanKopia.MOUzatrzymany = true) then prop := 1 else if ((naszStanKopia.SAczujnikA = Dark) and (naszStanKopia.MPpozycia = 0)) then prop := 2 else if ((naszStanKopia.SAczujnikA = Dark) and (naszStanKopia.ELwejscie < 3)) then prop := 3 else if ((naszStanKopia.MPpozycia = 666) and (((naszStanKopia.KLdlugosc = 1) and (naszStanKopia.SFczujnikF = Light) and (naszStanKopia.CFguzikF = Go)) or ((naszStanKopia.KLdlugosc = 2) and (naszStanKopia.SEczujnikE = Light) and (naszStanKopia.CEguzikE = Go)) or ((naszStanKopia.KLdlugosc = 3) and (naszStanKopia.SDczujnikD = Light) and (naszStanKopia.CDguzikD = Go)))) then prop := 4 else if ((((naszStanKopia.AL3wyjscieTrzy <> 0) and (naszStanKopia.SFczujnikF = Light) and (naszStanKopia.CFguzikF = Go)) or ((naszStanKopia.AL2wyjscieDwa <> 0) and (naszStanKopia.SEczujnikE = Light) and (naszStanKopia.CEguzikE = Go)) or ((naszStanKopia.AL1wyjscieJeden <> 0) and (naszStanKopia.SDczujnikD = Light) and (naszStanKopia.CDguzikD = Go)))) then prop := 5 else if ((naszStanKopia.MPpozycia = 666) and (((naszStanKopia.KLdlugosc = 1) and (naszStanKopia.AL3wyjscieTrzy < MAKS_ILOSC_KLOCKOW)) or ((naszStanKopia.KLdlugosc = 2) and (naszStanKopia.AL2wyjscieDwa < MAKS_ILOSC_KLOCKOW)) or ((naszStanKopia.KLdlugosc = 3) and (naszStanKopia.AL1wyjscieJeden < MAKS_ILOSC_KLOCKOW)))) then prop := 6 else if (not (naszStanKopia.ELwejscie = 0) and (naszStanKopia.MPpozycia = 0)) then prop := 7 else if ((naszStan.MPpozycia <> 0) and (naszStan.MPpozycia <> 666)) then prop := 8 else if ((naszStanKopia.SAczujnikA = Light) and (naszStanKopia.LPostatniapozycia <> 0)) then prop := 9 else if ((naszStanKopia.SAczujnikA = Dark) and (naszStanKopia.LPostatniapozycia <> 104)) then prop := 10; ZaproponojPriorytety := prop; end; procedure OpracujPriorytety; var sukces: boolean; robin: integer; robinNowy: integer; {en neie Robin} prop: integer; i: integer; czasStart, czasKoniec: longint; begin ZrobKopieStanu; {kopŽier aktuellen Zoustand naszStan no naszStanKopia} if (naszStan.MOUzatrzymany = true) then begin {*** Eent *** De MOU-KnŠppchen gouf gedr‘ckt ->Steen faale loossen an an d'Home-Positioun fueren} writeln('Direktiv Eent: ExecuteInstantMOU'); naszStan.DIRukas := 1; OdpytajStan; {aktualisŽier naszStan} OpenGrip; naszStan.GRIPtrzyma := false; sukces := JedzDoPozycii(naszStan.LPostatniapozycia, MAKS_ILOSC_KLOCKOW * WYS_KLOCKA + OFFSET_WYSOKOSCIOWY); MoveToHome; naszStan.LPostatniapozycia := -1; end else if ((naszStan.SAczujnikA = Dark) and (naszStan.MPpozycia = 0)) then begin {*** Zwee *** huel e Steen vum Agang a brŽng en bei d'Miessstation} writeln('Direktiv Zwee: Agang -> Miessstatioun'); naszStan.DIRukas := 2; if (naszStan.GRIPtrzyma = false) then begin {Mir haten grat naischt gegraff, an k‘nnen direkt lassfueren} sukces := JedzDoPozycii(naszStan.LPostatniapozycia, PoczebowanaWysokosc(naszStan.LPostatniapozycia, 0)); {Fuer mat der Hand an d`Luucht well mer soss e Steen emgehaien kŽinten beim Riwwerfueren} begin {///////////////////////////d‘st as de MASTERCHECKER /////////////////////////////////} OdpytajStan; {aktualisŽier naszStan} ZrobKopieStanu; prop := ZaproponojPriorytety; {schafft op neie WŠrten vun naszStanKopia} if (prop <> naszStan.DIRukas) then begin writeln('Direktiv Zwee: TERMINƒIERT wŽinst Direktiv ', prop); exit(OpracujPriorytety); end; end; {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\} sukces := JedzDoPozycii(0, PoczebowanaWysokosc(naszStan.LPostatniapozycia, 0)); naszStan.LPostatniapozycia := 0; begin {///////////////////////////d‘st as de MASTERCHECKER /////////////////////////////////} OdpytajStan; {aktualisŽier naszStan} ZrobKopieStanu; prop := ZaproponojPriorytety; {schafft op neie WŠrten vun naszStanKopia} if (prop <> naszStan.DIRukas) then begin writeln('Direktiv Zwee: TERMINƒIERT wŽinst Direktiv ', prop); exit(OpracujPriorytety); end; end; {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\} sukces := JedzDoPozycii(0, OFFSET_WYSOKOSCIOWY - OFFSET_GET); CloseGrip; {Lo hu mer de Steen} naszStan.GRIPtrzyma := true; begin {///////////////////////////d‘st as de MASTERCHECKER /////////////////////////////////} OdpytajStan; {aktualisŽier naszStan} ZrobKopieStanu; naszStanKopia.SAczujnikA := Dark; naszStanKopia.GRIPtrzyma := false; {!!!} prop := ZaproponojPriorytety; {schafft op neie WŠrten vun naszStanKopia} if (prop <> naszStan.DIRukas) then begin writeln('Direktiv Zwee: TERMINƒIERT wŽinst Direktiv ', prop); OpenGrip; naszStan.GRIPtrzyma := false; exit(OpracujPriorytety); end; end; {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\} sukces := JedzDoPozycii(0, PoczebowanaWysokosc(0, 6)); begin {///////////////////////////d‘st as de MASTERCHECKER /////////////////////////////////} OdpytajStan; {aktualisŽier naszStan} ZrobKopieStanu; naszStanKopia.SAczujnikA := Dark; naszStanKopia.GRIPtrzyma := false; {!!!} prop := ZaproponojPriorytety; {schafft op neie WŠrten vun naszStanKopia} if (prop <> naszStan.DIRukas) then begin writeln('Direktiv Zwee: TERMINƒIERT wŽinst Direktiv ', prop); sukces := JedzDoPozycii(0, OFFSET_WYSOKOSCIOWY - OFFSET_PUT); OpenGrip; naszStan.GRIPtrzyma := false; exit(OpracujPriorytety); end; end; {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\} sukces := JedzDoPozycii(6, PoczebowanaWysokosc(0, 6)); {bei d«Moossstatioun fueren} naszStan.LPostatniapozycia := 6; OdpytajStan; sukces := JedzDoPozycii(6, OFFSET_WYSOKOSCIOWY); OdpytajStan; OpenGrip; {lo lŠit de Steen op der Plaz vun wou aus en ausgemoos gi kann} naszStan.GRIPtrzyma := false; OdpytajStan; sukces := JedzDoPozycii(6, 0 * WYS_KLOCKA + OFFSET_WYSOKOSCIOWY); {Iwwer de Steen goen} naszStan.MPpozycia := 1; end; end end;