source: projects/punch-card/driver/documation-m200/src/punchcard.c @ 50

Last change on this file since 50 was 50, checked in by sven, 14 years ago
  • The PC Documation M200 uC Serial Communication Protocol: Initial write
  • driver/documation-m200: Implemented the protocol (code compiles, but not tested yet on device)

-- Sven @ p3

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