'############################################# ' ' Innenanzeige 1/2-zeilig Typ Wien ' Funktionen: ' -Bei einzeiligem Innentext: in voller Höhe anzeigen ' -Bei zweizeiligem Innentext: zweizeilig anzeigen ' -Bei geöffneter Tür oder gegebener Türfreigabe: nach 5s auf Linie+Ziel wechseln ' -Bei Haltewunsch: Wagen hält im 5s-Raster mit der nächsten Haltestelle anzeigen ' -Bei langen einzeiligen Texten: Textfeld auf 170px erweitern und scrollen (WIP, matl_transmap und texcoordtrans funktionieren nicht korrekt miteinander) ' ' Version 1.0 erstellt und fertiggestellt am 07.10.2023 von DerGrafikfehler '############################################# {macro:IAnz_init} (C.L.IAnz_ST) (M.V.STNewTex) 0 (S.L.IAnz_mode) "Mobi IAnz 15x8" (M.V.GetFontIndex) (S.L.IAnz_Font_15x8) "Mobi IAnz 15x6" (M.V.GetFontIndex) (S.L.IAnz_Font_15x6) "Mobi IAnz 15x5" (M.V.GetFontIndex) (S.L.IAnz_Font_15x5) "Mobi IAnz 7x5" (M.V.GetFontIndex) (S.L.IAnz_Font_7x5) "Mobi IAnz Dot" (M.V.GetFontIndex) (S.L.IAnz_Dot) 1 (S.L.IAnz_AtStop) 1 171 / (S.L.IAnz_size_Dot) (M.L.IAnz_lockST) (C.L.IAnz_ST) 255 255 0 255 (M.V.STSetColor) (C.L.IAnz_ST) 239 0 (L.L.IAnz_Font_15x6) 2 0 "Wagen hält" (M.V.STTextOut) {end} {macro:IAnz_frame} ' Modus 0: Strom aus. Warten auf Strom, dann Inhalt des Textfeldes auf die Anzeige übertragen. (L.L.IAnz_mode) ! {if} (L.L.elec_busbar_main) {if} (M.L.IAnz_lockST) 0 (M.L.IAnz_drawScreen) 1 (S.L.IAnz_mode) {endif} {endif} (C.L.IAnz_Lauftext_aktiv) (S.L.IAnz_Scroll_vis) ' Modus 1: Warten auf Änderungen. (L.L.IAnz_mode) 1 = {if} (L.L.elec_busbar_main) ! {if} 0 s0 48 s1 1023 s2 191 s3 (M.L.IAnz_deleteSTArea) (C.L.IAnz_ST) (M.V.STUnlock) (C.L.IAnz_ST) (M.V.STFilter) (C.L.IAnz_ST) (M.V.STLock) (C.L.IAnz_ST) (M.V.STUnlock) (C.L.IAnz_ST) (M.V.STFilter) 0 (S.L.IAnz_mode) {endif} ' Änderung Linie/Ziel (L.L.IBIS_TerminusIndex) (L.L.IAnz_TerminusIndex) = ! {if} (L.L.IBIS_TerminusIndex) (S.L.IAnz_TerminusIndex) (L.L.IAnz_AtStop) {if} 2 (S.L.IAnz_mode) {endif} {endif} (L.$.Matrix_Nr) (L.$.IAnz_Linie) $= ! {if} (L.$.Matrix_Nr) (S.$.IAnz_Linie) (L.L.IAnz_AtStop) {if} 2 (S.L.IAnz_mode) {endif} {endif} ' Haltestelle weitergeschaltet: (L.L.IBIS_busstop) (L.L.IAnz_busstop) = ! {if} (L.L.IBIS_busstop) (S.L.IAnz_busstop) 0 (S.L.IAnz_AtStop) 3 (S.L.IAnz_mode) {endif} ' Haltewunsch: (L.L.haltewunschlampe) (L.L.IAnz_AtStop) ! && {if} (L.L.IAnz_timer) (L.S.Timegap) + (S.L.IAnz_timer) 5.0 >= {if} 4 (S.L.IAnz_mode) 0 (S.L.IAnz_timer) {endif} {else} 0 (S.L.IAnz_Displaymode) (S.L.IAnz_timer) {endif} ' Türen auf oder Freigabe: (M.L.IAnz_Tuerschleife) {if} (L.L.IAnz_timer2) (L.S.Timegap) + (S.L.IAnz_timer2) 5.0 >= {if} 2 (S.L.IAnz_mode) 1 (S.L.IAnz_AtStop) 0 (S.L.IAnz_timer2) {endif} {endif} {endif} ' Modus 2: Anzeige Linie+Fahrtziel (L.L.IAnz_mode) 2 = {if} 0 s0 0 s1 180 s2 24 s3 (M.L.IAnz_deleteSTArea) ' Die Darstellung von Linie+Ziel ist sehr interessant. Zwischen Linie und Ziel wird die Fläche mit Leerzeichen aufgefüllt, die genaue Anzahl ist nicht abgezählt. ' Ist jetzt mal auf 16 gesetzt, damit der Effekt halbwegs akzeptabel aussieht. (L.L.IAnz_TerminusIndex) 1 (M.V.GetTerminusString) $RemoveSpaces (L.$.IAnz_Linie) $+ $length s0 16 l0 - 1 max (L.$.IAnz_Linie) " " $* $+ (L.L.IAnz_TerminusIndex) 1 (M.V.GetTerminusString) $RemoveSpaces $+ (S.$.IAnz_Text_L1) (L.L.IAnz_TerminusIndex) 2 (M.V.GetTerminusString) $RemoveSpaces (S.$.IAnz_Text_L2) (M.L.IAnz_writeText) 0 (M.L.IAnz_drawScreen) 1 (S.L.IAnz_mode) {endif} (L.L.IAnz_mode) 3 = {if} ' Schreiben der aktuellen Haltestelle auf die Innenanzeige. (L.L.IBIS_RouteIndex) (L.L.IAnz_busstop) (M.V.GetRouteBusstopIdent) (M.V.GetBusstopIndex) s0 1 (M.V.GetBusstopString) $RemoveSpaces (S.$.IAnz_Text_L1) l0 2 (M.V.GetBusstopString) $RemoveSpaces (S.$.IAnz_Text_L2) 0 s0 0 s1 180 s2 24 s3 (M.L.IAnz_deleteSTArea) (M.L.IAnz_writeText) 0 (M.L.IAnz_drawScreen) 1 (S.L.IAnz_mode) {endif} (L.L.IAnz_mode) 4 = {if} ' Wagen hält (L.L.IAnz_Displaymode) ! (S.L.IAnz_Displaymode) (M.L.IAnz_lockST) (M.L.IAnz_drawScreen) 1 (S.L.IAnz_mode) {endif} ' Zähler für Lauftext: (L.L.IAnz_scroll) (L.L.IAnz_Displaymode) ! && (C.L.IAnz_Lauftext_aktiv) && {if} (L.S.Timegap) (L.L.IAnz_Scroll_timer) + (S.L.IAnz_Scroll_timer) 0.05 >= {if} ' Lauftext mit einer Geschwindigkeit von 25 Dots/Sekunde: (L.L.IAnz_Scroll_timer) 0.04 / trunc s1 (L.L.IAnz_size_Dot) * s0 (L.L.IAnz_Scroll_timer) l1 0.05 * - (S.L.IAnz_Scroll_timer) (L.L.IAnz_Scroll_Pos_L1_int) l0 + (S.L.IAnz_Scroll_Pos_L1_int) 1 > {if} (L.L.IAnz_Scroll_Pos_L1_int) 1 - (S.L.IAnz_Scroll_Pos_L1_int) {endif} (L.L.IAnz_Scroll_Pos_L1_int) (S.L.IAnz_Scroll_Pos_L2_int) {endif} (L.L.IAnz_Scroll_Pos_L1_int) (S.L.IAnz_Scroll_Pos_L1) (L.L.IAnz_Scroll_Pos_L2_int) (S.L.IAnz_Scroll_Pos_L2) {else} 0 (S.L.IAnz_Scroll_Pos_L1) (S.L.IAnz_Scroll_Pos_L2) {endif} {end} {macro:IAnz_writeText} (L.$.IAnz_Text_L2) "" $= {if} ' einzeilig: (C.L.IAnz_Lauftext_aktiv) (L.$.IAnz_Text_L1) $length 20 > && {if} ' Lauftext, vorerst einmal deaktiviert: 170 s3 1 (S.L.IAnz_scroll) {else} ' Statischer Text: 144 s3 0 (S.L.IAnz_scroll) {endif} ' Font finden: (L.$.IAnz_Text_L1) (L.L.IAnz_Font_15x8) s0 (M.V.TextLength) s1 l3 > {if} (L.$.IAnz_Text_L1) (L.L.IAnz_Font_15x6) s0 (M.V.TextLength) s1 l3 > {if} (L.$.IAnz_Text_L1) (L.L.IAnz_Font_15x5) s0 (M.V.TextLength) s1 {endif} {endif} ' Text zentrieren: 144 l1 - 2 / 0 max s2 (C.L.IAnz_ST) 255 255 0 255 (M.V.STSetColor) (C.L.IAnz_ST) l2 0 l0 2 0 (L.$.IAnz_Text_L1) (M.V.STTextOut) {else} ' zweizeilig: 0 (S.L.IAnz_scroll) (L.$.IAnz_Text_L1) (L.L.IAnz_Font_7x5) s0 (M.V.TextLength) s1 (L.$.IAnz_Text_L2) (L.L.IAnz_Font_7x5) s0 (M.V.TextLength) s2 ' Text zentrieren: 144 l1 - 2 / 0 max s3 144 l2 - 2 / 0 max s4 (C.L.IAnz_ST) 255 255 0 255 (M.V.STSetColor) (C.L.IAnz_ST) l3 0 l0 2 0 (L.$.IAnz_Text_L1) (M.V.STTextOut) (C.L.IAnz_ST) l4 8 l0 2 0 (L.$.IAnz_Text_L2) (M.V.STTextOut) {endif} {end} {macro:IAnz_drawScreen} ' Übergabe: Haltewunsch oder Linie+Ziel/Haltestelle 200 * s0 (C.L.IAnz_ST) s5 l5 0 0 0 0 (M.V.STSetColor) 0 48 1023 191 (M.V.STDrawRect) 0 s1 s2 s3 s6 48 s4 'Register '-1: input-X '-2: input-Y '-3: Output-X '-4: Output-Y '-5: Scripttex-Index '-6: Pixel an/aus "" (C.L.IAnz_Lauftext_aktiv) {if} (M.L.IAnz_drawScreen_Step1000_Scroll) (M.L.IAnz_drawScreen_Step1000_Scroll) (M.L.IAnz_drawScreen_Step1000_Scroll) {else} (M.L.IAnz_drawScreen_Step1000) (M.L.IAnz_drawScreen_Step1000) (M.L.IAnz_drawScreen_Step1000) {endif} (C.L.IAnz_ST) (M.V.STUnlock) (C.L.IAnz_ST) (M.V.STFilter) (C.L.IAnz_ST) (M.V.STLock) (C.L.IAnz_ST) (M.V.STUnlock) (C.L.IAnz_ST) (M.V.STFilter) {end} {macro:IAnz_drawScreen_Step1000} (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) (M.L.IAnz_drawScreen_Step100) {end} {macro:IAnz_drawScreen_Step100} (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) (M.L.IAnz_drawScreen_Step10) {end} {macro:IAnz_drawScreen_Step10} (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) (M.L.IAnz_drawScreen_Step) {end} {macro:IAnz_drawScreen_Step1000_Scroll} (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) (M.L.IAnz_drawScreen_Step100_Scroll) {end} {macro:IAnz_drawScreen_Step100_Scroll} (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) (M.L.IAnz_drawScreen_Step10_Scroll) {end} {macro:IAnz_drawScreen_Step10_Scroll} (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) (M.L.IAnz_drawScreen_Step_Scroll) {end} {macro:IAnz_drawScreen_Step_Scroll} 'Deaktivierter Scriptschnipsel, zur Verwendung mit [useScripttexture] und Lauftexten l1 l0 + s6 l5 l6 l2 (M.V.STReadPixel) ' Absurder gehts nimmer: Lauftext mit Scripttextur funktioniert nur in Kombination mit [useScripttexture] ordnungsgemäß. Damit die Dots trotzdem korrekt ' dargestellt werden, gehts zurück in die Vergangenheit: Statt einer Textur gibts eine Font mit einem an- und einem aus-Dot. l5 (M.V.STGetR) s6 0 > $IntToStr $+ ' Position neu setzen: l3 6 + 1020 / trunc {if} ' Debug: zusammengefügte Zeile als String ausgeben. (S.$.IAnz_DotZeile) " " $+ l5 0 l4 (L.L.IAnz_Dot) 1 0 (M.V.STTextOut) "" {endif} l3 6 + 1020 / trunc 6 * l4 + s4 l3 6 + 1020 % s3 l1 1 + 170 / trunc l2 + s2 l1 1 + 170 % s1 {end} {macro:IAnz_drawScreen_Step} l1 l0 + s6 l5 l6 l2 (M.V.STReadPixel) l5 (M.V.STGetR) s6 l5 l6 l6 l6 l6 (M.V.STSetColor) ' l5 l3 l4 (M.V.STDrawPixel) l5 l3 l4 l3 5 + l4 5 + (M.V.STDrawRect) ' Position neu setzen: l3 6 + 1020 / trunc 6 * l4 + s4 l3 6 + 1020 % s3 l1 1 + 170 / trunc l2 + s2 l1 1 + 170 % s1 {end} {macro:IAnz_deleteSTArea} (M.L.IAnz_lockST) (C.L.IAnz_ST) 0 0 0 0 (M.V.STSetColor) (C.L.IAnz_ST) l0 l1 l2 l3 (M.V.STDrawRect) {end} {macro:IAnz_lockST} (C.L.IAnz_ST) (M.V.STLock) {end} {macro:IAnz_Tuerschleife} (L.L.bremse_halte_sw) (L.L.door_2) || (L.L.door_3) || (L.L.door_4) || (L.L.door_5) || (L.L.door_6) || (L.L.door_7) || {end}