Subversion Repositories svn.mios32

Rev

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