eprintf mit irq

Committer:
est2fe
Date:
Thu Jul 21 07:26:22 2011 +0000
Revision:
3:de07cab9fc01
Parent:
2:f63032cc0c0a
Child:
4:5138a20c4989
V0.31

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