?? ticket.c
字號:
/***************************************************************************
machine.c
Functions to emulate a prototypical ticket dispenser hardware.
Right now, this is an *extremely* basic ticket dispenser.
TODO: Active Bit may not be Bit 7 in all applications.
Add a ticket dispenser interface instead of passing a bunch
of arguments to ticket_dispenser_init.
Add sound, graphical output?
***************************************************************************/
#include "driver.h"
#include "machine/ticket.h"
unsigned int dispensed_tickets = 0;
static int status;
static int power;
static int time_msec;
static int motoron;
static int ticketdispensed;
static int ticketnotdispensed;
static void *timer;
static int active_bit = 0x80;
/* Callback routine used during ticket dispensing */
static void ticket_dispenser_toggle(int parm);
/***************************************************************************
ticket_dispenser_init
***************************************************************************/
void ticket_dispenser_init(int msec, int motoronhigh, int statusactivehigh)
{
time_msec = msec;
motoron = motoronhigh ? active_bit : 0;
ticketdispensed = statusactivehigh ? active_bit : 0;
ticketnotdispensed = ticketdispensed ^ active_bit;
status = ticketnotdispensed;
power = 0x00;
}
/***************************************************************************
ticket_dispenser_r
***************************************************************************/
int ticket_dispenser_r(int offset)
{
return status;
}
/***************************************************************************
ticket_dispenser_w
***************************************************************************/
void ticket_dispenser_w(int offset, int data)
{
/* On an activate signal, start dispensing! */
if ((data & active_bit) == motoron)
{
if (!power)
{
timer = timer_set (TIME_IN_MSEC(time_msec), 0, ticket_dispenser_toggle);
power = 1;
status = ticketnotdispensed;
}
}
else
{
if (power)
{
timer_remove(timer);
osd_led_w(2,0);
power = 0;
}
}
}
/***************************************************************************
ticket_dispenser_toggle
How I think this works:
When a ticket dispenses, there is N milliseconds of status = high,
and N milliseconds of status = low (a wait cycle?).
***************************************************************************/
static void ticket_dispenser_toggle(int parm)
{
/* If we still have power, keep toggling ticket states. */
if (power)
{
status ^= active_bit;
timer = timer_set (TIME_IN_MSEC(time_msec), 0, ticket_dispenser_toggle);
}
if (status == ticketdispensed)
{
osd_led_w(2,1);
dispensed_tickets++;
}
else
{
osd_led_w(2,0);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -