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