FRONTPANEL: Added mount and dismount commands for removable media

This commit is contained in:
Mark Pizzolato 2015-04-04 16:37:43 -07:00
parent a7da3c6f54
commit 325e369bfd
7 changed files with 144 additions and 6 deletions

View file

@ -309,6 +309,20 @@ if (!sim_panel_get_registers (panel, NULL)) {
printf ("Unexpected success getting register data: %s\n", sim_panel_get_error()); printf ("Unexpected success getting register data: %s\n", sim_panel_get_error());
goto Done; goto Done;
} }
sim_panel_clear_error ();
if (!sim_panel_dismount (panel, "RL0")) {
printf ("Unexpected success while dismounting media file from non mounted RL0: %s\n", sim_panel_get_error());
goto Done;
}
if (sim_panel_mount (panel, "RL0", "-N", "TEST-RL.DSK")) {
printf ("Error while mounting media file TEST-RL.DSK on RL0: %s\n", sim_panel_get_error());
goto Done;
}
if (sim_panel_dismount (panel, "RL0")) {
printf ("Error while dismounting media file from RL0: %s\n", sim_panel_get_error());
goto Done;
}
remove ("TEST-RL.DSK");
while (1) { while (1) {
size_t i; size_t i;
char cmd[512]; char cmd[512];

11
scp.c
View file

@ -490,7 +490,7 @@ static int32 noqueue_time;
volatile int32 stop_cpu = 0; volatile int32 stop_cpu = 0;
static char **sim_argv; static char **sim_argv;
t_value *sim_eval = NULL; t_value *sim_eval = NULL;
t_value sim_last_val; static t_value sim_last_val;
FILE *sim_log = NULL; /* log file */ FILE *sim_log = NULL; /* log file */
FILEREF *sim_log_ref = NULL; /* log file file reference */ FILEREF *sim_log_ref = NULL; /* log file file reference */
FILE *sim_deb = NULL; /* debug file */ FILE *sim_deb = NULL; /* debug file */
@ -503,7 +503,7 @@ static int32 sim_goto_line[MAX_DO_NEST_LVL+1]; /* the current line numb
static int32 sim_do_echo = 0; /* the echo status of the currently open do file */ static int32 sim_do_echo = 0; /* the echo status of the currently open do file */
static int32 sim_show_message = 1; /* the message display status of the currently open do file */ static int32 sim_show_message = 1; /* the message display status of the currently open do file */
static int32 sim_on_inherit = 0; /* the inherit status of on state and conditions when executing do files */ static int32 sim_on_inherit = 0; /* the inherit status of on state and conditions when executing do files */
int32 sim_do_depth = 0; static int32 sim_do_depth = 0;
static int32 sim_on_check[MAX_DO_NEST_LVL+1]; static int32 sim_on_check[MAX_DO_NEST_LVL+1];
static char *sim_on_actions[MAX_DO_NEST_LVL+1][SCPE_MAX_ERR+1]; static char *sim_on_actions[MAX_DO_NEST_LVL+1][SCPE_MAX_ERR+1];
@ -511,7 +511,7 @@ static char sim_do_filename[MAX_DO_NEST_LVL+1][CBUFSIZE];
static char *sim_do_ocptr[MAX_DO_NEST_LVL+1]; static char *sim_do_ocptr[MAX_DO_NEST_LVL+1];
static char *sim_do_label[MAX_DO_NEST_LVL+1]; static char *sim_do_label[MAX_DO_NEST_LVL+1];
static t_stat sim_last_cmd_stat; /* Command Status */ t_stat sim_last_cmd_stat; /* Command Status */
static SCHTAB sim_stabr; /* Register search specifier */ static SCHTAB sim_stabr; /* Register search specifier */
static SCHTAB sim_staba; /* Memory search specifier */ static SCHTAB sim_staba; /* Memory search specifier */
@ -7026,8 +7026,9 @@ t_stat get_yn (const char *ques, t_stat deflt)
{ {
char cbuf[CBUFSIZE], *cptr; char cbuf[CBUFSIZE], *cptr;
printf ("%s ", ques); if (sim_rem_cmd_active_line != -1)
cptr = read_line (cbuf, sizeof(cbuf), stdin); return deflt;
cptr = read_line_p (ques, cbuf, sizeof(cbuf), stdin);
if ((cptr == NULL) || (*cptr == 0)) if ((cptr == NULL) || (*cptr == 0))
return deflt; return deflt;
if ((*cptr == 'Y') || (*cptr == 'y')) if ((*cptr == 'Y') || (*cptr == 'y'))

1
scp.h
View file

@ -221,6 +221,7 @@ extern int32 sim_interval;
extern int32 sim_switches; extern int32 sim_switches;
extern int32 sim_quiet; extern int32 sim_quiet;
extern int32 sim_step; extern int32 sim_step;
extern t_stat sim_last_cmd_stat; /* Command Status */
extern FILE *sim_log; /* log file */ extern FILE *sim_log; /* log file */
extern FILEREF *sim_log_ref; /* log file file reference */ extern FILEREF *sim_log_ref; /* log file file reference */
extern FILE *sim_deb; /* debug file */ extern FILE *sim_deb; /* debug file */

View file

@ -411,7 +411,7 @@ static TMXR sim_rem_con_tmxr = { 0, 0, 0, NULL, NULL, &sim_remote_console };/* r
static uint32 sim_rem_read_timeout = 30; /* seconds before automatic continue */ static uint32 sim_rem_read_timeout = 30; /* seconds before automatic continue */
static uint32 *sim_rem_read_timeouts = NULL;/* per line read timeout (default from sim_rem_read_timeout) */ static uint32 *sim_rem_read_timeouts = NULL;/* per line read timeout (default from sim_rem_read_timeout) */
static int32 sim_rem_active_number = -1; /* -1 - not active, >= 0 is index of active console */ static int32 sim_rem_active_number = -1; /* -1 - not active, >= 0 is index of active console */
static int32 sim_rem_cmd_active_line = -1; /* step in progress on line # */ int32 sim_rem_cmd_active_line = -1; /* step in progress on line # */
static CTAB *sim_rem_active_command = NULL; /* active command */ static CTAB *sim_rem_active_command = NULL; /* active command */
static char *sim_rem_command_buf; /* active command buffer */ static char *sim_rem_command_buf; /* active command buffer */
static t_bool sim_log_temp = FALSE; /* temporary log file active */ static t_bool sim_log_temp = FALSE; /* temporary log file active */
@ -688,6 +688,7 @@ sim_ttcmd (); /* restore console */
stat = sim_rem_active_command->action (sim_rem_active_command->arg, cptr);/* execute command */ stat = sim_rem_active_command->action (sim_rem_active_command->arg, cptr);/* execute command */
if (stat != SCPE_OK) if (stat != SCPE_OK)
stat = _sim_rem_message (gbuf, stat); /* display results */ stat = _sim_rem_message (gbuf, stat); /* display results */
sim_last_cmd_stat = SCPE_BARE_STATUS(stat);
sim_ttrun (); /* set console mode */ sim_ttrun (); /* set console mode */
sim_cancel (&sim_rem_con_unit[1]); /* force immediate activation of sim_rem_con_data_svc */ sim_cancel (&sim_rem_con_unit[1]); /* force immediate activation of sim_rem_con_data_svc */
sim_activate (&sim_rem_con_unit[1], -1); sim_activate (&sim_rem_con_unit[1], -1);

View file

@ -120,6 +120,8 @@ int32 sim_tt_outcvt (int32 c, uint32 mode);
t_stat sim_tt_settabs (UNIT *uptr, int32 val, char *cptr, void *desc); t_stat sim_tt_settabs (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat sim_tt_showtabs (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat sim_tt_showtabs (FILE *st, UNIT *uptr, int32 val, void *desc);
extern int32 sim_rem_cmd_active_line; /* command in progress on line # */
extern int32 sim_int_char; /* interrupt character */ extern int32 sim_int_char; /* interrupt character */
extern int32 sim_brk_char; /* break character */ extern int32 sim_brk_char; /* break character */
extern int32 sim_tt_pchar; /* printable character mask */ extern int32 sim_tt_pchar; /* printable character mask */

View file

@ -28,6 +28,8 @@
03-Apr-15 MP Added logic to pass simulator startup messages in 03-Apr-15 MP Added logic to pass simulator startup messages in
panel error text if the connection to the simulator panel error text if the connection to the simulator
shuts down while it is starting. shuts down while it is starting.
04-Apr-15 MP Added mount and dismount routines to connect and
disconnect removable media
This module provides interface between a front panel application and a simh This module provides interface between a front panel application and a simh
simulator. Facilities provide ways to gather information from and to simulator. Facilities provide ways to gather information from and to
@ -1344,6 +1346,83 @@ if (_panel_sendf (panel, 1, NULL, "DEPOSIT %s %s", name, value))
return 0; return 0;
} }
/**
sim_panel_mount
device the name of a simulator device/unit
switches any switches appropriate for the desire attach
path the path on the local system to be attached
*/
int
sim_panel_mount (PANEL *panel,
const char *device,
const char *switches,
const char *path)
{
char *response = NULL, *status = NULL;
if (!panel || (panel->State == Error)) {
sim_panel_set_error ("Invalid Panel");
return -1;
}
if (_panel_sendf (panel, 1, &response, "ATTACH %s %s %s", switches, device, path)) {
free (response);
return -1;
}
if (_panel_sendf (panel, 1, &status, "ECHO %%STATUS%%")) {
free (response);
free (status);
return -1;
}
if (!status || (strcmp (status, "00000000\r\n"))) {
sim_panel_set_error (response);
free (response);
free (status);
return -1;
}
free (response);
free (status);
return 0;
}
/**
sim_panel_dismount
device the name of a simulator device/unit
*/
int
sim_panel_dismount (PANEL *panel,
const char *device)
{
char *response = NULL, *status = NULL;
if (!panel || (panel->State == Error)) {
sim_panel_set_error ("Invalid Panel");
return -1;
}
if (_panel_sendf (panel, 1, &response, "DETACH %s", device)) {
free (response);
return -1;
}
if (_panel_sendf (panel, 1, &status, "ECHO %%STATUS%%")) {
free (response);
free (status);
return -1;
}
if (!status || (strcmp (status, "00000000\r\n"))) {
sim_panel_set_error (response);
free (response);
free (status);
return -1;
}
free (response);
free (status);
return 0;
}
static void * static void *
_panel_reader(void *arg) _panel_reader(void *arg)
{ {
@ -1705,6 +1784,7 @@ if (wait_for_completion) {
strcat (buf, command_done_echo); strcat (buf, command_done_echo);
strcat (buf, "\r"); strcat (buf, "\r");
pthread_mutex_lock (&p->io_lock); pthread_mutex_lock (&p->io_lock);
p->io_response_data = 0;
} }
ret = (strlen (buf) == _panel_send (p, buf, strlen (buf))) ? 0 : -1; ret = (strlen (buf) == _panel_send (p, buf, strlen (buf))) ? 0 : -1;
@ -1723,6 +1803,7 @@ if (wait_for_completion) {
memcpy (*response, p->io_response, p->io_response_data + 1); memcpy (*response, p->io_response, p->io_response_data + 1);
} }
p->io_response_data = 0; p->io_response_data = 0;
p->io_response[0] = '\0';
} }
pthread_mutex_unlock (&p->io_lock); pthread_mutex_unlock (&p->io_lock);
} }

