Subversion Repositories svn.mios32

Rev

Rev 1543 | Rev 1633 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1260 tk 1
// $Id: terminal.c 1604 2012-12-16 03:50:41Z tk $
2
/*
3
 * The command/configuration Terminal
4
 *
5
 * ==========================================================================
6
 *
7
 *  Copyright (C) 2010 Thorsten Klose (tk@midibox.org)
8
 *  Licensed for personal non-commercial use only.
9
 *  All other rights reserved.
10
 *
11
 * ==========================================================================
12
 */
13
 
14
/////////////////////////////////////////////////////////////////////////////
15
// Include files
16
/////////////////////////////////////////////////////////////////////////////
17
 
18
#include <mios32.h>
19
#include <string.h>
20
 
1492 tk 21
#include <midi_port.h>
22
#include <midi_router.h>
23
#include <midimon.h>
1543 tk 24
#include <file.h>
1492 tk 25
 
1260 tk 26
#include "app.h"
27
#include "midio_patch.h"
28
#include "terminal.h"
1387 tk 29
#include "uip_terminal.h"
1260 tk 30
#include "tasks.h"
31
#include "midio_file.h"
32
#include "midio_file_p.h"
1543 tk 33
#include "mid_file.h"
1260 tk 34
 
1543 tk 35
 
1260 tk 36
/////////////////////////////////////////////////////////////////////////////
37
// Local defines
38
/////////////////////////////////////////////////////////////////////////////
39
 
1543 tk 40
#define STRING_MAX 100 // recommended size for file transfers via FILE_BrowserHandler()
1260 tk 41
 
42
 
43
/////////////////////////////////////////////////////////////////////////////
44
// Local variables
45
/////////////////////////////////////////////////////////////////////////////
46
 
47
static char line_buffer[STRING_MAX];
48
static u16 line_ix;
49
 
50
 
51
/////////////////////////////////////////////////////////////////////////////
52
// Local prototypes
53
/////////////////////////////////////////////////////////////////////////////
54
 
1543 tk 55
static s32 TERMINAL_ParseFilebrowser(mios32_midi_port_t port, char byte);
1260 tk 56
static s32 TERMINAL_PrintSystem(void *_output_function);
57
 
58
 
59
/////////////////////////////////////////////////////////////////////////////
60
// Initialisation
61
/////////////////////////////////////////////////////////////////////////////
62
s32 TERMINAL_Init(u32 mode)
63
{
1543 tk 64
  // install the callback function which is called on incoming characters from MIOS Terminal
1260 tk 65
  MIOS32_MIDI_DebugCommandCallback_Init(TERMINAL_Parse);
66
 
1543 tk 67
  // install the callback function which is called on incoming characters from MIOS Filebrowser
68
  MIOS32_MIDI_FilebrowserCommandCallback_Init(TERMINAL_ParseFilebrowser);
69
 
1260 tk 70
  // clear line buffer
71
  line_buffer[0] = 0;
72
  line_ix = 0;
73
 
74
  return 0; // no error
75
}
76
 
77
 
78
/////////////////////////////////////////////////////////////////////////////
79
// help function which parses a decimal or hex value
80
// returns >= 0 if value is valid
81
// returns -1 if value is invalid
82
/////////////////////////////////////////////////////////////////////////////
83
static s32 get_dec(char *word)
84
{
85
  if( word == NULL )
86
    return -1;
87
 
88
  char *next;
89
  long l = strtol(word, &next, 0);
90
 
91
  if( word == next )
92
    return -1;
93
 
94
  return l; // value is valid
95
}
96
 
97
 
98
/////////////////////////////////////////////////////////////////////////////
99
// help function which parses for on or off
100
// returns 0 if 'off', 1 if 'on', -1 if invalid
101
/////////////////////////////////////////////////////////////////////////////
102
static s32 get_on_off(char *word)
103
{
104
  if( strcmp(word, "on") == 0 )
105
    return 1;
106
 
107
  if( strcmp(word, "off") == 0 )
108
    return 0;
109
 
110
  return -1;
111
}
112
 
113
 
114
/////////////////////////////////////////////////////////////////////////////
115
// Parser
116
/////////////////////////////////////////////////////////////////////////////
1333 tk 117
s32 TERMINAL_Parse(mios32_midi_port_t port, char byte)
1260 tk 118
{
119
  // temporary change debug port (will be restored at the end of this function)
120
  mios32_midi_port_t prev_debug_port = MIOS32_MIDI_DebugPortGet();
121
  MIOS32_MIDI_DebugPortSet(port);
122
 
123
  if( byte == '\r' ) {
124
    // ignore
125
  } else if( byte == '\n' ) {
126
    MUTEX_MIDIOUT_TAKE;
127
    TERMINAL_ParseLine(line_buffer, MIOS32_MIDI_SendDebugMessage);
128
    MUTEX_MIDIOUT_GIVE;
129
    line_ix = 0;
130
    line_buffer[line_ix] = 0;
131
  } else if( line_ix < (STRING_MAX-1) ) {
132
    line_buffer[line_ix++] = byte;
133
    line_buffer[line_ix] = 0;
134
  }
135
 
136
  // restore debug port
137
  MIOS32_MIDI_DebugPortSet(prev_debug_port);
138
 
139
  return 0; // no error
140
}
141
 
