X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=ROM2%2Fmain_basic.c;h=e4594717e5a4f7858e7ebe333ad5067e9d88ab71;hb=293827a53b325c2faffddcba380b6f0c19da802a;hp=ff8687bf6af101b5f967c314b61c52bd5ea39fe0;hpb=2e7a8beb908896930042bc0564fbd16f3e0b0b62;p=uccvend-snackrom.git diff --git a/ROM2/main_basic.c b/ROM2/main_basic.c index ff8687b..e459471 100644 --- a/ROM2/main_basic.c +++ b/ROM2/main_basic.c @@ -7,27 +7,106 @@ #include "display_basic.h" #include "keypad.h" #include "chime.h" -#include "server.h" #include "coinmech.h" +#include "motors.h" #include "comm.h" #include "vend.h" -extern inline void enable_rti() { +void motor_reply(char* slotptr, u8 code) { + /* returns a message of the form MXYY - X is return code, YY is motor */ + wait_for_tx_free(); + tx_buffer[0] = 'M'; + tx_buffer[1] = code + '0'; + tx_buffer[2] = *slotptr; + tx_buffer[3] = *(slotptr+1); + tx_buffer[4] = '\n'; + tx_buffer[5] = 0; + send_packet(); } -void _start() { - set_bus_expanded(); - /* enable RTI */ - _io_ports[M6811_TMSK2] = 0x40; - /* powerup ADC, set IRQ' for edge-sensitive operation */ - _io_ports[M6811_OPTION] = 0xA0; - /* set the stack pointer */ - //asm volatile ("lds %1":: "i"(_stack):"sp"); +void dispense_something() { + /* process a message VXX in msg_buf where XX is motor number */ + u8 slot; - main(); + if ((msg_buf[1] < '0') || (msg_buf[1] > '9') || + (msg_buf[2] < '0') || (msg_buf[2] > '9')) { + msg_buf[1] = msg_buf[2] = '0'; + motor_reply((char*)&msg_buf[1], MOTOR_NOSLOT); + return; + } + + slot = (msg_buf[1] - '0') * 10; + slot += msg_buf[2] - '0'; + + motor_reply((char*)&msg_buf[1], dispense_motor(slot)); +} + +void write_to_display() { + /* process a message in the form DXXXXXXXXXXX to send to display */ + u8 i; + char buf[10]; + for (i = 0; i < 10; i++) + if (msg_buf[i+1]) + buf[i] = msg_buf[i+1]; + else + break; -loop_forever: - goto loop_forever; /* wait for an interrupt to wake us up again */ + for (; i < 10; i++) /* pad the rest out with spaces */ + buf[i] = ' '; + + set_msg(buf); + send_ack(); +} + +void send_balance() { + wait_for_tx_free(); + tx_buffer[0] = 'C'; + tx_buffer[1] = (coin_value/10000)%10; + tx_buffer[2] = (coin_value/1000)%10; + tx_buffer[3] = (coin_value/100)%10; + tx_buffer[4] = (coin_value/10)%10; + tx_buffer[5] = coin_value%10; + tx_buffer[6] = '\n'; + tx_buffer[7] = 0; + send_packet(); +} + +void give_change() { + u16 cost; + + if ((msg_buf[1] < '0') || (msg_buf[1] > '9') || + (msg_buf[2] < '0') || (msg_buf[2] > '9') || + (msg_buf[3] < '0') || (msg_buf[3] > '9') || + (msg_buf[4] < '0') || (msg_buf[4] > '9') || + (msg_buf[5] < '0') || (msg_buf[5] > '9')) { + send_nack(); + } + cost = msg_buf[1] - '0'; + cost *= 10; cost = msg_buf[2] - '0'; + cost *= 10; cost = msg_buf[3] - '0'; + cost *= 10; cost = msg_buf[4] - '0'; + cost *= 10; cost = msg_buf[5] - '0'; + + coin_cost(cost); + send_ack(); +} + +void send_keypress(u8 key) { + /* send a packet of the form KX with X being the key, or R for reset */ + wait_for_tx_free(); + tx_buffer[0] = 'K'; + if (key == KEY_RESET) + tx_buffer[1] = 'R'; + else + tx_buffer[1] = key+'0'; + tx_buffer[2] = '\n'; + tx_buffer[3] = 0; + send_packet(); +} + +void do_chime() { + chime_start(); + send_ack(); } int main() { @@ -39,15 +118,20 @@ int main() { while(1) { if (rx_queue_state) { switch (msg_buf[0]) { - case 'V': /* dispense something */ + case 'V': + dispense_something(); break; - case 'D': /* write string to display */ + case 'D': + write_to_display(); break; - case 'B': /* beep */ + case 'B': + do_chime(); break; - case 'U': /* query current coin balance */ + case 'U': + send_balance(); break; - case 'G': /* give change */ + case 'G': + give_change(); break; default: /* shrug */ @@ -55,18 +139,17 @@ int main() { } msg_clr(); } + keypad_read(); if (keypad_pressed()) { - /* send packet about it */ + send_keypress(last_key); /* beep? */ } if (coin_value != last_coin_value) { - /* send a packet about it */ + send_balance(); + last_coin_value = coin_value; } } } -void rti() { - chime(); /* turn chime on or off as need be */ -}