View file

@ -28,6 +28,8 @@
03-Apr-15 MP Added logic to pass simulator startup messages in 03-Apr-15 MP Added logic to pass simulator startup messages in
panel error text if the connection to the simulator panel error text if the connection to the simulator
shuts down while it is starting. shuts down while it is starting.
04-Apr-15 MP Added mount and dismount routines to connect and
disconnect removable media
This module defines interface between a front panel application and a simh This module defines interface between a front panel application and a simh
simulator. Facilities provide ways to gather information from and to simulator. Facilities provide ways to gather information from and to
@ -323,6 +325,42 @@ sim_panel_set_register_value (PANEL *panel,
const char *name, const char *name,
const char *value); const char *value);
/**
When a front panel application may needs to change the media
in a simulated removable media device one of the following
routines should be called:
sim_panel_mount - mounts the indicated media file on a device
sim_panel_dismount - dismounts the currently mounted media file
from a device
*/
/**
sim_panel_mount
device the name of a simulator device/unit
switches any switches appropriate for the desire attach
path the path on the local system to be attached
*/
int
sim_panel_mount (PANEL *panel,
const char *device,
const char *switches,
const char *path);
/**
sim_panel_dismount
device the name of a simulator device/unit
*/
int
sim_panel_dismount (PANEL *panel,
const char *device);
typedef enum { typedef enum {
Halt, /* Simulation is halted (instructions not being executed) */ Halt, /* Simulation is halted (instructions not being executed) */