Merge pull request #9 from bbond007/master

Update
This commit is contained in:
Alexey Melnikov
2020-05-31 17:54:19 +08:00
committed by GitHub
15 changed files with 519 additions and 197 deletions

Binary file not shown.

View File

@@ -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"

Binary file not shown.

View File

@@ -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

View File

@@ -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.

View File

@@ -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";

22
ini.c
View File

@@ -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");

441
main.c
View File

@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libgen.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
@@ -43,11 +44,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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));

BIN
midilink

Binary file not shown.

138
misc.c
View File

@@ -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";
}
}

4
misc.h
View File

@@ -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

BIN
mlinkutil

Binary file not shown.

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);