X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=ROM2%2Fmain_basic.c;h=e4594717e5a4f7858e7ebe333ad5067e9d88ab71;hb=293827a53b325c2faffddcba380b6f0c19da802a;hp=ea4da005a0d1bb38c14da881ff0bfc302b120b4f;hpb=5266fabbd6d0e04a49e31b945b3f3c96fbd12db6;p=uccvend-snackrom.git diff --git a/ROM2/main_basic.c b/ROM2/main_basic.c index ea4da00..e459471 100644 --- a/ROM2/main_basic.c +++ b/ROM2/main_basic.c @@ -7,25 +7,149 @@ #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" -void _start() { - set_bus_expanded(); - display_init(); - /* enable RTI & set rate */ - /* init coin mech */ - /* scan for motors */ - main(); +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 dispense_something() { + /* process a message VXX in msg_buf where XX is motor number */ + u8 slot; + + 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; + + 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() { + u16 last_coin_value = coin_value; + + /* init coin mech */ + comm_init(); + display_init(); while(1) { - /* stuff */ + if (rx_queue_state) { + switch (msg_buf[0]) { + case 'V': + dispense_something(); + break; + case 'D': + write_to_display(); + break; + case 'B': + do_chime(); + break; + case 'U': + send_balance(); + break; + case 'G': + give_change(); + break; + default: + /* shrug */ + break; + } + msg_clr(); + } + + keypad_read(); + if (keypad_pressed()) { + send_keypress(last_key); + /* beep? */ + } + + if (coin_value != last_coin_value) { + send_balance(); + last_coin_value = coin_value; + } } } -void rti() { - chime(); /* turn chime on or off as need be */ -}