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

Last change on this file since 56 was 56, checked in by sven-win, 14 years ago

AVR M200 Card Reader Controller Driver:

  • Improvements on Procotol implementation
  • Introduced cheap solution for uart concurrence - a simple one level fixed length buffer that is flushed after each main loop output.

-- sven @ netbook

File size: 2.4 KB
Line 
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!
15void 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
40int8_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
67int8_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}
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