X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=ROM2%2Fmain_basic.c;h=d848401ba9d2fd75c2c8f93c7e25e041b74a80a4;hb=27fb8a023fa0572ef4171624781460bc59537d49;hp=8d54ee99e6c4441d04dadaf1a95b6441b3dcc791;hpb=24ecd46fb709e0b5994f6c3fa77c400ae9b92efa;p=uccvend-snackrom.git diff --git a/ROM2/main_basic.c b/ROM2/main_basic.c index 8d54ee9..d848401 100644 --- a/ROM2/main_basic.c +++ b/ROM2/main_basic.c @@ -7,44 +7,254 @@ #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] = have_change?'0':'1'; + tx_buffer[2] = (coin_value/10000)%10; + tx_buffer[3] = (coin_value/1000)%10; + tx_buffer[4] = (coin_value/100)%10; + tx_buffer[5] = (coin_value/10)%10; + tx_buffer[6] = coin_value%10; + tx_buffer[7] = '\n'; + tx_buffer[8] = 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%10)+'0'; + tx_buffer[2] = '\n'; + tx_buffer[3] = 0; + send_packet(); +} + +void send_door_msg(bool open) { + wait_for_tx_free(); + tx_buffer[0] = 'D'; + tx_buffer[1] = open?'1':'0'; + tx_buffer[2] = '\n'; + tx_buffer[3] = 0; + send_packet(); +} + +void do_chime() { + chime_start(); + send_ack(); +} + +void ping_pong() { + /* make sure it's really a ping */ + if (msg_buf[1] != 'I' || + msg_buf[2] != 'N' || + msg_buf[3] != 'G') { + send_nack(); + return; + } + /* respond with ack & pong */ + wait_for_tx_free(); + tx_buffer[0] = 'P'; + tx_buffer[1] = 'O'; + tx_buffer[2] = 'N'; + tx_buffer[3] = 'G'; + tx_buffer[4] = '\n'; + tx_buffer[5] = 0; + send_packet(); } int main() { + u16 last_coin_value; + bool last_door_open; + int display_pos; + unsigned int i; + char display_buf[11]; + for (display_pos = 0; display_pos < 11; display_pos++) + display_buf[display_pos] = '\0'; + display_pos = 0; + + delay(1000); + + chime_on(); + for (i = 0; i < 40000; i++) {} + chime_off(); + for (i = 0; i < 20000; i++) {} + chime_on(); + for (i = 0; i < 60000; i++) {} + + changer_output = 0x7f; + //_io_ports[M6811_PORTA] = 0xc8; /* for talking to coin mech */ + _io_ports[M6811_PORTA] = 0xc0; /* for talking to serial port */ + _io_ports[M6811_DDRA] = 0xfc; + _io_ports[M6811_DDRD] = 0x3e; + _io_ports[M6811_SPCR] = 0x12; + set_misc_output(0x00); + + chime_off(); /* mainly for debugging */ + + display_init(); + set_msg(" HELLO "); + + unlock(); /* enable interrupts */ + + comm_init(); + coinmech_init(); + keypad_init(); + + chime_count = 100; + while (chime_count != 0); + + set_msg(" CRUEL "); + + last_coin_value = 0; + last_door_open = 0; + + dispense_motor(22); + + chime_count = 50; + while (chime_count != 0); + + set_msg(" WORLD "); + delay(1000); + set_msg("*5N4X0RZ* "); + delay(1000); + while(1) { - /* - * have serial packet? - * - * decode msg & process: - * - dispense motor - * - display string - * - give change - * - beep - */ - - /* - * have keypress? - * - beep - * - send via serial - */ - - /* - * have coin balance change? - * - send via serial - */ + if (door_open() != last_door_open) { + last_door_open = door_open(); + send_door_msg(last_door_open); + if (last_door_open) { + chime_on(); + set_msg("DOOR OPEND"); + delay(100); + chime_off(); + } else { + chime_on(); + set_msg("DOOR CLOSE"); + delay(100); + chime_off(); + } + } + + 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; + case 'P': + ping_pong(); + break; + default: + /* shrug */ + send_nack(); + break; + } + msg_clr(); + } + + keypad_read(); + if (keypad_pressed()) { + if (last_key == KEY_RESET) + display_buf[display_pos] = 'R'; + else + display_buf[display_pos] = '0'+(last_key%10); + display_pos++; + display_pos %= 10; + set_msg(display_buf); + send_keypress(last_key); + } + + if (coin_value != last_coin_value) { + send_balance(); + last_coin_value = coin_value; + } } } -void rti() { - chime(); /* turn chime on or off as need be */ -}