// license:BSD-3-Clause
// copyright-holders:James Wallace
///////////////////////////////////////////////////////////////////////////
// //
// steppers.c steppermotor emulation //
// //
// Emulates : stepper motors driven with full step or half step //
// also emulates the index optic //
// //
// //
// TODO: add further types of stepper motors if needed (Konami/IGT?) //
///////////////////////////////////////////////////////////////////////////
#ifndef MAME_MACHINE_STEPPERS_H
#define MAME_MACHINE_STEPPERS_H
#pragma once
#define BASIC_STEPPER 0
#define STARPOINT_48STEP_REEL 1 /* STARPOINT RMXXX reel unit */
#define STARPOINT_144STEP_DICE 2 /* STARPOINT 1DCU DICE mechanism */
#define STARPOINT_200STEP_REEL 3
#define BARCREST_48STEP_REEL 4 /* Barcrest bespoke reel unit */
#define MPU3_48STEP_REEL 5
#define ECOIN_200STEP_REEL 6 /* Probably not bespoke, but can't find a part number */
#define GAMESMAN_48STEP_REEL 7
#define GAMESMAN_100STEP_REEL 8
#define GAMESMAN_200STEP_REEL 9
#define PROJECT_48STEP_REEL 10
#define MCFG_STEPPER_OPTIC_CALLBACK(_write) \
devcb = &downcast<stepper_device &>(*device).set_optic_handler(DEVCB_##_write);
class stepper_device : public device_t
{
public:
stepper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint8_t init_phase)
: stepper_device(mconfig, tag, owner, (uint32_t)0)
{
set_init_phase(init_phase);
}
stepper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
template <class Object> devcb_base &set_optic_handler(Object &&cb) { return m_optic_cb.set_callback(std::forward<Object>(cb)); }
/* total size of reel (in half steps) */
void set_max_steps(int16_t steps) { m_max_steps = steps; }
/* start position of index (in half steps) */
void set_start_index(int16_t index) { m_index_start = index; }
/* end position of index (in half steps) */
void set_end_index(int16_t index) { m_index_end = index; }
/* end position of index (in half steps) */
void set_index_pattern(int16_t index) { m_index_patt = index; }
/* Phase at 0, for opto linkage */
void set_init_phase(uint8_t phase) { m_initphase = phase; m_phase = phase; m_old_phase = phase; }
/* update a motor */
int update(uint8_t pattern);
/* get current position in half steps */
int get_position() { return m_step_pos; }
/* get current absolute position in half steps */
int get_absolute_position() { return m_abs_step_pos; }
/* get maximum position in half steps */
int get_max() { return m_max_steps; }
protected:
stepper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
uint8_t m_pattern; /* coil pattern */
uint8_t m_old_pattern; /* old coil pattern */
uint8_t m_initphase;
uint8_t m_phase; /* motor phase */
uint8_t m_old_phase; /* old phase */
int16_t m_step_pos; /* step position 0 - max_steps */
int16_t m_max_steps; /* maximum step position */
int32_t m_abs_step_pos; /* absolute step position */
int16_t m_index_start; /* start position of index (in half steps) */
int16_t m_index_end; /* end position of index (in half steps) */
int16_t m_index_patt; /* pattern needed on coils (0=don't care) */
uint8_t m_optic;
void update_optic();
virtual void advance_phase();
devcb_write_line m_optic_cb;
};
class reel_device : public stepper_device
{
public:
reel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint8_t type, int16_t start_index, int16_t end_index
, int16_t index_pattern, uint8_t init_phase, int16_t max_steps = 48*2);
reel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
virtual void device_start() override;
virtual void advance_phase() override;
void set_reel_type(uint8_t type)
{
m_type = type;
switch ( type )
{
default:
case STARPOINT_48STEP_REEL: /* STARPOINT RMxxx */
case BARCREST_48STEP_REEL : /* Barcrest Reel unit */
case MPU3_48STEP_REEL :
case GAMESMAN_48STEP_REEL : /* Gamesman GMxxxx */
case PROJECT_48STEP_REEL :
m_max_steps = (48*2);
break;
case GAMESMAN_100STEP_REEL :
m_max_steps = (100*2);
break;
case STARPOINT_144STEP_DICE :/* STARPOINT 1DCU DICE mechanism */
//Dice reels are 48 step motors, but complete three full cycles between opto updates
m_max_steps = ((48*3)*2);
break;
case STARPOINT_200STEP_REEL :
case GAMESMAN_200STEP_REEL :
case ECOIN_200STEP_REEL :
m_max_steps = (200*2);
break;
}
}
uint8_t m_type; /* reel type */
};
DECLARE_DEVICE_TYPE(STEPPER, stepper_device)
DECLARE_DEVICE_TYPE(REEL, reel_device)
#endif // MAME_MACHINE_STEPPERS_H