X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=ROM2%2Fmain_basic.c;h=ae25a79390b385c49d07c30991d4fa9535368522;hb=deac3b8b66af0f499d6da73cf5bf8479c7d9fad9;hp=6019371dc265cc4e7eca1653e3544a7159f2ad66;hpb=0b1cde693aae432ed16592cc85edfc3ae0d645a2;p=uccvend-snackrom.git diff --git a/ROM2/main_basic.c b/ROM2/main_basic.c index 6019371..ae25a79 100644 --- a/ROM2/main_basic.c +++ b/ROM2/main_basic.c @@ -61,13 +61,14 @@ void write_to_display() { 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; + 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(); } @@ -118,35 +119,86 @@ void do_chime() { 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(); +} + +u16 last_coin_value; +bool last_door_open; +char display_buf[11]; +/* cur_motor[0] is 0 for nothing, or 1..10, or 0xff to say redraw. + * cur_motor[1] is 0..9 and only meaningful is cur_motor[0] != 0. */ +u8 cur_motor[2]; + int main() { - u16 last_coin_value; - bool last_door_open; + u8 i; + for (i = 0; i < 11; i++) + display_buf[i] = ' '; + display_buf[10] = '\0'; - chime_on(); - - misc_output = 0; changer_output = 0x7f; - _io_ports[M6811_PORTA] = 0xc8; + _io_ports[M6811_PORTA] = 0xc0; /* display on. talking to serial port */ + _io_ports[M6811_DDRA] = 0xfc; _io_ports[M6811_DDRD] = 0x3e; _io_ports[M6811_SPCR] = 0x12; + set_misc_output(0x00); - delay(1000); chime_off(); /* mainly for debugging */ + display_init(); + set_msg(" HELLO "); unlock(); /* enable interrupts */ - display_init(); comm_init(); coinmech_init(); - + keypad_init(); last_coin_value = 0; last_door_open = 0; + delay(1000); + + set_msg(" CRUEL "); + + delay(1000); + + set_msg(" WORLD "); + delay(1000); + + chime_start(); + + cur_motor[0] = 0xff; while(1) { + if (cur_motor[0] == 0xff) { /* signal to say redraw screen */ + set_msg("*5N4X0RZ* "); + cur_motor[0] = 0; + } + if (door_open() != last_door_open) { last_door_open = door_open(); send_door_msg(last_door_open); + chime_start(); + if (last_door_open) { + set_msg("DOOR OPEND"); + } else { + set_msg("DOOR CLOSE"); + } } + /* if (rx_queue_state) { switch (msg_buf[0]) { case 'V': @@ -164,23 +216,65 @@ int main() { case 'G': give_change(); break; + case 'P': + ping_pong(); + break; default: - /* shrug */ + // shurg send_nack(); break; } msg_clr(); } + */ keypad_read(); if (keypad_pressed()) { + if (last_key == KEY_RESET) { + cur_motor[0] = 0xff; + } else { + if (cur_motor[0]) { + u8 motor_num; + cur_motor[1] = last_key%10; + display_buf[1] = cur_motor[1]+'0'; + set_msg(display_buf); + + motor_num = cur_motor[0]%10; + motor_num *= 10; + motor_num += cur_motor[1]; + switch (dispense_motor(motor_num)) { + case MOTOR_HOME_FAIL: + set_msg(" HOME FAIL "); + break; + case MOTOR_CURRENT_FAIL: + set_msg(" OVER CRNT "); + break; + case MOTOR_SUCCESS: + set_msg("THANK YOU"); + break; + default: + set_msg("ERRRRRRRR?"); + break; + } + + display_buf[0] = ' '; + display_buf[1] = ' '; + cur_motor[0] = 0xff; + delay(500); + } else { + cur_motor[0] = last_key; + display_buf[0] = (last_key%10)+'0'; + set_msg(display_buf); + } + } send_keypress(last_key); } + /* if (coin_value != last_coin_value) { send_balance(); last_coin_value = coin_value; } + */ } } -