const CDTIME_BEFORECHANGE = 0.5; CDTIME_BLANK = 1.5; CDTIME_INIT_PER_PAGE = 5.0; CDTIME_RESET_PAGE = 5.0; CD_BORDEROFFSET = 10; CD_X_Y_BORDER = 3; CD_X_BUSOFFSET = 16; CD_Y_BUSOFFSET = 6; CD_Y_SYMBOLOFFSET = 32; CD_Y_TEXTOFFSET = 16; CD_SKALA_X = CD_BORDEROFFSET + CD_X_Y_BORDER; CD_SKALA_Y = CD_BORDEROFFSET + CD_X_Y_BORDER + 1*CD_Y_SYMBOLOFFSET; CD_BUSTYPE = 3; // 0 = Zwei Achsen, zwei Türen // 1 = Zwei Achsen, drei Türen // 2 = Drei Achsen, zwei Türen // 3 = Drei Achsen, drei Türen // 4 = Gelenkbus, drei Türen // 5 = Gelenkbus, vier Türen CD_RAMP_SYMBOL_TYPE = 0; // 0 = "hoch", 1 = "niedrig" CD_TIMER_BLINK_ON = 0.5; CD_TIMER_BLINK_OFF = 1.0; type TCD_Mode = (cdmOff, cdmWelcome, cdmStd, cdmStop, cdmPressure, cdmDiagnose, cdmNotInited); TCD_StatePrevState = record curr, prev: shortint; end; var CD_Mode: TCD_Mode; CD_NextMode: TCD_Mode; CD_Blank: boolean; CD_Timer: single; CD_Blinktimer: single; CD_Blinker_On: boolean; CD_InitTimer: single; CD_ResetPageTimer: single; col_on: integer; col_off: integer; font_symbols: integer; font_buses: integer; font_text: integer; CD_Door_1_1: TCD_StatePrevState; // 0 = zu, 1 = blockiert, 2 = freigegeben, 3 = offen CD_Door_1_2: TCD_StatePrevState; CD_Door_2: TCD_StatePrevState; CD_Door_3: TCD_StatePrevState; CD_Door_4: TCD_StatePrevState; CD_ParkBrake: TCD_StatePrevState; CD_StopRequest: TCD_StatePrevState; CD_DriveMode: TCD_StatePrevState; CD_Busstop_str: string; CD_prev_Busstop_str: string; CD_baseline_1: string; CD_baseline_2: string; CD_prev_Nightmode: boolean; CD_prev_ChangeButton: boolean; function CockpitDisplay_CompareStates(var variable: TCD_StatePrevState): boolean; begin result := variable.curr = variable.prev; if result then variable.prev := variable.curr; end; procedure CockpitDisplay_SetStates; var cdstdmode: TCD_Mode; begin if not Energy_MainRelay then begin if CD_Mode <> cdmOff then begin CD_NextMode := cdmOff; CD_InitTimer := 0.1; end; end else if CD_InitTimer > 0 then begin if Cockpit.Sw_Display.Value < 0 then CD_InitTimer := -1 else begin CD_InitTimer := CD_InitTimer - Timegap; if CD_InitTimer <= 0 then begin case CD_Mode of cdmOff: begin CD_Nextmode := cdmWelcome; CD_InitTimer := CDTIME_INIT_PER_PAGE; end; cdmWelcome: begin CD_Nextmode := cdmStop; CD_InitTimer := CDTIME_INIT_PER_PAGE; end; cdmStop: begin CD_Nextmode := cdmPressure; CD_InitTimer := CDTIME_INIT_PER_PAGE; end; cdmPressure: begin CD_Nextmode := cdmStd; CD_InitTimer := CDTIME_INIT_PER_PAGE; end; end; end; end; end else if CD_ResetPageTimer <= 0 then begin if StopBrake then cdstdmode := cdmStop else cdstdmode := cdmStd; if ((CD_Nextmode <> cdstdmode) or (CD_Mode <> cdstdmode)) then CD_NextMode := cdstdmode; end else CD_ResetPageTimer := CD_ResetPageTimer - Timegap; if Energy_DriveRelay and (CD_prev_ChangeButton <> (Cockpit.Sw_Display.Value <> 0)) then begin if (CD_InitTimer <= 0) and (CD_Mode <> cdmOff) then begin if Cockpit.Sw_Display.Value > 0 then begin case CD_Mode of cdmStd: begin CD_Nextmode := cdmStop; CD_ResetPageTimer := CDTIME_RESET_PAGE; end; cdmStop: begin CD_Nextmode := cdmPressure; CD_ResetPageTimer := CDTIME_RESET_PAGE; end; cdmPressure: begin CD_Nextmode := cdmStd; CD_ResetPageTimer := CDTIME_RESET_PAGE; end; cdmDiagnose: begin CD_Nextmode := cdmStd; CD_ResetPageTimer := CDTIME_RESET_PAGE; end; end; end else if Cockpit.Sw_Display.Value < 0 then begin CD_Nextmode := cdmDiagnose; CD_ResetPageTimer := 3600; end; end; CD_prev_ChangeButton := (Cockpit.Sw_Display.Value <> 0); end; if Door_1_1_Open then CD_Door_1_1.curr := 3 else if Door_1_1_Locked then CD_Door_1_1.curr := 1 else CD_Door_1_1.curr := 0; if Door_1_2_Open then CD_Door_1_2.curr := 3 else if Door_1_2_Locked then CD_Door_1_2.curr := 1 else CD_Door_1_2.curr := 0; if Door_2_Open then CD_Door_2.curr := 3 else if Door_2_Released then CD_Door_2.curr := 2 else CD_Door_2.curr := 0; if Door_3_Open then CD_Door_3.curr := 3 else if Door_3_Released then CD_Door_3.curr := 2 else CD_Door_3.curr := 0; if Parkingbrake then CD_ParkBrake.curr := 1 else CD_ParkBrake.curr := 0; if GetStopRequest_1 or GetStopRequest_2 then CD_StopRequest.curr := 1 else CD_StopRequest.curr := 0; if (Gearbox_Gear <> 0) and (Gearbox_GearSelectionTarget < 0) then CD_DriveMode.Curr := -1 else CD_DriveMode.Curr := Gearbox_Gear; end; procedure CockpitDisplay_DrawBottomHalf; var str: string; begin if CD_DriveMode.curr = 0 then str := str + 'N' else if CD_DriveMode.curr = 1 then str := str + '1' else if CD_DriveMode.curr = 2 then str := str + '2' else if CD_DriveMode.curr = 3 then str := str + '3' else if CD_DriveMode.curr = 4 then str := str + '4' else if CD_DriveMode.curr = -1 then str := str + '9' else str := str + ' '; if CD_StopRequest.curr = 1 then str := str + 'H' else str := str + ' '; str := str + ' '; if CD_ParkBrake.curr = 1 then str := str + 'P' else str := str + ' '; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 2*CD_Y_SYMBOLOFFSET, font_symbols, true, 0); //TexWriteLn(Self, ' '+CD_prev_Busstop_str, CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_SYMBOLOFFSET, font_text, true, 0); TexWriteLn(Self, CD_baseline_1, CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_SYMBOLOFFSET, font_text, true, 0); TexWriteLn(Self, CD_baseline_2, CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_SYMBOLOFFSET + CD_Y_TEXTOFFSET, font_text, true, 0); end; procedure CockpitDisplay_DrawStd; begin CockpitDisplay_DrawBottomHalf; end; procedure CockpitDisplay_DrawStop; var str: string; left_door2, left_door3: integer; begin // Bus-Grundform zeichnen: TexWriteLn(Self, IntToStr(CD_BUSTYPE), CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET, font_buses, true, 0); // Türen zeichnen: if CD_Door_1_1.curr = 3 then str := 'w' else if CD_Door_1_1.curr = 1 then str := 'e' else str := 'q'; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + 5, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); if CD_Door_1_2.curr = 3 then str := 'w' else if CD_Door_1_2.curr = 1 then str := 'e' else str := 'q'; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + 13, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); if CD_BUSTYPE in [2,3] then left_door2 := 63 else left_door2 := 45; if CD_Blinker_On or (not (CD_Door_2.curr = 2)) then begin if (CD_Door_2.curr = 3) then str := 'w' else str := 'q'; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + left_door2, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + left_door2 + 8, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); end; if CD_BUSTYPE in [1,3,4,5] then begin if CD_BUSTYPE = 3 then left_door3 := 108 else left_door3 := 77; if CD_Blinker_On or (not (CD_Door_3.curr = 2)) then begin if (CD_Door_3.curr = 3) then str := 'w' else str := 'q'; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + left_door3, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + left_door3 + 8, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); end; if CD_BUSTYPE = 5 then begin str := 'q'; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + 107, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + 107 + 8, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 6, font_symbols, true, 0); end; end; // Rampen zeichnen: if CD_RAMP_SYMBOL_TYPE = 0 then str := 'r' else str := 'z'; TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + 5, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 26, font_symbols, true, 0); TexWriteLn(Self, str, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_X_BUSOFFSET + left_door2, CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_BUSOFFSET + 26, font_symbols, true, 0); CockpitDisplay_DrawBottomHalf; end; procedure CockpitDisplay_DrawWelcome; var str: string; begin str := GetSteamName; if str = '' then str := 'there'; TexWriteLn(Self, 'Hello '+str+'!', CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 1*CD_Y_SYMBOLOFFSET + CD_Y_TEXTOFFSET, font_text, true, 0); end; function CockpitDisplay_GetPressBarsRightEnd(pressure: single): integer; begin result := CD_SKALA_X + 22 + round(max(0, min(12, (pressure / 100000.0) - 1)) * 8); end; procedure CockpitDisplay_DrawPressure; begin // Beschriftung oben: TexWriteLn(Self, 'B',CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER, font_symbols, true, 0); TexWriteLn(Self, 'Bremsdruck',CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_SYMBOLOFFSET, CD_BORDEROFFSET + CD_X_Y_BORDER, font_text, true, 0); // Skala: TexWriteLn(Self, 'P',CD_SKALA_X, CD_SKALA_Y, font_buses, true, 0); // Beschriftung unten: TexWriteLn(Self, 'V',CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_SYMBOLOFFSET, font_symbols, true, 0); TexWriteLn(Self, 'Vorratsdruck',CD_BORDEROFFSET + CD_X_Y_BORDER + CD_Y_SYMBOLOFFSET, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_SYMBOLOFFSET, font_text, true, 0); // Balken: TexDrawRect(Self, CD_SKALA_X + 22, CD_SKALA_Y + 3, CockpitDisplay_GetPressBarsRightEnd(BNP_p_BrakeCyl_FL), CD_SKALA_Y + 3 + 7); TexDrawRect(Self, CD_SKALA_X + 22, CD_SKALA_Y + 14, CockpitDisplay_GetPressBarsRightEnd(BNP_p_BrakeCyl_BL), CD_SKALA_Y + 14 + 7); TexDrawRect(Self, CD_SKALA_X + 22, CD_SKALA_Y + 43, CockpitDisplay_GetPressBarsRightEnd(BNP_p_Reservoir2), CD_SKALA_Y + 43 + 7); TexDrawRect(Self, CD_SKALA_X + 22, CD_SKALA_Y + 54, CockpitDisplay_GetPressBarsRightEnd(BNP_p_Reservoir1), CD_SKALA_Y + 54 + 7); end; procedure CockpitDisplay_DrawDiagnose; begin TexWriteLn(Self, '--- Pressure ---', CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 0*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'Reserv.1: ' + IntToStr(Round(BNP_p_Reservoir1/100)) + ' mb', CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 1*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'Reserv.2: ' + IntToStr(Round(BNP_p_Reservoir2/100)) + ' mb', CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 2*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'Reserv.3: ' + IntToStr(Round(BNP_p_Reservoir3/100)) + ' mb', CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'Reserv.4: ' + IntToStr(Round(BNP_p_Reservoir4/100)) + ' mb', CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 4*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'A1: ' + FloatToStr(A_transfervalve_1), CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 5*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'A2: ' + FloatToStr(A_transfervalve_2), CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 6*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'A3: ' + FloatToStr(A_transfervalve_3), CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 7*CD_Y_TEXTOFFSET, font_text, true, 0); TexWriteLn(Self, 'A4: ' + FloatToStr(A_transfervalve_4), CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 8*CD_Y_TEXTOFFSET, font_text, true, 0); //TexWriteLn(Self, 'p P: ' + IntToStr(Round(BNP_p_BrakeCyl_Parking)), CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 2*CD_Y_TEXTOFFSET, font_text, true, 0); //TexWriteLn(Self, 'A BV: ' + FloatToStr(BNP_A_BrakeValve_Parking), CD_BORDEROFFSET + CD_X_Y_BORDER, CD_BORDEROFFSET + CD_X_Y_BORDER + 3*CD_Y_TEXTOFFSET, font_text, true, 0); end; procedure CockpitDisplay_SimStep; var Nightmode: boolean; currcol_on, currcol_off: integer; changed: boolean; begin changed := false; if CD_Mode = cdmNotInited then begin CD_Mode := cdmOff; changed := true; end; CockpitDisplay_SetStates; if (CD_NextMode <> CD_Mode) then begin CD_Timer := CD_Timer - Timegap; if CD_Timer < 0 then begin CD_Mode := CD_NextMode; CD_Timer := CDTIME_BLANK; CD_Blank := true; changed := true; end; end else if CD_Blank then begin CD_Timer := CD_Timer - Timegap; if CD_Timer < 0 then begin CD_Blank := false; changed := true; end; end else CD_Timer := CDTIME_BEFORECHANGE; Nightmode := (Cockpit.Sw_Light.Value >= 1); if Nightmode <> CD_prev_Nightmode then begin CD_prev_Nightmode := Nightmode; changed := true; end; if CD_Mode in [cdmPressure,cdmDiagnose] then changed := true; if CD_Mode = cdmStop then begin if CockpitDisplay_CompareStates(CD_Door_1_1) or CockpitDisplay_CompareStates(CD_Door_1_2) or CockpitDisplay_CompareStates(CD_Door_2) or CockpitDisplay_CompareStates(CD_Door_3) or CockpitDisplay_CompareStates(CD_Door_4) then changed := true; end; if (CD_Mode = cdmStop) or (CD_Mode = cdmStd) then begin if CockpitDisplay_CompareStates(CD_ParkBrake) or CockpitDisplay_CompareStates(CD_StopRequest) or CockpitDisplay_CompareStates(CD_DriveMode) then changed := true; if CD_Busstop_str <> CD_prev_Busstop_str then begin changed := true; CD_prev_Busstop_str := CD_Busstop_str; end; end; if (not CD_Blank) and ( ((CD_Mode = cdmStop) and ((CD_Door_1_1.curr = 2) or (CD_Door_1_2.curr = 2) or (CD_Door_2.curr = 2) or (CD_Door_3.curr = 2) or (CD_Door_4.curr = 2))) ) then begin CD_Blinktimer := CD_Blinktimer - Timegap; if CD_Blinktimer < 0 then begin CD_Blinker_On := not CD_Blinker_On; changed := true; if CD_Blinker_On then CD_Blinktimer := CD_TIMER_BLINK_ON else CD_Blinktimer := CD_TIMER_BLINK_OFF; end; end else begin CD_Blinker_On := false; CD_Blinktimer := CD_TIMER_BLINK_OFF; end; if changed then begin if CD_Mode = cdmOff then currcol_off := col_off else begin if Nightmode then begin currcol_on := col_off; currcol_off := col_on; end else begin currcol_on := col_on; currcol_off := col_off; end; end; TexSelTex(Self, 0); TexSetColor(Self, currcol_off); TexClear(Self); if (not CD_Blank) and (CD_Mode <> cdmOff) then begin TexSetColor(Self, currcol_on); TexSetBlendMode(Self, 1); case CD_Mode of cdmStd: CockpitDisplay_DrawStd; cdmStop: CockpitDisplay_DrawStop; cdmPressure: CockpitDisplay_DrawPressure; cdmWelcome: CockpitDisplay_DrawWelcome; cdmDiagnose: CockpitDisplay_DrawDiagnose; end; end; end; end; procedure CockpitDisplay_Init; begin col_on := Color(128,128,128,255); col_off := Color(255,255,255,255); font_symbols := TexGetFontIndex(Self, 1000, 101419151); font_text := TexGetFontIndex(Self, 1000, 487004841); font_buses := TexGetFontIndex(Self, 1000, 119544499); CD_Mode := cdmNotInited; CD_InitTimer := 0.1; end;