/*
* display.c - functions for controlling the display on the vending machine.
*
+ *
+ * XXX obsolted - with a backend on the server machine, we don't need to
+ * handle scrolling, etc here. Replaced by display_basic.[cho]
+ *
* Use set_msg(char*) to write a new message to the screen, replacing the
* previous one. The message can be at most 255 characters long. Use
* set_wrap_mode with one of the WRAP_* options in vend.h to set the scrolling
*
*/
+#include "display.h"
#include "vend.h"
char display_buffer[10]; /* what each byte on the display reads */
char current_message[256]; /* message that is scrolled or switched between */
+u8 msg_length; /* length of current_message */
u8 wrap_mode; /* whether to scroll or alternate between msgs */
u8 scroll_point; /* how far through the message we have scrolled */
+bool have_scrolled; /* true after one scroll (used for scroll_msg())*/
/* private prototypes */
void display_send_byte(char c);
void display_reset();
void display_update();
-void set_msg(char* newmsg) {
- char* dest = current_message;
+void append_msg(char* newmsg, u8 wrap) {
+ char* dest = current_message+msg_length;
/* equivalent of a string copy */
- /* while (dest++ = newmsg++); */
while (newmsg) {
dest = newmsg;
dest++;
newmsg++;
+ msg_length++;
}
+ wrap_mode = wrap;
+}
+
+void set_msg(char* newmsg, u8 wrap) {
+ msg_length = 0;
+ append_msg(newmsg, wrap);
scroll_point = 0;
display_update();
}
-inline void set_wrap_mode(u8 new_wrap_mode) {
- /* in theory it should be inlined anyway? */
- wrap_mode = new_wrap_mode;
+void scroll_msg(char* newmsg) {
+ /* puts a message on display and does not return until the message has
+ * scrolled across once.
+ */
+ set_msg(newmsg, WRAP_SCROLL);
+ have_scrolled = 0;
+ while (!have_scrolled);
+}
+
+void display_shift() {
+ /* update the display for WRAP_SCROLL or WRAP_ALTERNATE modes */
+ switch (wrap_mode) {
+ case WRAP_SCROLL:
+ case WRAP_ALTERNATE:
+ scroll_point++;
+ if (scroll_point >= msg_length) {
+ scroll_point = 0;
+ have_scrolled = 1;
+ }
+ display_update();
+ break;
+ }
+}
+
+void set_char(char c, u8 pos) {
+ /* sets a single character */
+ display_buffer[pos] = c;
+ display_update();
}
void display_send_byte(char c) {
#define DISPLAY_DELAY 100 /* ms to delay between ops - could be tweaked */
void display_reset() {
/* lower the reset line for a while */
- _io_ports[M6811_PORTA] &= ~PORTA_DISP_RESET;
+ bclr((void*)&_io_ports[M6811_PORTA], PORTA_DISP_RESET);
delay(DISPLAY_DELAY);
- _io_ports[M6811_PORTA] |= PORTA_DISP_RESET;
+ bset((void*)&_io_ports[M6811_PORTA], PORTA_DISP_RESET);
spi_enable();
delay(DISPLAY_DELAY);
}
void display_update() {
- int i;
+ u8 i;
+
+ for (i=0; i < 10; i++) {
+ display_buffer[i] = current_message[
+ (i+(wrap_mode==WRAP_ALTERNATE?scroll_point/10:scroll_point))
+ %msg_length];
+ }
+
+ /* hmmm, will this cause some flickering of the display? */
display_reset();
for (i=0; i < 10; i++) {
- /* FIXME: we may need to fiddle with the character codes sent to the
- * controller. It doesn't seem like we have to, but datasheets for
- * the "pin-for-pin" compatible MSC1937 from OKI suggest a different
- * character set
- */
- display_send_byte(i[display_buffer]&0x7f);
+ display_send_byte(display_buffer[i]&0x7f);
}
}