Subversion Repositories svn.mios32

Rev

Rev 1492 | Rev 1604 | 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 1543 2012-11-25 21:27:45Z 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");
1260 tk 203
      out("  show:                             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 ) {
269
      MIDIO_FILE_P_Debug();
270
    } else if( strcmp(parameter, "reset") == 0 ) {
271
      MIOS32_SYS_Reset();
272
    } else if( strcmp(parameter, "set") == 0 ) {
273
      if( (parameter = strtok_r(NULL, separators, &brkt)) ) {
1492 tk 274
    if( strcmp(parameter, "dout") == 0 ) {
1260 tk 275
      s32 pin = -1;
276
      if( (parameter = strtok_r(NULL, separators, &brkt)) ) {
277
        if( strcmp(parameter, "all") == 0 ) {
278
          pin = -42;
279
        } else {
280
          pin = get_dec(parameter);
281
        }
282
      }
283
 
284
      if( (pin < 0 && pin != -42) || pin >= (MIOS32_SRIO_NUM_SR*8) ) {
285
        out("Pin number should be between 0..%d", MIOS32_SRIO_NUM_SR*8 - 1);
286
      } else {
287
        s32 value = -1;
288
        if( (parameter = strtok_r(NULL, separators, &brkt)) )
289
          value = get_dec(parameter);
290
 
291
        if( value < 0 || value > 1 ) {
292
          out("Expecting value 1 or 0 for DOUT pin %d", pin);
293
        } else {
294
          if( pin == -42 ) {
295
        for(pin=0; pin<(MIOS32_SRIO_NUM_SR*8); ++pin)
296
          MIOS32_DOUT_PinSet(pin, value);
297
        out("All DOUT pins set to %d", value);
298
          } else {
299
        MIOS32_DOUT_PinSet(pin, value);
300
        out("DOUT Pin %d (SR#%d.D%d) set to %d", pin, (pin/8)+1, 7-(pin%8), value);
301
          }
302
        }
303
      }
304
    } else {
305
      out("Unknown set parameter: '%s'!", parameter);
306
    }
307
      } else {
308
    out("Missing parameter after 'set'!");
309
      }
310
    } else {
311
      out("Unknown command - type 'help' to list available commands!");
312
    }
313
  }
314
 
315
  return 0; // no error
316
}
317
 
318
 
319
/////////////////////////////////////////////////////////////////////////////
320
// System Informations
321
/////////////////////////////////////////////////////////////////////////////
322
static s32 TERMINAL_PrintSystem(void *_output_function)
323
{
324
  void (*out)(char *format, ...) = _output_function;
325
 
326
  out("Application: " MIOS32_LCD_BOOT_MSG_LINE1);
327
 
1492 tk 328
  MIDIMON_TerminalPrintConfig(out);
1260 tk 329
 
330
  return 0; // no error
331
}