1 | /** |
---|
2 | * Implementions of punchcard.h |
---|
3 | * |
---|
4 | **/ |
---|
5 | |
---|
6 | #include "punchcard.h" |
---|
7 | #include "protocol.h" |
---|
8 | #include "driver.h" |
---|
9 | #include <string.h> |
---|
10 | #include <stdio.h> |
---|
11 | |
---|
12 | #define bit2chr(bit, byte) ( ( (1 << bit) & byte ) ? '1' : '0' ) |
---|
13 | |
---|
14 | // print column out (debugging), needing 16 bytes! |
---|
15 | void column_print(const Column* c) { |
---|
16 | char str[20]; |
---|
17 | str[0] = '|'; |
---|
18 | str[1] = ' '; |
---|
19 | str[2] = bit2chr(COL12, *c); |
---|
20 | str[3] = bit2chr(COL11, *c); |
---|
21 | str[4] = bit2chr( COL0, *c); |
---|
22 | str[5] = ' '; |
---|
23 | str[6] = bit2chr( COL1, *c); |
---|
24 | str[7] = bit2chr( COL2, *c); |
---|
25 | str[8] = bit2chr( COL3, *c); |
---|
26 | str[9] = bit2chr( COL4, *c); |
---|
27 | str[10] = bit2chr( COL5, *c); |
---|
28 | str[11] = bit2chr( COL6, *c); |
---|
29 | str[12] = bit2chr( COL7, *c); |
---|
30 | str[13] = bit2chr( COL8, *c); |
---|
31 | str[14] = bit2chr( COL9, *c); |
---|
32 | str[15] = ' '; |
---|
33 | str[16] = '|'; |
---|
34 | str[17] = '\0'; |
---|
35 | |
---|
36 | puts(str); |
---|
37 | //strcat(Text1, str); |
---|
38 | } |
---|
39 | |
---|
40 | int8_t card_buffer_read_advance() { |
---|
41 | // hier locken (mutex), weil mehrere Operationen |
---|
42 | |
---|
43 | // neuen Index berechnen |
---|
44 | int8_t new_offset = (card_buffer.read_offset + 1) % BUFFER_LEN; |
---|
45 | |
---|
46 | // wenn write nicht hinter read liegt (denn dann ist eh Platz) |
---|
47 | if( card_buffer.write_offset >= card_buffer.read_offset && |
---|
48 | // schauen, ob writer schon dadrauf war oder jetzt ist |
---|
49 | new_offset > card_buffer.write_offset ) { |
---|
50 | // Puffer ist leer! |
---|
51 | // (writer arbeitet noch auf dem aktuellen offset) |
---|
52 | dprintf("Read: full new=%d, rd %d rw %d, cols rd %d rw %d\n", new_offset, card_buffer.read_offset, card_buffer.write_offset, |
---|
53 | current_read_card.offset, current_write_card.offset); |
---|
54 | return BUFFER_EMPTY; |
---|
55 | } |
---|
56 | |
---|
57 | // Index braucht nicht weiter vorbereitet werden, wir |
---|
58 | // wollen ja lesen... |
---|
59 | |
---|
60 | // neuen Index setzen |
---|
61 | card_buffer.read_offset = new_offset; |
---|
62 | |
---|
63 | // hier wieder delocken |
---|
64 | return SUCCESS; |
---|
65 | } |
---|
66 | |
---|
67 | int8_t card_buffer_write_advance() { |
---|
68 | // locken |
---|
69 | |
---|
70 | // neuen Index berechnen |
---|
71 | int8_t new_offset = (card_buffer.write_offset + 1) % BUFFER_LEN; |
---|
72 | |
---|
73 | // schauen, ob reader damit fertig ist |
---|
74 | if( new_offset == card_buffer.read_offset ) { |
---|
75 | // Puffer ist voll! |
---|
76 | dprintf("Write: full new=%d, rd %d rw %d, cols rd %d rw %d\n", new_offset, card_buffer.read_offset, card_buffer.write_offset, |
---|
77 | current_read_card.offset, current_write_card.offset); |
---|
78 | return BUFFER_FULL; |
---|
79 | } |
---|
80 | |
---|
81 | // neuen Index vorbereiten: Karte nullen |
---|
82 | memset( &card_buffer.cards[ new_offset ], 0, sizeof(Card) ); |
---|
83 | |
---|
84 | // neuen Index setzen. |
---|
85 | card_buffer.write_offset = new_offset; |
---|
86 | |
---|
87 | // delocken |
---|
88 | return SUCCESS; |
---|
89 | } |
---|