142
 
143
/////////////////////////////////////////////////////////////////////////////
1543 tk 144
// Parser for Filebrowser
145
/////////////////////////////////////////////////////////////////////////////
146
s32 TERMINAL_ParseFilebrowser(mios32_midi_port_t port, char byte)
147
{
148
  if( byte == '\r' ) {
149
    // ignore
150
  } else if( byte == '\n' ) {
151
 
152
    // extra for MIDIO128: ensure that recording not active to avoid conflict with write operations!
153
    if( MID_FILE_RecordingEnabled() ) {
154
      MID_FILE_SetRecordMode(0);
155
    }
156
 
157
    MUTEX_MIDIOUT_TAKE;
158
    MUTEX_SDCARD_TAKE;
159
    FILE_BrowserHandler(port, line_buffer);
160
    MUTEX_SDCARD_GIVE;
161
    MUTEX_MIDIOUT_GIVE;
162
    line_ix = 0;
163
    line_buffer[line_ix] = 0;
164
  } else if( line_ix < (STRING_MAX-1) ) {
165
    line_buffer[line_ix++] = byte;
166
    line_buffer[line_ix] = 0;
167
  }
168
 
169
  return 0; // no error
170
}
171
 
172
 
173
/////////////////////////////////////////////////////////////////////////////
1260 tk 174
// Parser for a complete line - also used by shell.c for telnet
175
/////////////////////////////////////////////////////////////////////////////
176
s32 TERMINAL_ParseLine(char *input, void *_output_function)
177
{
178
  void (*out)(char *format, ...) = _output_function;
179
  char *separators = " \t";
180
  char *brkt;
181
  char *parameter;
182
 
1387 tk 183
  if( UIP_TERMINAL_ParseLine(input, _output_function) > 0 )
184
    return 0; // command parsed by UIP Terminal
185
 
1492 tk 186
  if( MIDIMON_TerminalParseLine(input, _output_function) > 0 )
187
    return 0; // command parsed
188
 
189
  if( MIDI_ROUTER_TerminalParseLine(input, _output_function) > 0 )
190
    return 0; // command parsed
191
 
1260 tk 192
  if( (parameter = strtok_r(input, separators, &brkt)) ) {
193
    if( strcmp(parameter, "help") == 0 ) {
194
      out("Welcome to " MIOS32_LCD_BOOT_MSG_LINE1 "!");
195
      out("Following commands are available:");
196
      out("  system:                           print system info");
1387 tk 197
      UIP_TERMINAL_Help(_output_function);
1492 tk 198
      MIDIMON_TerminalHelp(_output_function);
199
      MIDI_ROUTER_TerminalHelp(_output_function);
1292 tk 200
      out("  set dout <pin> <0|1>:             directly sets DOUT (all or 0..%d) to given level (1 or 0)", MIOS32_SRIO_NUM_SR*8 - 1);
1264 tk 201
      out("  save <name>:                      stores current config on SD Card");
202
      out("  load <name>:                      restores config from SD Card");
1604 tk 203
      out("  show file:                        shows the current configuration file");
1320 tk 204
      out("  msd <on|off>:                     enables Mass Storage Device driver");
1260 tk 205
      out("  reset:                            resets the MIDIbox (!)\n");
206
      out("  help:                             this page");
207
      out("  exit:                             (telnet only) exits the terminal");
208
    } else if( strcmp(parameter, "system") == 0 ) {
209
      TERMINAL_PrintSystem(_output_function);
1320 tk 210
    } else if( strcmp(parameter, "msd") == 0 ) {
211
      char *arg = NULL;
212
      if( (arg = strtok_r(NULL, separators, &brkt)) ) {
213
    if( strcmp(arg, "on") == 0 ) {
214
      if( TASK_MSD_EnableGet() ) {
215
        out("Mass Storage Device Mode already activated!\n");
216
      } else {
217
        out("Mass Storage Device Mode activated - USB MIDI will be disabled!!!\n");
218
        // wait a second to ensure that this message is print in MIOS Terminal
219
        int d;
220
        for(d=0; d<1000; ++d)
221
          MIOS32_DELAY_Wait_uS(1000);
222
        // activate MSD mode
223
        TASK_MSD_EnableSet(1);
224
      }
225
    } else if( strcmp(arg, "off") == 0 ) {
226
      if( !TASK_MSD_EnableGet() ) {
227
        out("Mass Storage Device Mode already deactivated!\n");
228
      } else {
229
        out("Mass Storage Device Mode deactivated - USB MIDI will be available again.n");
230
        TASK_MSD_EnableSet(0);
231
      }
232
    } else
233
      arg = NULL;
234
      }
235
      if( arg == NULL ) {
236
    out("Please enter 'msd on' or 'msd off'\n");
237
      }      
1264 tk 238
    } else if( strcmp(parameter, "save") == 0 ) {
239
      if( !(parameter = strtok_r(NULL, separators, &brkt)) ) {
240
    out("ERROR: please specify filename for patch (up to 8 characters)!");
1260 tk 241
      } else {
1264 tk 242
    if( strlen(parameter) > 8 ) {
243
      out("ERROR: 8 characters maximum!");
244
    } else {
245
      s32 status = MIDIO_PATCH_Store(parameter);
246
      if( status >= 0 ) {
247
        out("Patch '%s' stored on SD Card!", parameter);
248
      } else {
249
        out("ERROR: failed to store patch '%s' on SD Card (status %d)!", parameter, status);
250
      }
251
    }
1260 tk 252
      }
1264 tk 253
    } else if( strcmp(parameter, "load") == 0 ) {
254
      if( !(parameter = strtok_r(NULL, separators, &brkt)) ) {
255
    out("ERROR: please specify filename for patch (up to 8 characters)!");
1260 tk 256
      } else {
1264 tk 257
    if( strlen(parameter) > 8 ) {
258
      out("ERROR: 8 characters maximum!");
259
    } else {
260
      s32 status = MIDIO_PATCH_Load(parameter);
261
      if( status >= 0 ) {
262
        out("Patch '%s' loaded from SD Card!", parameter);
263
      } else {
264
        out("ERROR: failed to load patch '%s' on SD Card (status %d)!", parameter, status);
265
      }
266
    }
1260 tk 267
      }
268
    } else if( strcmp(parameter, "show") == 0 ) {
1604 tk 269
      if( !(parameter = strtok_r(NULL, separators, &brkt)) ) {
270
    out("ERROR: please specify the item which should be displayed!");
271
      } else {
272
    if( strcmp(parameter, "file") == 0 )
273
      MIDIO_FILE_P_Debug();
274
    else {
275
      out("ERROR: invalid item which should be showed - see help for available items!");
276
    }
277
      }
1260 tk 278
    } else if( strcmp(parameter, "reset") == 0 ) {
279
      MIOS32_SYS_Reset();
280
    } else if( strcmp(parameter, "set") == 0 ) {
281
      if( (parameter = strtok_r(NULL, separators, &brkt)) ) {
1492 tk 282
    if( strcmp(parameter, "dout") == 0 ) {
1260 tk 283
      s32 pin = -1;
284
      if( (parameter = strtok_r(NULL, separators, &brkt)) ) {
285
        if( strcmp(parameter, "all") == 0 ) {
286
          pin = -42;
287
        } else {
288
          pin = get_dec(parameter);
289
        }
290
      }
291
 
292
      if( (pin < 0 && pin != -42) || pin >= (MIOS32_SRIO_NUM_SR*8) ) {
293
        out("Pin number should be between 0..%d", MIOS32_SRIO_NUM_SR*8 - 1);
294
      } else {
295
        s32 value = -1;
296
        if( (parameter = strtok_r(NULL, separators, &brkt)) )
297
          value = get_dec(parameter);
298
 
299
        if( value < 0 || value > 1 ) {
300
          out("Expecting value 1 or 0 for DOUT pin %d", pin);
301
        } else {
302
          if( pin == -42 ) {
303
        for(pin=0; pin<(MIOS32_SRIO_NUM_SR*8); ++pin)
304
          MIOS32_DOUT_PinSet(pin, value);
305
        out("All DOUT pins set to %d", value);
306
          } else {
307
        MIOS32_DOUT_PinSet(pin, value);
308
        out("DOUT Pin %d (SR#%d.D%d) set to %d", pin, (pin/8)+1, 7-(pin%8), value);
309
          }
310
        }
311
      }
312
    } else {
313
      out("Unknown set parameter: '%s'!", parameter);
314
    }
315
      } else {
316
    out("Missing parameter after 'set'!");
317
      }
318
    } else {
319
      out("Unknown command - type 'help' to list available commands!");
320
    }
321
  }
322
 
323
  return 0; // no error
324
}
325
 
326
 
327
/////////////////////////////////////////////////////////////////////////////
328
// System Informations
329
/////////////////////////////////////////////////////////////////////////////
330
static s32 TERMINAL_PrintSystem(void *_output_function)
331
{
332
  void (*out)(char *format, ...) = _output_function;
333
 
334
  out("Application: " MIOS32_LCD_BOOT_MSG_LINE1);
335
 
1492 tk 336
  MIDIMON_TerminalPrintConfig(out);
1260 tk 337
 
338
  return 0; // no error
339
}