2 * display.c - functions for controlling the display on the vending machine.
5 * XXX obsolted - with a backend on the server machine, we don't need to
6 * handle scrolling, etc here. Replaced by display_basic.[cho]
8 * Use set_msg(char*) to write a new message to the screen, replacing the
9 * previous one. The message can be at most 255 characters long. Use
10 * set_wrap_mode with one of the WRAP_* options in vend.h to set the scrolling
11 * behaviour. If the message is less than 10 characters, it is not scrolled.
12 * Otherwise, the message will scroll.
19 char display_buffer[10]; /* what each byte on the display reads */
20 char current_message[256]; /* message that is scrolled or switched between */
21 u8 msg_length; /* length of current_message */
22 u8 wrap_mode; /* whether to scroll or alternate between msgs */
23 u8 scroll_point; /* how far through the message we have scrolled */
24 bool have_scrolled; /* true after one scroll (used for scroll_msg())*/
26 /* private prototypes */
27 void display_send_byte(char c);
29 void display_update();
31 void append_msg(char* newmsg, u8 wrap) {
32 char* dest = current_message+msg_length;
33 /* equivalent of a string copy */
43 void set_msg(char* newmsg, u8 wrap) {
45 append_msg(newmsg, wrap);
50 void scroll_msg(char* newmsg) {
51 /* puts a message on display and does not return until the message has
52 * scrolled across once.
54 set_msg(newmsg, WRAP_SCROLL);
56 while (!have_scrolled);
59 void display_shift() {
60 /* update the display for WRAP_SCROLL or WRAP_ALTERNATE modes */
65 if (scroll_point >= msg_length) {
74 void set_char(char c, u8 pos) {
75 /* sets a single character */
76 display_buffer[pos] = c;
80 void display_send_byte(char c) {
81 bset_misc_output(A3800_DISPLAY_WRITE); /* enable the display clock */
83 _io_ports[M6811_SPDR] = c; /* load SPI with byte */
84 while(!(_io_ports[M6811_SPDR]&M6811_SPIE)); /* wait for completion */
85 _io_ports[M6811_SPDR]; /* SPDR read to clear SPIE flag */
88 #define DISPLAY_DELAY 100 /* ms to delay between ops - could be tweaked */
89 void display_reset() {
90 /* lower the reset line for a while */
91 bclr((void*)&_io_ports[M6811_PORTA], PORTA_DISP_RESET);
93 bset((void*)&_io_ports[M6811_PORTA], PORTA_DISP_RESET);
98 display_send_byte(0xC0 | 10); /* tell the controller there are 10 digits */
99 display_send_byte(0xE0); /* set duty cycle to 100% */
104 void display_update() {
107 for (i=0; i < 10; i++) {
108 display_buffer[i] = current_message[
109 (i+(wrap_mode==WRAP_ALTERNATE?scroll_point/10:scroll_point))
113 /* hmmm, will this cause some flickering of the display? */
116 for (i=0; i < 10; i++) {
117 display_send_byte(display_buffer[i]&0x7f);
121 void display_init() {