void cmd_start_session(char *arg) { if(mdb_state == MDB_ENABLED) { if(session.start.flag == 0) { session.start.flag = 1; session.start.funds = atoi(arg); mdb_poll_reply = MDB_REPLY_BEGIN_SESSION; } else { send_str_p(UPLINK_USART,PSTR("Error: Session is already running\r\n")); } } else { send_str_p(UPLINK_USART,PSTR("Error: MateDealer not ready for a session\r\n")); } }
void cmd_cancel_session(char *arg) { if(mdb_state == MDB_SESSION_IDLE) { mdb_poll_reply = MDB_REPLY_SESSION_CANCEL_REQ; } else { send_str_p(UPLINK_USART,PSTR("Error: MateDealer is not in a suitable state to cancel a session\r\n")); } }
void cmd_deny_vend(char *arg) { if(mdb_state == MDB_VENDING) { session.result.vend_denied = 1; mdb_poll_reply = MDB_REPLY_VEND_DENIED; } else { send_str_p(UPLINK_USART,PSTR("Error: MateDealer is not in a suitable state to deny a vend\r\n")); } }
void cmd_help(char *arg) { send_str_p(UPLINK_USART, PSTR("-----------------------------------------------\r\n")); send_str_p(UPLINK_USART, PSTR("reset:\r\n reset the Arduino\r\n")); send_str_p(UPLINK_USART, PSTR("info:\r\n shows the VMC infos transfered during the setup process\r\n")); send_str_p(UPLINK_USART, PSTR("get-mdb-state:\r\n displays the current MDB state.\r\n")); send_str_p(UPLINK_USART, PSTR("start-session <funds>:\r\n starts a session with <funds> Euro Cents.\r\n")); send_str_p(UPLINK_USART, PSTR("approve-vend <vend-amount>:\r\n approves a vend request with <vend-amount> Euro Cents.\r\n")); send_str_p(UPLINK_USART, PSTR("deny-vend:\r\n denies a vend request.\r\n")); send_str_p(UPLINK_USART, PSTR("-----------------------------------------------\r\n")); }
void cmd_get_mdb_state(char *arg) { switch(mdb_state) { case MDB_INACTIVE: send_str_p(UPLINK_USART,PSTR("INACTIVE\r\n")); break; case MDB_DISABLED: send_str_p(UPLINK_USART,PSTR("DISABLED\r\n")); break; case MDB_ENABLED: send_str_p(UPLINK_USART,PSTR("ENABLED\r\n")); break; case MDB_SESSION_IDLE: send_str_p(UPLINK_USART,PSTR("SESSION IDLE\r\n")); break; case MDB_VENDING: send_str_p(UPLINK_USART,PSTR("VEND\r\n")); break; case MDB_REVALUE: send_str_p(UPLINK_USART,PSTR("REVALUE\r\n")); break; case MDB_NEGATIVE_VEND: send_str_p(UPLINK_USART,PSTR("NEGATIVE VEND\r\n")); break; } }
void cmd_approve_vend(char *arg) { if(mdb_state == MDB_VENDING) { session.result.vend_approved = 1; session.result.vend_amount = atoi(arg); mdb_poll_reply = MDB_REPLY_VEND_APPROVED; } else { send_str_p(UPLINK_USART,PSTR("Error: MateDealer is not in a suitable state to approve a vend\r\n")); } }
void cmd_info(char *arg) { if(mdb_state >= MDB_ENABLED) { char buffer[40]; send_str_p(UPLINK_USART, PSTR("-----------------------------------------------\r\n")); send_str_p(UPLINK_USART,PSTR("## VMC configuration data ##\r\n")); sprintf(buffer,"VMC feature level: %d\r\n", vmc.feature_level); send_str(UPLINK_USART,buffer); sprintf(buffer,"VMC display columns: %d\r\n", vmc.dispaly_cols); send_str(UPLINK_USART,buffer); sprintf(buffer,"VMC display rows: %d\r\n", vmc.dispaly_rows); send_str(UPLINK_USART,buffer); sprintf(buffer,"VMC display info: %d\r\n", vmc.dispaly_info); send_str(UPLINK_USART,buffer); send_str_p(UPLINK_USART,PSTR("## VMC price range ##\r\n")); sprintf(buffer,"Maximum price: %d\r\n", price.max); send_str(UPLINK_USART,buffer); sprintf(buffer,"Minimum price: %d\r\n", price.min); send_str(UPLINK_USART,buffer); send_str_p(UPLINK_USART,PSTR("-----------------------------------------------\r\n")); } else { send_str_p(UPLINK_USART,PSTR("Error: Setup not yet completed!\r\n")); } }
int main(void) { setup_usart(0,38400,8,'N',1); setup_usart(1,9600,9,'N',1); sei(); send_str_p(0,PSTR("MateDealer is up and running\r\n")); // Main Loop while(1) { mdb_cmd_handler(); uplink_cmd_handler(); } return 0; }
void parse_cmd(char *cmd) { char *tmp; uint8_t index = 0; // seperate command from arguments tmp = strsep(&cmd," "); // search in command list for the command while(strcasecmp(CMD_LIST[index].cmd,tmp)) { if(CMD_LIST[index + 1].cmd == NULL) { send_str_p(UPLINK_USART,PSTR("Error: Unknown command\r\n")); return; } index++; } // run the command CMD_LIST[index].funcptr(cmd); return; }