eprintf mit irq

Committer:
est2fe
Date:
Tue Feb 28 20:20:53 2012 +0000
Revision:
5:8d716aa183dc
Parent:
4:5138a20c4989
V03.4  mit #ifdef MODULE_MBOS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
est2fe 3:de07cab9fc01 1 #ifndef __EPRINTF_C__
est2fe 3:de07cab9fc01 2 #define __EPRINTF_C__
est2fe 2:f63032cc0c0a 3
est2fe 0:4843fcdba3cc 4 #include "eprintf.h"
est2fe 5:8d716aa183dc 5 #ifdef MODUL_MBOS
est2fe 5:8d716aa183dc 6 #include "mbos.h"
est2fe 5:8d716aa183dc 7 #endif
est2fe 0:4843fcdba3cc 8
est2fe 5:8d716aa183dc 9 #ifdef MODUL_MBOS
est2fe 5:8d716aa183dc 10 extern mbos os;
est2fe 5:8d716aa183dc 11 #endif
est2fe 4:5138a20c4989 12 extern Serial pc;
est2fe 4:5138a20c4989 13 // extern int eprintf_fehlerzaehler = 0;
est2fe 4:5138a20c4989 14
est2fe 4:5138a20c4989 15 extern rbuf_t *printbuf;
est2fe 4:5138a20c4989 16
est2fe 4:5138a20c4989 17 extern int letzter_Fehler;
est2fe 4:5138a20c4989 18
est2fe 4:5138a20c4989 19 char cb [SB_GROESSE]; // Der Spoolbuffer zum PC
est2fe 4:5138a20c4989 20 static int eprintf_fehlerzaehler = 0;
est2fe 2:f63032cc0c0a 21
est2fe 2:f63032cc0c0a 22 void TX_irq_eprintf (void) {
est2fe 2:f63032cc0c0a 23 // Wird bei Tx-Empty oder explizit aufgerufen
est2fe 5:8d716aa183dc 24 #ifdef MODUL_MBOS
est2fe 5:8d716aa183dc 25 os.SetEvent (EV_EPRINTF, TASK_EPRINTF_ID);
est2fe 5:8d716aa183dc 26 #endif
est2fe 2:f63032cc0c0a 27 return;
est2fe 0:4843fcdba3cc 28 }
est2fe 1:50fdadc001ef 29
est2fe 2:f63032cc0c0a 30 int eprintf (char *format_str, ...) {
est2fe 2:f63032cc0c0a 31 // Soll in den Printbuffer drucken, aber nur, wenn er nicht voll ist.
est2fe 2:f63032cc0c0a 32 // Returnwert:
est2fe 2:f63032cc0c0a 33 // 0 = ok
est2fe 2:f63032cc0c0a 34 // !0 = Fehler -> siehe defines
est2fe 5:8d716aa183dc 35 #ifdef MODUL_MBOS
est2fe 2:f63032cc0c0a 36 int zeit;
est2fe 5:8d716aa183dc 37 #endif
est2fe 2:f63032cc0c0a 38 int letzter_Fehler = 0;
est2fe 2:f63032cc0c0a 39 Timer tout;
est2fe 2:f63032cc0c0a 40 tout.reset();
est2fe 2:f63032cc0c0a 41 tout.start();
est2fe 5:8d716aa183dc 42 #ifdef MODUL_MBOS
est2fe 2:f63032cc0c0a 43 while (os.TestResource (RESOURCE_EPRINTF))
est2fe 2:f63032cc0c0a 44 {
est2fe 2:f63032cc0c0a 45 // warten bis Resource (eprintf selber) wieder frei ist.
est2fe 2:f63032cc0c0a 46 zeit = tout.read_us();
est2fe 2:f63032cc0c0a 47 if (zeit > TO_LockResource)
est2fe 2:f63032cc0c0a 48 {
est2fe 2:f63032cc0c0a 49 // Timeout
est2fe 2:f63032cc0c0a 50 letzter_Fehler = FEHLER_EPRINTF_TEST_RESOURCE;
est2fe 2:f63032cc0c0a 51 //eprintf ("\n\rletzer_Fehler = %d, in Zeile %d", letzter_Fehler, __LINE__);
est2fe 2:f63032cc0c0a 52 goto eprintf_end_fehler;
est2fe 2:f63032cc0c0a 53 }
est2fe 2:f63032cc0c0a 54 else
est2fe 2:f63032cc0c0a 55 {
est2fe 2:f63032cc0c0a 56 // warten
est2fe 2:f63032cc0c0a 57 }
est2fe 2:f63032cc0c0a 58 }
est2fe 2:f63032cc0c0a 59 tout.reset ();
est2fe 2:f63032cc0c0a 60 tout.start ();
est2fe 2:f63032cc0c0a 61 while (!os.LockResource (RESOURCE_EPRINTF))
est2fe 2:f63032cc0c0a 62 {
est2fe 2:f63032cc0c0a 63 // warten bis Resource gelockt ist
est2fe 2:f63032cc0c0a 64 zeit = tout.read_us ();
est2fe 2:f63032cc0c0a 65 if (zeit > TO_LockResource)
est2fe 2:f63032cc0c0a 66 {
est2fe 2:f63032cc0c0a 67 // Timeout
est2fe 2:f63032cc0c0a 68 letzter_Fehler = FEHLER_EPRINTF_LOCK_RESOURCE;
est2fe 2:f63032cc0c0a 69 //eprintf ("\n\rletzer_Fehler = %d, in Zeile %d", letzter_Fehler, __LINE__);
est2fe 2:f63032cc0c0a 70 goto eprintf_end_fehler;
est2fe 2:f63032cc0c0a 71 }
est2fe 2:f63032cc0c0a 72 else
est2fe 2:f63032cc0c0a 73 {
est2fe 2:f63032cc0c0a 74 // warten
est2fe 2:f63032cc0c0a 75 }
est2fe 2:f63032cc0c0a 76 }
est2fe 5:8d716aa183dc 77 #endif
est2fe 2:f63032cc0c0a 78 if ((printbuf->flags & FAST_VOLL))
est2fe 2:f63032cc0c0a 79 {
est2fe 2:f63032cc0c0a 80 // Wenn der Stecker raus ist, laeuft der Buffer voll -> nichts mehr drucken!
est2fe 2:f63032cc0c0a 81 letzter_Fehler = FEHLER_EPRINTF_FAST_VOLL;
est2fe 2:f63032cc0c0a 82 goto eprintf_end_fehler;
est2fe 2:f63032cc0c0a 83 }
est2fe 2:f63032cc0c0a 84 else
est2fe 2:f63032cc0c0a 85 {
est2fe 2:f63032cc0c0a 86 int slen; // Stringlaenge
est2fe 2:f63032cc0c0a 87 va_list args;
est2fe 2:f63032cc0c0a 88 va_start (args, format_str); // Zeiger auf die "..."
est2fe 2:f63032cc0c0a 89 vsnprintf (cb, (SB_GROESSE - 1), format_str, args);
est2fe 2:f63032cc0c0a 90 va_end (args);
est2fe 2:f63032cc0c0a 91 // Jetzt den Inhalt vom Spoolbuffer (cb) noch in den printbuffer packen
est2fe 2:f63032cc0c0a 92 slen = strlen (cb);
est2fe 2:f63032cc0c0a 93 if (slen > (printbuf->buflen - printbuf->bufcnt - 2))
est2fe 2:f63032cc0c0a 94 {
est2fe 5:8d716aa183dc 95 // wenn es nicht reinpasst, gleich mit Fehler zur�ck
est2fe 2:f63032cc0c0a 96 letzter_Fehler = FEHLER_EPRINTF_STRING_ZU_GROSS;
est2fe 2:f63032cc0c0a 97 goto eprintf_end_fehler;
est2fe 2:f63032cc0c0a 98 }
est2fe 2:f63032cc0c0a 99 else
est2fe 2:f63032cc0c0a 100 {
est2fe 2:f63032cc0c0a 101 // es passt rein, also jedes Zeichen von cb in den Printbuffer
est2fe 2:f63032cc0c0a 102 int i; void *fehler;
est2fe 2:f63032cc0c0a 103 for (i = 0; i < slen; i++)
est2fe 2:f63032cc0c0a 104 {
est2fe 2:f63032cc0c0a 105 // rbuf_put (kbdbuf, &c)
est2fe 2:f63032cc0c0a 106 fehler = rbuf_put (printbuf, &cb[i]);
est2fe 2:f63032cc0c0a 107 if (!fehler)
est2fe 2:f63032cc0c0a 108 { // Fehler aufgetreten, warum auch immer!
est2fe 2:f63032cc0c0a 109 // Sollte eigentlich nie vorkommen!
est2fe 2:f63032cc0c0a 110 letzter_Fehler = FEHLER_EPRINTF_RBUF_PUT;
est2fe 2:f63032cc0c0a 111 goto eprintf_end_fehler;
est2fe 2:f63032cc0c0a 112 }
est2fe 2:f63032cc0c0a 113 }
est2fe 2:f63032cc0c0a 114 // Fertig! Nun noch melden, dass neue druckbare Zeichen
est2fe 2:f63032cc0c0a 115 // da sind und per Interrupt ausgegeben werden koennen.
est2fe 5:8d716aa183dc 116 #ifdef MODUL_MBOS
est2fe 5:8d716aa183dc 117 os.SetEvent (EV_EPRINTF, TASK_EPRINTF_ID);
est2fe 5:8d716aa183dc 118 #endif
est2fe 2:f63032cc0c0a 119 }
est2fe 2:f63032cc0c0a 120 }
est2fe 5:8d716aa183dc 121 #ifdef MODULE_MBOS
est2fe 2:f63032cc0c0a 122 os.FreeResource (RESOURCE_EPRINTF);
est2fe 5:8d716aa183dc 123 #endif
est2fe 5:8d716aa183dc 124 TX_irq_eprintf (); // Und das erste Zeichen, falls m&#65533;glich, gleich ausgeben
est2fe 2:f63032cc0c0a 125 return 0; // 0 = kein Fehler
est2fe 1:50fdadc001ef 126
est2fe 2:f63032cc0c0a 127 eprintf_end_fehler:
est2fe 2:f63032cc0c0a 128 eprintf_fehlerzaehler++;
est2fe 5:8d716aa183dc 129 #ifdef MODULE_MBOS
est2fe 2:f63032cc0c0a 130 os.FreeResource (RESOURCE_EPRINTF);
est2fe 5:8d716aa183dc 131 #endif
est2fe 5:8d716aa183dc 132 return letzter_Fehler; // Mit Fehler zur&#65533;ck
est2fe 2:f63032cc0c0a 133 }
est2fe 2:f63032cc0c0a 134 void task_eprintf_verarbeitung (void) {
est2fe 2:f63032cc0c0a 135 // Grundsaetzlich gilt: Immer nur per os warten, wenn es nichts zu tun gibt!
est2fe 2:f63032cc0c0a 136 while (1)
est2fe 0:4843fcdba3cc 137 {
est2fe 2:f63032cc0c0a 138 eprintf_wait_event: // Bruch der Schleife while (printbuf->bufcnt > 0)
est2fe 5:8d716aa183dc 139 #ifdef MODULE_MBOS
est2fe 2:f63032cc0c0a 140 os.WaitEvent (EV_EPRINTF);
est2fe 5:8d716aa183dc 141 #endif
est2fe 2:f63032cc0c0a 142 while ((printbuf->bufcnt > 0) && (pc.writeable ()))
est2fe 2:f63032cc0c0a 143 {
est2fe 2:f63032cc0c0a 144 // So lange was ausgeben bis nicht mehr moeglich
est2fe 2:f63032cc0c0a 145 int c;
est2fe 2:f63032cc0c0a 146 void *z;
est2fe 2:f63032cc0c0a 147 z = rbuf_get (printbuf, &c);
est2fe 2:f63032cc0c0a 148 if (z == 0)
est2fe 2:f63032cc0c0a 149 {
est2fe 2:f63032cc0c0a 150 // wenn Buffer leer, per os warten
est2fe 2:f63032cc0c0a 151 goto eprintf_wait_event;
est2fe 2:f63032cc0c0a 152 }
est2fe 2:f63032cc0c0a 153 else
est2fe 2:f63032cc0c0a 154 {
est2fe 2:f63032cc0c0a 155 pc.putc (c); // Das sollte die einzige Stelle im Programm sein, wo was auf den pc ausgegeben wird!
est2fe 2:f63032cc0c0a 156 }
est2fe 2:f63032cc0c0a 157 } // von while ((printbuf->bufcnt > 0) && (pc.writeable ()))
est2fe 2:f63032cc0c0a 158 } // von while (1)
est2fe 2:f63032cc0c0a 159 } // void task_eprintf_verarbeitung (void)
est2fe 0:4843fcdba3cc 160
est2fe 2:f63032cc0c0a 161 #endif // von #ifdef __EPRINTF_C__