diff --git a/INSTALL/MidiLink_INI.zip b/INSTALL/MidiLink_INI.zip
index d2e45ec..377f218 100644
Binary files a/INSTALL/MidiLink_INI.zip and b/INSTALL/MidiLink_INI.zip differ
diff --git a/INSTALL/midilink_updater.sh b/INSTALL/midilink_updater.sh
index 11e700b..ecd4872 100644
--- a/INSTALL/midilink_updater.sh
+++ b/INSTALL/midilink_updater.sh
@@ -19,6 +19,8 @@ MT32_ROM_ZIP="$MT32_ROM_DIR/mt32_roms.zip"
MP3_DIR="/media/fat/MP3"
MIDI_DIR="/media/fat/MIDI"
MIDILINK_BIN="/sbin/midilink"
+MLINKUTIL_BIN="/sbin/mlinkutil"
+BIN_REPO="https://github.com/bbond007/MiSTer_MidiLink/blob/master/"
echo "Checking Internet..."
if ! ping -q -w1 -c1 google.com &>/dev/null
then
@@ -77,8 +79,18 @@ if [ -f "$MIDILINK_BIN" ]; then
else
echo "Old MidiLink not found"
fi
+if [ -f "$MLINKUTIL_BIN" ]; then
+ echo "Removing old MLinkUTIL"
+else
+ echo "Old MLinkUTIL not found"
+fi
echo "Downloading MidiLink"
-curl -kL "https://github.com/bbond007/MiSTer_MidiLink/blob/master/midilink?raw=true" -o $MIDILINK_BIN
+curl -kL $BIN_REPO"midilink?raw=true" -o $MIDILINK_BIN
+echo "Downloading MLinkUTIL"
+curl -kL $BIN_REPO"mlinkutil?raw=true" -o $MLINKUTIL_BIN
+echo "Setting permissions : $MIDILINK_BIN, $MLINKUTIL_BIN"
+chmod 755 $MIDILINK_BIN
+chmod 755 $MLINKUTIL_BIN
echo "Rebooting in:"
sleep 1
echo "3"
diff --git a/INSTALL/midilink_updater_script.zip b/INSTALL/midilink_updater_script.zip
index 9848fac..5a1d057 100644
Binary files a/INSTALL/midilink_updater_script.zip and b/INSTALL/midilink_updater_script.zip differ
diff --git a/MidiLink.INI b/MidiLink.INI
index 280e2b3..5c4d6dd 100644
--- a/MidiLink.INI
+++ b/MidiLink.INI
@@ -10,7 +10,7 @@ FSYNTH_VOLUME = -1
MIXER_CONTROL = Master
MUNT_ROM_PATH = /media/fat/linux/mt32-rom-data
FSYNTH_SOUNDFONT = /media/fat/linux/soundfonts/SC-55.sf2
-UDP_SERVER = 192.168.1.157
+UDP_SERVER = 192.168.1.130
UDP_SERVER_PORT = 1999
UDP_SERVER_FILTER = FALSE
UDP_FLOW = 0
@@ -24,22 +24,31 @@ TCP_TERM_ROWS = 23
TCP_FLOW = 3
TCP_SOUND = TRUE
DELAYSYSEX = TRUE
-
-[MINIMIG]
-TCP_TERM_ROWS = 22
-
-[C64]
-MIDI_BAUD = 2400
-TCP_BAUD = 2400
-TCP_TERM_ROWS = 24
-TCP_ATH_DELAY = 0
+#USB_SERIAL_MODULE = /media/fat/pl2303.ko
[AO486]
MIDI_BAUD = 38400
TCP_SOUND_CONNECT = /media/fat/SOUNDS/connect_sav.wav
[ATARIST]
-TCP_BAUD = 31250
+TCP_BAUD = 19200
UDP_BAUD = 31250
-TCP_BAUD_ALT = 19200
UDP_BAUD_ALT = 19200
+TCP_BAUD_ALT = 19200
+
+[C64]
+TCP_TERM_TRANS = PETSKII
+MIDI_BAUD = 2400
+TCP_BAUD = 2400
+TCP_TERM_ROWS = 24
+TCP_ATH_DELAY = 0
+
+[FXCAST]
+TCP_BAUD = 19200
+UDP_BAUD = 31250
+
+[MINIMIG]
+TCP_TERM_ROWS = 22
+USB_SERIAL_BAUD = 9600
+
+
diff --git a/README.md b/README.md
index acea90e..188b9ca 100644
--- a/README.md
+++ b/README.md
@@ -75,26 +75,36 @@ SoftMPU option ***
The 'midilink' daemon currently supports following switches / options:
- TESTMIDI - this option sends a middle 'c' note to the MIDI device
+ TESTMIDI - this option sends a middle 'c' note to the MIDI device
once the daemon is started.
- QUIET - this option suppresses MIDI debug output.
+ BAUD - Specify BAUD rate...
- MUNT - Use MUNT SoftSynth (no USB MIDI adapter
- required)
+ QUIET - this option suppresses MIDI debug output.
- FSYNTH - Use FluidSynth SoftSynth (no USB MIDI adapter
- required)
+ MUNT - Use MUNT SoftSynth (no USB MIDI adapter
+ required)
- UDP - Send MIDI to UDP Port (INI setting MIDI_SERVER /
- MIDI_SERVER_PORT)
+ FSYNTH - Use FluidSynth SoftSynth (no USB MIDI adapter
+ required)
- TCP - Works like a modem with AT commands:
- (ATDT, ATBAUD, ATIPADDR, +++ATH)
+ UDP - Send MIDI to UDP Port (INI setting MIDI_SERVER /
+ MIDI_SERVER_PORT)
- MENU - starts based on /tmp/ML_MUNT, /tmp/ML_UDP,
- /tmp/ML_FSYNTH, /tmp/ML_TCP used with MiSTer
- Menu to set mode of operation.
+ UDPMUNT - Listen on UDP port and send to MUNT
+
+ UDPMUNTGM - Listen on UDP port and send to MUNT (GM mapping)
+
+ UDPFSYNTH - Listen on UDP port and send to FluidSynth
+
+ TCP - Works like a modem with AT commands:
+ (ATDT, ATBAUD, ATIPADDR, +++ATH)
+
+ USBSER - Connect to USB serial converter
+
+ MENU - starts based on /tmp/ML_MUNT, /tmp/ML_UDP,
+ /tmp/ML_FSYNTH, /tmp/ML_TCP /tmp/ML_USBSER
+ used with MiSTer Menu to set mode of operation.
The MidiLink.INI file:
@@ -200,6 +210,8 @@ The MidiLink.INI file:
#TCP_SOUND_CONNECT = --> optional WAV file for TCP modem
connect
+ USB_SERIAL_BAUD = 9600 --> Set USB serial baud to 9600
+
DELAYSYSEX = TRUE --> This option fixes "Buffer Overflow"
error on Roland MT-32 Rev0.
diff --git a/config.h b/config.h
index 28001d1..1032072 100644
--- a/config.h
+++ b/config.h
@@ -14,7 +14,8 @@
static char * midiLinkINI = "/media/fat/linux/MidiLink.INI";
static char * midiLinkDIR = "/media/fat/linux/MidiLink.DIR";
static char * serialDevice = "/dev/ttyS1";
-static char * helloStr = "MiSTer MidiLink 2.9a BB7";
+static char * serialDeviceUSB = "/dev/ttyUSB0";
+static char * helloStr = "MiSTer MidiLink 2.9d BB7";
static unsigned char test_note[3] = {0x90, 60, 127};
static char * midiINDevice = "/dev/midi2";
static char * midiDevice = "/dev/midi1";
diff --git a/ini.c b/ini.c
index 7eef2eb..78c6107 100644
--- a/ini.c
+++ b/ini.c
@@ -25,6 +25,8 @@ extern int TCPBaudRate;
extern int UDPBaudRate_alt;
extern int TCPBaudRate_alt;
extern int MIDIBaudRate;
+extern int USBSerBaudRate;
+extern char USBSerModule[100];
extern int TCPFlow;
extern int TCPDTR;
extern int TCPQuiet;
@@ -45,6 +47,7 @@ extern int TCPATHDelay;
extern enum ASCIITRANS TCPAsciiTrans;
extern enum SOFTSYNTH TCPSoftSynth;
extern int MUNTCPUMask;
+extern int FSYNTHCPUMask;
///////////////////////////////////////////////////////////////////////////////////////
//
@@ -127,11 +130,16 @@ char ini_process_key_value_pair(char * key, char * value)
{
ini_int(value, &MUNTCPUMask);
}
+
else if(strcmp("FSYNTH_VOLUME", key) == 0)
{
misc_replace_char(value, strlen(value), '%', 0x00);
ini_int(value, &fsynthVolume);
}
+ else if (strcmp("FSYNTH_CPU_MASK", key) == 0)
+ {
+ ini_int(value, &FSYNTHCPUMask);
+ }
else if(strcmp("MODEM_VOLUME", key) == 0)
{
misc_replace_char(value, strlen(value), '%', 0x00);
@@ -193,6 +201,14 @@ char ini_process_key_value_pair(char * key, char * value)
{
ini_int(value, &MIDIBaudRate);
}
+ else if (strcmp("USB_SERIAL_BAUD", key) == 0)
+ {
+ ini_int(value, &USBSerBaudRate);
+ }
+ else if (strcmp("USB_SERIAL_MODULE", key) == 0)
+ {
+ ini_str(key, value, USBSerModule, sizeof(USBSerModule));
+ }
else if (strcmp("TCP_TERM_ROWS", key) == 0)
{
ini_uint(value, &TCPTermRows);
@@ -300,6 +316,7 @@ void ini_print_settings(int p)
else
misc_print(p, " - MUNT_VOLUME --> Default (don't set)\n");
misc_print(p, " - MUNT_CPU_MASK --> %d\n",MUNTCPUMask);
+ misc_print(p, " - FSYNTH_CPU_MASK --> %d\n",FSYNTHCPUMask);
if(fsynthVolume != -1)
misc_print(p, " - FSYNTH_VOLUME --> %d%c\n", fsynthVolume, '%');
else
@@ -383,6 +400,11 @@ void ini_print_settings(int p)
misc_print(p, " - TCP_SOUND_CONNECT --> '%s'\n", modemConnectSndWAV);
else
misc_print(p, " - TCP_SOUND_CONNECT --> Software\n");
+ if(USBSerBaudRate > 0)
+ misc_print(p, " - USB_SERIAL_BAUD --> %d\n", USBSerBaudRate);
+ else
+ misc_print(p, " - USB_SERIAL_BAUD --> Default (don't change)\n");
+ misc_print(p, " - USB_SERIAL_MODULE --> '%s'\n", USBSerModule);
misc_print(p, " - DELAYSYSEX --> %s\n", DELAYSYSEX?"TRUE":"FALSE");
misc_print(p, " - MT32_LCD_MSG --> '%s'\n", MT32LCDMsg);
misc_print(p, "\n");
diff --git a/main.c b/main.c
index f8c280b..cf412ab 100644
--- a/main.c
+++ b/main.c
@@ -18,6 +18,7 @@ along with this program. If not, see .
#include
#include
#include
+#include
#include
#include
#include
@@ -43,11 +44,12 @@ along with this program. If not, see .
#define DEFAULT_TCPDTR 1
#define DEFAULT_TCPQuiet 0
-enum MODE {ModeUSBMIDI, ModeTCP, ModeUDP, ModeMUNT, ModeMUNTGM, ModeFSYNTH};
+enum MODE {ModeUSBMIDI, ModeTCP, ModeUDP, ModeUSBSER, ModeMUNT, ModeMUNTGM, ModeFSYNTH, ModeUDPMUNT, ModeUDPMUNTGM, ModeUDPFSYNTH};
int MIDI_DEBUG = TRUE;
static enum MODE mode = ModeUSBMIDI;
static int fdSerial = -1;
+static int fdSerialUSB = -1;
static int fdMidi = -1;
static int fdMidiIN = -1;
static int socket_in = -1;
@@ -74,18 +76,20 @@ int modemVolume = DEFAULT_modemVolume;
int midilinkPriority = 0;
int UDPBaudRate = -1;
int TCPBaudRate = -1;
-int UDPBaudRate_alt = -1;
-int TCPBaudRate_alt = -1;
+int UDPBaudRate_alt = -1;
+int TCPBaudRate_alt = -1;
int MIDIBaudRate = -1;
+int USBSerBaudRate = -1;
+char USBSerModule[100] = "";
enum ASCIITRANS TCPAsciiTrans = DEFAULT_TCPAsciiTrans;
int TCPFlow = DEFAULT_TCPFlow;
int TCPDTR = DEFAULT_TCPDTR;
int UDPFlow = -1;
int MODEMSOUND = DEFAULT_MODEMSOUND;
int TCPQuiet = DEFAULT_TCPQuiet;
-
int TCPATHDelay = 900;
-int MUNTCPUMask = 1;
+int MUNTCPUMask = -1;
+int FSYNTHCPUMask = -1;
enum SOFTSYNTH TCPSoftSynth = FluidSynth;
unsigned int TCPTermRows = DEFAULT_TCPTermRows;
unsigned int DELAYSYSEX = FALSE;
@@ -96,6 +100,7 @@ static pthread_t midiInThread;
static pthread_t midiINInThread;
static pthread_t socketInThread;
static pthread_t socketLstThread;
+static pthread_t serialInThread;
///////////////////////////////////////////////////////////////////////////////////////
//
@@ -104,8 +109,6 @@ void set_pcm_volume(int value)
{
if(value != -1)
{
- //if(misc_check_module_loaded("snd_dummy"))
- // strcpy(mixerControl, "Master");
char buf[30];
sprintf(buf, "amixer set %s %d%c", mixerControl, value, '%');
misc_print(0, "Setting '%s' to %d%\n", mixerControl, value);
@@ -137,24 +140,23 @@ int start_munt()
int midiPort = -1;
set_pcm_volume(muntVolume);
if(strlen(MUNTOptions) > misc_count_str_chr(MUNTOptions, ' '))
- misc_print(0, "Starting --> mt32d : Options --> '%s'\n", MUNTOptions);
+ misc_print(0, "Starting --> mt32d : Options --> '%s' ", MUNTOptions);
else
- {
misc_print(0, "Starting --> mt32d");
- if (CPUMASK != MUNTCPUMask)
+ if (CPUMASK != MUNTCPUMask)
misc_print(0, " : CPUMASK = %d", MUNTCPUMask);
- misc_print(0, "\n");
- }
+ misc_print(0, "\n");
sprintf(buf, "taskset %d mt32d %s -f %s &", MUNTCPUMask, MUNTOptions, MUNTRomPath);
system(buf);
int loop = 0;
do
{
+ if (loop > 0)
+ misc_print(0, "Looking for MUNT port (%d / 2)\n", loop);
sleep(2);
midiPort = alsa_get_midi_port("MT-32");
loop++;
- }
- while(midiPort < 0 && loop < 3);
+ } while (midiPort < 0 && loop < 3);
return midiPort;
}
@@ -167,17 +169,21 @@ int start_fsynth()
char buf[256];
int midiPort = -1;
set_pcm_volume(fsynthVolume);
- misc_print(0, "Starting --> fluidsynth\n");
- sprintf(buf, "taskset %d fluidsynth -is -a alsa -m alsa_seq %s &", CPUMASK, fsynthSoundFont);
+ misc_print(0, "Starting --> fluidsynth");
+ if (CPUMASK != FSYNTHCPUMask)
+ misc_print(0, " : CPUMASK = %d", FSYNTHCPUMask);
+ misc_print(0, "\n");
+ sprintf(buf, "taskset %d fluidsynth -is -a alsa -m alsa_seq %s &", FSYNTHCPUMask, fsynthSoundFont);
system(buf);
int loop = 0;
do
{
- sleep(2);
+ if(loop > 0)
+ misc_print(0, "Looking for FluidSynth port (%d / 13)\n", loop);
+ sleep(3);
midiPort = alsa_get_midi_port("FLUID Synth");
loop++;
- }
- while(midiPort < 0 && loop < 5);
+ } while (midiPort < 0 && loop < 14);
return midiPort;
}
@@ -310,6 +316,17 @@ void play_dial_sound(char * tmp, char * ipAddr)
}
}
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// write_[sequencer]_packet()
+// this is for ALSA sequencer interface
+//
+void write_alsa_packet(char * buf, int bufLen)
+{
+ alsa_send_midi_raw(buf, bufLen);
+ show_debug_buf("SEQU OUT ", buf, bufLen);
+}
+
///////////////////////////////////////////////////////////////////////////////////////
//
// void * tcplst_thread_function(void * x)
@@ -340,7 +357,7 @@ void * tcplst_thread_function (void * x)
play_connect_sound(buf);
if(TCPQuiet == 0)
misc_swrite_no_trans(fdSerial, "\r\nCONNECT %d\r\n", baudRate);
- serial2_set_DCD(fdSerial, TRUE);
+ serial2_set_DCD(serialDevice, fdSerial, TRUE);
do
{
rdLen = read(socket_in, buf, sizeof(buf));
@@ -359,7 +376,7 @@ void * tcplst_thread_function (void * x)
} while (socket_in != -1);
if(TCPQuiet == 0)
misc_swrite_no_trans(fdSerial, "\r\nNO CARRIER\r\n");
- serial2_set_DCD(fdSerial, FALSE);
+ serial2_set_DCD(serialDevice, fdSerial, FALSE);
}
else
{
@@ -429,6 +446,27 @@ void * udpsock_thread_function (void * x)
} while (TRUE);
}
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// void * udpsock_thread_function2(void * x)
+// Thread function for UDP input for external device like Raspberry Pi
+//
+void * udpsock_thread_function2 (void * x)
+{
+ unsigned char buf[100];
+ int rdLen;
+ do
+ {
+ rdLen = udpsock_read(socket_in, (char *) buf, sizeof(buf));
+ if (rdLen > 0)
+ {
+ write_alsa_packet(buf, rdLen);
+ //show_debug_buf("USOCK2 IN", buf, rdLen);
+ }
+ } while (TRUE);
+}
+
///////////////////////////////////////////////////////////////////////////////////////
//
// void do_check_modem_hangup(char * buf, int bufLen)
@@ -463,7 +501,7 @@ void do_check_modem_hangup(int * socket, char * buf, int bufLen)
{
tcpsock_close(*socket);
*socket = -1;
- serial2_set_DCD(fdSerial, FALSE);
+ serial2_set_DCD(serialDevice, fdSerial, FALSE);
sprintf(tmp, "\r\nHANG-UP DETECTED\r\n");
misc_print(1, "HANG-UP Detected --> %d\n", delay);
misc_swrite(fdSerial, tmp);
@@ -686,7 +724,7 @@ int handle_at_command(char * lineBuf)
serial_do_tcdrain(fdSerial);
if(MODEMSOUND)
sleep(1);
- serial2_set_DCD(fdSerial, FALSE);
+ serial2_set_DCD(serialDevice, fdSerial, FALSE);
socket_out = tcpsock_client_connect(ipAddr, iPort, fdSerial);
}
if(socket_out > 0)
@@ -700,7 +738,7 @@ int handle_at_command(char * lineBuf)
serial_do_tcdrain(fdSerial);
sleep(1);
int status = pthread_create(&socketInThread, NULL, tcpsock_thread_function, NULL);
- serial2_set_DCD(fdSerial, TRUE);
+ serial2_set_DCD(serialDevice, fdSerial, TRUE);
return TRUE;
}
}
@@ -886,7 +924,7 @@ int handle_at_command(char * lineBuf)
char * strRows = &lineBuf[6];
if(!misc_is_number(strRows))
{
- for (int i = 50; i > 0; i--)
+ for (int i = 50; i > 1; i--)
misc_swrite(fdSerial, "\r\n%2d", i);
}
else
@@ -1143,6 +1181,30 @@ void * midi_thread_function (void * x)
} while (TRUE);
}
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// void * serial_thread_function(void * x)
+// Thread function for /dev/ttyUSB input
+//
+void * serial_thread_function (void * x)
+{
+ unsigned char buf [100];
+ int rdLen;
+ do
+ {
+ rdLen = read(fdSerialUSB, &buf, sizeof(buf));
+ if (rdLen > 0)
+ {
+ write(fdSerial, buf, rdLen);
+ show_debug_buf("SERIAL IN ", buf, rdLen);
+ }
+ else
+ {
+ misc_print(1, "ERROR: serial_thread_function() reading %s --> %d : %s \n", serialDeviceUSB, rdLen, strerror(errno));
+ }
+ } while (TRUE);
+}
+
///////////////////////////////////////////////////////////////////////////////////////
//
// write_midi_packet()
@@ -1235,7 +1297,6 @@ void * midiINin_thread_function (void * x)
// write_socket_packet()
// this is for TCP/IP
//
-
void write_socket_packet(int sock, char * buf, int bufLen)
{
if (mode == ModeTCP)
@@ -1253,17 +1314,6 @@ void write_socket_packet(int sock, char * buf, int bufLen)
show_debug_buf("SOCK OUT ", buf, bufLen);
}
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// write_[sequencer]_packet()
-// this is for ALSA sequencer interface
-//
-void write_alsa_packet(char * buf, int bufLen)
-{
- alsa_send_midi_raw(buf, bufLen);
- show_debug_buf("SEQU OUT ", buf, bufLen);
-}
-
///////////////////////////////////////////////////////////////////////////////////////
//
// void show_line()
@@ -1286,6 +1336,7 @@ void show_line()
void close_fd()
{
if (fdSerial > 0) close (fdSerial);
+ if (fdSerial > 0) close (fdSerialUSB);
if (fdMidi > 0) close (fdMidi);
if (fdMidiIN > 0) close (fdMidiIN);
if (socket_in > 0) tcpsock_close(socket_in);
@@ -1331,6 +1382,8 @@ int main(int argc, char *argv[])
int altBaud = FALSE;
char coreName[30] = "";
MUNTCPUMask = CPUMASK;
+ FSYNTHCPUMask = CPUMASK;
+
unsigned char buf[256];
//catch_signal(SIGTERM);
misc_print(0, "\e[2J\e[H");
@@ -1342,6 +1395,12 @@ int main(int argc, char *argv[])
if(misc_check_file(midiLinkINI))
ini_read_ini(midiLinkINI, coreName, 0);
+ else
+ {
+ midiLinkINI = basename(midiLinkINI);
+ if(misc_check_file(midiLinkINI))
+ ini_read_ini(midiLinkINI, coreName, 0);
+ }
if (misc_check_args_option(argc, argv, "QUIET"))
MIDI_DEBUG = FALSE;
@@ -1351,20 +1410,18 @@ int main(int argc, char *argv[])
if (midilinkPriority != 0)
misc_set_priority(midilinkPriority);
- int MIDI = misc_check_device(midiDevice);
-
- if (misc_check_args_option(argc, argv, "MENU") && !MIDI)
+ if (!misc_check_device(midiDevice) && misc_check_args_option(argc, argv, "MENU"))
{
- if (misc_check_file("/tmp/ML_MUNT") && !MIDI) mode = ModeMUNT;
- if (misc_check_file("/tmp/ML_MUNTGM") && !MIDI) mode = ModeMUNTGM;
- if (misc_check_file("/tmp/ML_FSYNTH") && !MIDI) mode = ModeFSYNTH;
- if (misc_check_file("/tmp/ML_UDP")) {mode = ModeUDP; altBaud = FALSE;}
- if (misc_check_file("/tmp/ML_TCP")) {mode = ModeTCP; altBaud = FALSE;}
- if (misc_check_file("/tmp/ML_UDP_ALT")) {mode = ModeUDP; altBaud = TRUE; }
- if (misc_check_file("/tmp/ML_TCP_ALT")) {mode = ModeTCP; altBaud = TRUE; }
- if (misc_check_file("/tmp/ML_USBMIDI")) mode = ModeUSBMIDI;
- if (mode != ModeMUNT && mode != ModeMUNTGM && mode != ModeFSYNTH &&
- mode != ModeTCP && mode != ModeUDP)
+ if (misc_check_file("/tmp/ML_MUNT")) mode = ModeMUNT;
+ if (misc_check_file("/tmp/ML_MUNTGM")) mode = ModeMUNTGM;
+ if (misc_check_file("/tmp/ML_FSYNTH")) mode = ModeFSYNTH;
+ if (misc_check_file("/tmp/ML_UDP")) { mode = ModeUDP; altBaud = FALSE; }
+ if (misc_check_file("/tmp/ML_TCP")) { mode = ModeTCP; altBaud = FALSE; }
+ if (misc_check_file("/tmp/ML_UDP_ALT")) { mode = ModeUDP; altBaud = TRUE; }
+ if (misc_check_file("/tmp/ML_TCP_ALT")) { mode = ModeTCP; altBaud = TRUE; }
+ if (misc_check_file("/tmp/ML_USBMIDI")) mode = ModeUSBMIDI;
+ if (misc_check_file("/tmp/ML_USBSER")) mode = ModeUSBSER;
+ if (mode == ModeUSBMIDI) // no USB MIDI
{
misc_print(0, "MENU --> FSYNTH\n");
mode = ModeFSYNTH;
@@ -1372,42 +1429,56 @@ int main(int argc, char *argv[])
}
else
{
- if(misc_check_args_option(argc, argv, "MUNT")) mode = ModeMUNT;
- if(misc_check_args_option(argc, argv, "MUNTGM")) mode = ModeMUNTGM;
- if(misc_check_args_option(argc, argv, "FSYNTH")) mode = ModeFSYNTH;
- if(misc_check_args_option(argc, argv, "UDP")) {mode = ModeUDP; altBaud = FALSE;}
- if(misc_check_args_option(argc, argv, "TCP")) {mode = ModeTCP; altBaud = FALSE;}
- if(misc_check_args_option(argc, argv, "UDPALT")) {mode = ModeUDP; altBaud = TRUE; }
- if(misc_check_args_option(argc, argv, "TCPALT")) {mode = ModeTCP; altBaud = TRUE; }
- if(misc_check_args_option(argc, argv, "USBMIDI")) mode = ModeUSBMIDI;
+ if(misc_check_args_option(argc, argv, "MUNT")) mode = ModeMUNT;
+ if(misc_check_args_option(argc, argv, "MUNTGM")) mode = ModeMUNTGM;
+ if(misc_check_args_option(argc, argv, "FSYNTH")) mode = ModeFSYNTH;
+ if(misc_check_args_option(argc, argv, "UDP")) { mode = ModeUDP; altBaud = FALSE; }
+ if(misc_check_args_option(argc, argv, "TCP")) { mode = ModeTCP; altBaud = FALSE; }
+ if(misc_check_args_option(argc, argv, "UDPALT")) { mode = ModeUDP; altBaud = TRUE; }
+ if(misc_check_args_option(argc, argv, "TCPALT")) { mode = ModeTCP; altBaud = TRUE; }
+ if(misc_check_args_option(argc, argv, "USBMIDI")) mode = ModeUSBMIDI;
+ if(misc_check_args_option(argc, argv, "USBSER")) mode = ModeUSBSER;
+ if(misc_check_args_option(argc, argv, "UDPMUNT")) mode = ModeUDPMUNT;
+ if(misc_check_args_option(argc, argv, "UDPMUNTGM")) mode = ModeUDPMUNTGM;
+ if(misc_check_args_option(argc, argv, "UDPFSYNTH")) mode = ModeUDPFSYNTH;
}
killall_mpg123(0);
killall_aplaymidi(0);
killall_softsynth(3);
- if (mode == ModeMUNT || mode == ModeMUNTGM || mode == ModeFSYNTH)
+ if (mode == ModeMUNT || mode == ModeMUNTGM || mode == ModeFSYNTH ||
+ mode == ModeUDPMUNT || mode == ModeUDPMUNTGM || mode == ModeUDPFSYNTH)
{
+ /* Disable this so we can run UDPMUNT & UDPFSYNTH on RPi or other linux device.
if(!misc_check_device(MrAudioDevice)) // && misc_check_file("/etc/asound.conf"))
{
misc_print(0, "ERROR: You have no MrAudio device in kernel --> %s\n", MrAudioDevice);
close_fd();
return -1;
}
-
+ */
+
if (!misc_check_device(PCMDevice))
{
- //misc_print(0, "ERROR: You have no PCM device loading --> snd-dummy module\n");
- //system ("modprobe snd-dummy");
misc_print(0, "ERROR: You have no PCM device --> %s\n", PCMDevice);
close_fd();
return -2;
}
-
- if (mode == ModeMUNT || mode == ModeMUNTGM)
- midiPort = start_munt();
- else if (mode == ModeFSYNTH)
- midiPort = start_fsynth();
+
+ switch(mode)
+ {
+ case ModeMUNT:
+ case ModeMUNTGM:
+ case ModeUDPMUNT:
+ case ModeUDPMUNTGM:
+ midiPort = start_munt();
+ break;
+ case ModeFSYNTH:
+ case ModeUDPFSYNTH:
+ midiPort = start_fsynth();
+ break;
+ }
if (midiPort < 0)
{
@@ -1416,49 +1487,73 @@ int main(int argc, char *argv[])
return -3;
}
}
- fdSerial = open(serialDevice, O_RDWR | O_NOCTTY | O_SYNC);
- if (fdSerial < 0)
+
+ //these modes don't need serial port. all others do :)
+ if (mode != ModeUDPMUNT && mode != ModeUDPMUNTGM && mode != ModeUDPFSYNTH )
{
- misc_print(0, "ERROR: opening %s: %s\n", serialDevice, strerror(errno));
- close_fd();
- return -4;
- }
- serial_set_interface_attribs(fdSerial);
- if (altBaud && mode == ModeUDP && UDPBaudRate_alt != -1)
- {
- baudRate = UDPBaudRate_alt;
- }
- else if (mode == ModeUDP && UDPBaudRate != -1)
- {
- baudRate = UDPBaudRate;
- }
- else if (mode == ModeTCP)
- {
- if(altBaud && TCPBaudRate_alt != -1)
- baudRate = TCPBaudRate_alt;
- else if(TCPBaudRate != -1)
- baudRate = TCPBaudRate;
- else
- baudRate = 115200;
- }
- else
- {
- if(MIDIBaudRate != -1)
- baudRate = MIDIBaudRate;
+ fdSerial = open(serialDevice, O_RDWR | O_NOCTTY | O_SYNC);
+ if (fdSerial < 0)
+ {
+ misc_print(0, "ERROR: opening %s: %s\n", serialDevice, strerror(errno));
+ close_fd();
+ return -4;
+ }
+ serial_set_interface_attribs(fdSerial);
+
+ int result = misc_check_args_option(argc, argv, "BAUD");
+ if(result && (result + 1 < argc))
+ {
+ char * ptr;
+ baudRate = strtol(argv[result + 1], &ptr, 10);
+ if (!serial2_is_valid_rate (baudRate))
+ {
+ misc_print(0, "ERROR : BAUD not valid --> %s\n", argv[result + 1]);
+ return -5;
+ }
+ }
+ else if (altBaud && mode == ModeUDP && UDPBaudRate_alt != -1)
+ {
+ baudRate = UDPBaudRate_alt;
+ }
+ else if (mode == ModeUDP && UDPBaudRate != -1)
+ {
+ baudRate = UDPBaudRate;
+ }
+ else if (mode == ModeTCP)
+ {
+ if(altBaud && TCPBaudRate_alt != -1)
+ baudRate = TCPBaudRate_alt;
+ else if(TCPBaudRate != -1)
+ baudRate = TCPBaudRate;
+ else
+ baudRate = 115200;
+ }
+ else if (mode == ModeUSBSER)
+ {
+ if(USBSerBaudRate != -1)
+ baudRate = USBSerBaudRate;
+ else
+ baudRate = 115200;
+ }
else
{
- if (strcmp(coreName, "AO486") == 0)
- baudRate = 38400;
+ if(MIDIBaudRate != -1)
+ baudRate = MIDIBaudRate;
else
- baudRate = 31250;
+ {
+ if (strcmp(coreName, "AO486") == 0)
+ baudRate = 38400;
+ else
+ baudRate = 31250;
+ }
}
+
+ serial_set_flow_control(fdSerial, 0);
+ serial2_set_baud(serialDevice, fdSerial, baudRate);
+ serial_do_tcdrain(fdSerial);
+ serial2_set_DCD(serialDevice, fdSerial, (mode == ModeTCP)?FALSE:TRUE);
}
-
- serial_set_flow_control(fdSerial, 0);
- serial2_set_baud(serialDevice, fdSerial, baudRate);
- serial_do_tcdrain(fdSerial);
- serial2_set_DCD(fdSerial, (mode == ModeTCP)?FALSE:TRUE);
-
+
if (mode == ModeMUNT || mode == ModeMUNTGM || mode == ModeFSYNTH)
{
if(alsa_open_seq(midiPort, (mode == ModeMUNTGM)?1:0))
@@ -1467,6 +1562,7 @@ int main(int argc, char *argv[])
if(strlen(MT32LCDMsg) > 0)
write_alsa_packet(buf, misc_MT32_LCD(MT32LCDMsg, buf));
//This loop handles softSynth MUNT/FluidSynth
+ misc_print(0, "Starting --> local MIDI loop :)\n");
do
{
int rdLen = read(fdSerial, buf, sizeof(buf));
@@ -1481,7 +1577,7 @@ int main(int argc, char *argv[])
else
{
close_fd();
- return -4;
+ return -6;
}
close_fd();
return 0;
@@ -1489,6 +1585,40 @@ int main(int argc, char *argv[])
switch(mode)
{
+ case ModeUDPMUNT:
+ case ModeUDPMUNTGM:
+ case ModeUDPFSYNTH:
+ if(alsa_open_seq(midiPort, (mode == ModeUDPMUNTGM)?1:0))
+ {
+ show_line();
+ if(strlen(MT32LCDMsg) > 0)
+ write_alsa_packet(buf, misc_MT32_LCD(MT32LCDMsg, buf));
+ socket_in = udpsock_server_open(UDPServerPort);
+ if(socket_in > 0)
+ {
+ misc_print(0, "Socket Listener created on port %d.\n", UDPServerPort);
+ status = pthread_create(&socketInThread, NULL, udpsock_thread_function2, NULL);
+ if (status == -1)
+ {
+ misc_print(0, "ERROR: unable to create UDP socket input thread.\n");
+ close_fd();
+ return -8;
+ }
+ misc_print(0, "UDP Socket input thread(2) created.\n");
+ }
+ else
+ {
+ misc_print(0, "ERROR: unable to create UDP listener --> '%s'\n", strerror(errno));
+ close_fd();
+ return -9;
+ }
+ }
+ else
+ {
+ close_fd();
+ return -10;
+ }
+ break;
case ModeUDP:
{
if(UDPFlow > 0)
@@ -1505,34 +1635,34 @@ int main(int argc, char *argv[])
if(socket_in > 0)
{
misc_print(0, "Socket Listener created on port %d.\n", UDPServerPort);
- status = pthread_create(&socketInThread, NULL, udpsock_thread_function, NULL);
+ status = pthread_create(&socketInThread, NULL, udpsock_thread_function, NULL);
if (status == -1)
{
- misc_print(0, "ERROR: unable to create socket input thread.\n");
+ misc_print(0, "ERROR: unable to create UDP socket input thread.\n");
close_fd();
- return -6;
+ return -11;
}
- misc_print(0, "Socket input thread created.\n");
+ misc_print(0, "UDP Socket input thread(1) created.\n");
}
else
{
misc_print(0, "ERROR: unable to create UDP listener --> '%s'\n", strerror(errno));
close_fd();
- return -7;
+ return -12;
}
}
else
{
misc_print(0, "ERROR: unable to open UDP port --> '%s'\n", strerror(errno));
close_fd();
- return -8;
+ return -13;
}
}
else
{
misc_print(0, "ERROR: in INI File (UDP_SERVER) --> %s\n", midiLinkINI);
close_fd();
- return -9;
+ return -14;
}
}
break;
@@ -1540,7 +1670,7 @@ int main(int argc, char *argv[])
{
if(TCPFlow > 0)
serial_set_flow_control(fdSerial, TCPFlow);
- //serial2_set_DCD(fdSerial, FALSE);
+ //serial2_set_DCD(sericlDevice, fdSerial, FALSE);
serial_set_timeout(fdSerial, 1);
socket_lst = tcpsock_server_open(TCPServerPort);
if(socket_lst != -1)
@@ -1550,7 +1680,7 @@ int main(int argc, char *argv[])
{
misc_print(0, "ERROR: unable to create socket listener thread.\n");
close_fd();
- return -10;
+ return -15;
}
misc_print(0, "Socket listener thread created.\n");
}
@@ -1558,7 +1688,7 @@ int main(int argc, char *argv[])
{
misc_print(0, "ERROR: unable to create socket listener --> '%s'\n", strerror(errno));
close_fd();
- return -11;
+ return -16;
}
}
break;
@@ -1569,7 +1699,7 @@ int main(int argc, char *argv[])
{
misc_print(0, "ERROR: cannot open %s: %s\n", midiDevice, strerror(errno));
close_fd();
- return -12;
+ return -17;
}
if (misc_check_device(midiINDevice))
@@ -1579,7 +1709,7 @@ int main(int argc, char *argv[])
{
misc_print(0, "ERROR: cannot open %s: %s\n", midiINDevice, strerror(errno));
close_fd();
- return -13;
+ return -18;
}
}
@@ -1597,7 +1727,7 @@ int main(int argc, char *argv[])
{
misc_print(0, "ERROR: unable to create *MIDI input thread.\n");
close_fd();
- return -14;
+ return -19;
}
misc_print(0, "MIDI1 input thread created.\n");
misc_print(0, "CONNECT : %s --> %s & %s\n", midiINDevice, serialDevice, midiDevice);
@@ -1608,12 +1738,56 @@ int main(int argc, char *argv[])
{
misc_print(0, "ERROR: unable to create MIDI input thread.\n");
close_fd();
- return -14;
+ return -20;
}
misc_print(0, "MIDI input thread created.\n");
misc_print(0, "CONNECT : %s <--> %s\n", serialDevice, midiDevice);
}
break;
+ case ModeUSBSER:
+ {
+ if (!misc_check_device(serialDeviceUSB))
+ {
+ if(strlen(USBSerModule) > 0)
+ {
+ misc_print(0, "WARNING: You have no '%s' device - loading --> %s\n", serialDeviceUSB, USBSerModule);
+ sprintf(buf, "insmod %s", USBSerModule);
+ }
+ else
+ {
+ misc_print(0, "ERROR: You have no '%s' device! --> maybe set 'USB_SERIAL_MODULE = ' in '%s'?\n", serialDeviceUSB, midiLinkINI);
+ close_fd();
+ return -21;
+ }
+ system(buf);
+ }
+
+ fdSerialUSB = open(serialDeviceUSB, O_RDWR);
+ if (fdSerialUSB < 0)
+ {
+ misc_print(0, "ERROR: cannot open %s: %s\n", serialDeviceUSB, strerror(errno));
+ close_fd();
+ return -22;
+ }
+
+ serial_set_flow_control(fdSerial, 3); //RTS/CTS
+ serial_set_flow_control(fdSerialUSB, 3);
+ serial_set_interface_attribs(fdSerialUSB);
+ serial2_set_baud(serialDeviceUSB, fdSerialUSB, baudRate);
+ serial_do_tcdrain(fdSerialUSB);
+ serial2_set_DCD(serialDeviceUSB, fdSerialUSB, TRUE);
+
+ status = pthread_create(&serialInThread, NULL, serial_thread_function, NULL);
+ if (status == -1)
+ {
+ misc_print(0, "ERROR: unable to create serial input thread.\n");
+ close_fd();
+ return -23;
+ }
+ misc_print(0, "MIDI input thread created.\n");
+ misc_print(0, "CONNECT : %s <--> %s\n", serialDevice, serialDeviceUSB);
+ }
+ break;
}
show_line();
@@ -1629,13 +1803,38 @@ int main(int argc, char *argv[])
write_midi_packet(buf, misc_MT32_LCD(MT32LCDMsg, buf));
}
//This main loop handles USB MIDI
+ misc_print(0, "Starting --> USB MIDI loop :)\n");
do
{
int rdLen = read(fdSerial, buf, sizeof(buf));
if (rdLen > 0)
write_midi_packet(buf, rdLen);
else if (rdLen < 0)
- misc_print(1, "ERROR: (USB) from read: %d: %s\n", rdLen, strerror(errno));
+ misc_print(1, "ERROR: (USBMIDI) from read: %d: %s\n", rdLen, strerror(errno));
+ } while (TRUE);
+ break;
+ case ModeUSBSER:
+ //This main loop handles USB serial
+ misc_print(0, "Starting --> USB Serial loop :)\n");
+ do
+ {
+ int rdLen = read(fdSerial, buf, sizeof(buf));
+ if (rdLen > 0)
+ {
+ show_debug_buf("SERIAL OUT ", buf, rdLen);
+ write(fdSerialUSB, buf, rdLen);
+ }
+ else if (rdLen < 0)
+ misc_print(1, "ERROR: (USBSER) from read: %d: %s\n", rdLen, strerror(errno));
+ } while (TRUE);
+ break;
+ case ModeUDPMUNT:
+ case ModeUDPMUNTGM:
+ case ModeUDPFSYNTH:
+ misc_print(0, "Starting --> UDP Synth loop :)\n");
+ do
+ {
+ sleep(1);
} while (TRUE);
break;
case ModeUDP:
@@ -1651,6 +1850,7 @@ int main(int argc, char *argv[])
}
}
//This main loop handles UDP
+ misc_print(0, "Starting --> UDP loop :)\n");
do
{
int rdLen = read(fdSerial, buf, sizeof(buf));
@@ -1665,6 +1865,7 @@ int main(int argc, char *argv[])
break;
case ModeTCP :
//This main loop handles TCP
+ misc_print(0, "Starting --> TCP loop :)\n");
do
{
int rdLen = read(fdSerial, buf, sizeof(buf));
diff --git a/midilink b/midilink
index 7542eac..aad37f6 100755
Binary files a/midilink and b/midilink differ
diff --git a/misc.c b/misc.c
index c517554..601c8b9 100644
--- a/misc.c
+++ b/misc.c
@@ -26,7 +26,9 @@
//
//
static char pauseStr[] = "[PAUSE]";
-static char pauseDel[sizeof(pauseStr)];
+static char pauseDel[sizeof(pauseStr)] = "";
+static char pauseSpc[sizeof(pauseStr)] = "";
+
static pthread_mutex_t print_lock;
static pthread_mutex_t swrite_lock;
extern int MIDI_DEBUG;
@@ -215,11 +217,11 @@ int misc_check_args_option (int argc, char *argv[], char * option)
if(argc > 1)
for (int i = 1; i< argc; i++)
{
- char * arg = strdup(argv[i]);
- misc_str_to_upper(arg);
- if (strcmp(arg, option) == 0)
- result = TRUE;
- free(arg);
+ if (strcasecmp(argv[i], option) == 0)
+ {
+ result = i;
+ break;
+ }
}
free(OPTION);
return result;
@@ -399,7 +401,6 @@ long misc_get_timeval_diff(struct timeval * start, struct timeval * stop)
return ((secs) * 1000 + usecs/1000.0);
}
-
///////////////////////////////////////////////////////////////////////////////////////
//
// int misc_check_module_loaded (char * modName)
@@ -611,6 +612,23 @@ void misc_d_type_to_str(unsigned char type, char * buf)
}
}
+///////////////////////////////////////////////////////////////////////////////////////
+//
+//char * misc_get_clrScr()
+//
+char * misc_get_clrScr()
+{
+ switch(TCPAsciiTrans)
+ {
+ case AsciiToPetskii:
+ return "\x93";
+ break;
+ default:
+ return "\e[2J\e[H";
+ break;
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////////////
//
// int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int * DIR)
@@ -628,12 +646,12 @@ int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int *
unsigned char c;
char prompt[10] = "";
char strRows[10] = "";
- char clrScr[] = "\e[2J\e[H";
char promptEnd[] = "END #? --> ";
char promptMore[] = "MORE #? --> ";
char strType[4] = "";
int result = FALSE;
+
fileName[0] = (char) 0x00;
sprintf(strRows, "%d", rows);
char * path2 = malloc(strlen(path) + 3);
@@ -646,7 +664,7 @@ int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int *
}
else
{
- misc_swrite(fdSerial, clrScr);
+ misc_swrite(fdSerial, misc_get_clrScr());
while (index < max)
{
if(strlen(namelist[index]->d_name) > 0 &&
@@ -733,11 +751,11 @@ int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int *
else
page++;
count = 0;
- misc_swrite(fdSerial, clrScr);
+ misc_swrite(fdSerial, misc_get_clrScr());
if (c == 'Q')
break;
//else if(index < max) //no clear on exit
- // misc_swrite(fdSerial, clrScr);
+ // misc_swrite(fdSerial, misc_get_clrScr());
}
}
for(index = 0; index < max; index++)
@@ -784,19 +802,40 @@ int misc_MT32_LCD(char * MT32Message, char * buf)
///////////////////////////////////////////////////////////////////////////////////////
//
-// void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c, int CR)
+// void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c)
//
-void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c, int CR)
+void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c)
{
(*rowcount)++;
if (*rowcount == rows)
{
- if (CR)
- misc_swrite(fdSerial, "\r\n");
+ if(pauseSpc[0] != ' ')
+ {
+ memset(pauseSpc, ' ', strlen(pauseStr));
+ pauseSpc[sizeof(pauseSpc)-1] = 0x00;
+ }
+ misc_swrite(fdSerial, "\r\n");
misc_swrite(fdSerial, pauseStr);
- while (read(fdSerial, &c, 1) == 0) {};
- if(pauseDel[0] != 0x08)
- memset(pauseDel, 0x08, sizeof(pauseDel));
+ while (read(fdSerial, c, 1) == 0) {};
+ switch(TCPAsciiTrans)
+ {
+ case AsciiToPetskii:
+ if(pauseDel[0] != 0x14)
+ {
+ memset(pauseDel, 0x14, strlen(pauseStr)); //C64
+ pauseDel[sizeof(pauseDel)-1] = 0x00;
+ }
+ break;
+ default:
+ if(pauseDel[0] != 0x08)
+ {
+ memset(pauseDel, 0x08, strlen(pauseStr));
+ pauseDel[sizeof(pauseDel)-1] = 0x00;
+ }
+ break;
+ }
+ misc_swrite(fdSerial, pauseDel);
+ misc_swrite(fdSerial, pauseSpc);
misc_swrite(fdSerial, pauseDel);
*rowcount = 0;
*c = toupper(*c);
@@ -820,7 +859,7 @@ void misc_show_at_commands(int fdSerial, int rows)
misc_swrite(fdSerial, "\n");
misc_swrite(fdSerial, athelp[index]);
index++;
- misc_do_rowcheck(fdSerial, rows, &rowcount, &c, TRUE);
+ misc_do_rowcheck(fdSerial, rows, &rowcount, &c);
}
}
@@ -830,19 +869,25 @@ void misc_show_at_commands(int fdSerial, int rows)
//
int misc_file_to_serial(int fdSerial, char * fileName, int rows)
{
- char str[1014];
+ char str[1024];
FILE * file;
+ int index = 0;
int rowcount = 0;
char c = (char) 0x00;
file = fopen(fileName, "r");
if (file)
{
- misc_swrite(fdSerial, "\r\n");
- while (fgets(str, sizeof(str), file)!= NULL)
+ //misc_swrite(fdSerial, "\r\n");
+ while (fgets(str, sizeof(str), file) != NULL && c != 'Q')
{
- misc_swrite(fdSerial, str);
misc_swrite(fdSerial, "\r");
- misc_do_rowcheck(fdSerial, rows, &rowcount, &c, FALSE);
+ if(rowcount != 0 || index == 0)
+ misc_swrite(fdSerial, "\n");
+ misc_replace_char(str, strlen(str), '\n', 0x00);
+ misc_replace_char(str, strlen(str), '\r', 0x00);
+ misc_swrite(fdSerial, str);
+ index++;
+ misc_do_rowcheck(fdSerial, rows, &rowcount, &c);
}
fclose(file);
return TRUE;
@@ -895,49 +940,56 @@ int misc_get_core_name(char * buf, int maxBuf)
///////////////////////////////////////////////////////////////////////////////////////
//
-// char * misc_hayes_flow_to_str(int flow)
+// char * misc_hayes_flow_to_str(int flow)
//
char * misc_hayes_flow_to_str(int flow)
{
switch(flow)
{
- case 0: return "Diasble Flow-control";
- case 3: return "RTS/CTS";
- case 4: return "XON/XOFF";
- default:
- return "UNKNOWN";
+ case 0:
+ return "Diasble Flow-control";
+ case 3:
+ return "RTS/CTS";
+ case 4:
+ return "XON/XOFF";
+ default:
+ return "UNKNOWN";
}
-
+
}
///////////////////////////////////////////////////////////////////////////////////////
//
-// char * misc_hayes_DTR_to_str(int dtr)
+// char * misc_hayes_DTR_to_str(int dtr)
//
char * misc_hayes_DTR_to_str(int dtr)
{
switch(dtr)
{
- case 1: return "Normal";
- case 2: return "Hangup";
- default:
- return "UNKNOWN";
+ case 1:
+ return "Normal";
+ case 2:
+ return "Hangup";
+ default:
+ return "UNKNOWN";
}
-
+
}
///////////////////////////////////////////////////////////////////////////////////////
//
-// char * misc_hayes_ATQ_to_str(int dtr)
+// char * misc_hayes_ATQ_to_str(int dtr)
//
char * misc_hayes_ATQ_to_str(int dtr)
{
switch(dtr)
{
- case 0: return "Normal";
- case 1: return "Quite - no result codes";
- default:
- return "UNKNOWN";
+ case 0:
+ return "Normal";
+ case 1:
+ return "Quite - no result codes";
+ default:
+ return "UNKNOWN";
}
-
+
}
diff --git a/misc.h b/misc.h
index 1b7be68..3f27750 100644
--- a/misc.h
+++ b/misc.h
@@ -27,7 +27,7 @@ int misc_file_to_serial(int fdSerial, char * fileName, int rows);
int misc_count_str_chr(char * str, char chr);
int misc_MT32_LCD(char * MT32Message, char * buf);
void misc_show_at_commands(int fdSerial, int rows);
-void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c, int CR);
+void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c);
int misc_get_core_name(char * buf, int maxBuf);
char misc_replace_char(char * str, int strLen, char old, char new);
int misc_do_pipe(int fdSerial, char * path, char * command,
@@ -39,5 +39,7 @@ int misc_do_pipe(int fdSerial, char * path, char * command,
char * misc_hayes_flow_to_str(int flow);
char * misc_hayes_DTR_to_str(int dtr);
char * misc_hayes_ATQ_to_str(int dtr);
+char * misc_get_clrScr();
+
#define TRUE 1
#define FALSE 0
diff --git a/mlinkutil b/mlinkutil
index f5d22eb..244e02f 100755
Binary files a/mlinkutil and b/mlinkutil differ
diff --git a/mlinkutil.c b/mlinkutil.c
index ea2fc68..acb4a94 100644
--- a/mlinkutil.c
+++ b/mlinkutil.c
@@ -47,6 +47,17 @@ int main(int argc, char *argv[])
}
serial2_set_baud(serialDevice, fdSerial, baud);
close(fdSerial);
+ if(misc_check_device(serialDeviceUSB))// && misc_check_file("/tmp/ML_USBSER"))
+ {
+ fdSerial = open(serialDeviceUSB, O_RDWR | O_NOCTTY | O_SYNC);
+ if (fdSerial < 0)
+ {
+ misc_print(0, "ERROR: opening %s: %s\n", serialDeviceUSB, strerror(errno));
+ return -3;
+ }
+ serial2_set_baud(serialDeviceUSB, fdSerial, baud);
+ close(fdSerial);
+ }
bShowInfo = FALSE;
}
@@ -95,14 +106,14 @@ int main(int argc, char *argv[])
else
{
printf("ERROR --> unable to connect to FluidSynth:9800\n");
- return -4;
+ return -11;
}
bShowInfo = FALSE;
}
else
{
printf("ERROR --> unable to open file '%s'\n", argv[result+1]);
- return -3;
+ return -10;
}
}
if (bShowInfo)
diff --git a/serial2.c b/serial2.c
index a2f94d2..a93c58f 100644
--- a/serial2.c
+++ b/serial2.c
@@ -138,12 +138,12 @@ int serial2_set_DTR(int fdSerial, int on)
///////////////////////////////////////////////////////////////////////////////////////
//
-// int serial2_set_DCD(int fdSerial, int on)
+// int serial2_set_DCD(char * serialDevice, int fdSerial, int on)
//
-int serial2_set_DCD(int fdSerial, int on)
+int serial2_set_DCD(char * serialDevice, int fdSerial, int on)
{
int result;
result = serial2_set_DTR(fdSerial, on);
- misc_print(1, "Setting DCD --> %s\n",on?"TRUE":"FALSE");
+ misc_print(1, "Setting DCD (%s) --> %s\n", serialDevice, on?"TRUE":"FALSE");
return result;
}
diff --git a/serial2.h b/serial2.h
index 8bfc14a..785ba74 100644
--- a/serial2.h
+++ b/serial2.h
@@ -6,5 +6,5 @@ int serial2_baud_at_index(int index);
int serial2_indexof(int baud);
int serial2_set_DTR(int fd, int on);
int serial2_get_DSR(int fd);
-int serial2_set_DCD(int fd, int on);
+int serial2_set_DCD(char * serialDevice, int fd, int on);