14

I have implemented a program to receive call using gsm modem. Upon Detecting "RING" call is answered an audio clip is played by calling a function from inside DATA_AVAILABLE EVENT HANDLER. But the event handler stops working after this. After the audio is complete Event Handler does not show any data received event anymore.

Why does the event listener stops working. Am I doing it wrong by playing the audio from inside the event handler? I was thinking about setting a variable true or false from inside data_received event handler and create custom event handler to listen to change to that variable to do playback of audio can these both work simultaneously in anyway?

How to create a multi threading solution So that Serial I/O is not interrupted and Audio Playback and Audio Sampling Can be done in a synchronised manner to detect dtmf tones. Is there any way that serial port events can be listened to constantly without interruption and run a function for audio sampling and audio playback at specific time

Call Accepted in this case of switch and thread is started inside play() function

 case SerialPortEvent.DATA_AVAILABLE:

       StringBuffer sb = new StringBuffer();
       byte[] readBuffer = new byte[2048];
       try {
         while (inputStream.available() > 0) 
         {
           int numBytes = inputStream.read(readBuffer);
           sb.append(new String(readBuffer,0,numBytes));
           System.out.println(numBytes);
           System.out.println(sb);
         }
         System.out.println("Data Available");   

         if((sb.toString()).contains("RING")){
            System.out.println("Enter Inside if RING Loop");   
            //play();
            send("ATA\r\n");

            //welcomeMessage();
         }

         if((sb.toString()).contains("CARRIER")){

                  hangup();
                  //Thread.sleep(1000);
                  closePort();
                  outCommand();
                  System.out.println("Enter Inside if NO CARRIER Loop");   
         }
         //print response message
         System.out.print(sb.toString());
       } catch (IOException  e) {
       }

       break;

 public void play() {
        try {
            new Thread() {
                public void run() {
                    for(int i=0;i<1;i++)
                       welcomeMessage();
                }
            }.start();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

Full Code

package sample;

import java.io.*;
import java.util.*;
import javax.sound.sampled.*;
import javazoom.jl.player.*;
import java.io.FileInputStream;
import gnu.io.*;
import java.io.*;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import org.apache.log4j.chainsaw.Main;
import sun.audio.*;

public class GSMConnect implements SerialPortEventListener, 
 CommPortOwnershipListener {

 private static String comPort = "COM3"; // This COM Port must be connect with GSM Modem or your mobile phone
 private String messageString = "";
 private CommPortIdentifier portId = null;
 private Enumeration portList;
 private InputStream inputStream = null;
 private OutputStream outputStream = null;
 private SerialPort serialPort;
 String readBufferTrial = "";
 /** Creates a new instance of GSMConnect */
 public GSMConnect(String comm) {

   this.comPort = comm;

 }

 public boolean init() {
   portList = CommPortIdentifier.getPortIdentifiers();
   while (portList.hasMoreElements()) {
     portId = (CommPortIdentifier) portList.nextElement();
     if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
       if (portId.getName().equals(comPort)) {
           System.out.println("Got PortName");
         return true;
       }
     }
   }
   return false;
 }

 public void checkStatus() {
   send("AT+CREG?\r\n");
 }

 public void dial(String phoneNumber) {
   try {
//dial to this phone number

     messageString = "ATD" + phoneNumber + ";\r\n";
     outputStream.write(messageString.getBytes());
     System.out.println("Called ");
   } catch (IOException e) {
     e.printStackTrace();
   }
 }

 public void send(String cmd) {
   try {
     outputStream.write(cmd.getBytes());
   } catch (IOException e) {
     e.printStackTrace();
   }
 }

 public void sendMessage(String phoneNumber, String message) {
       char quotes ='"';
   send("AT+CMGS="+quotes + phoneNumber +quotes+ "\r\n");
   try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
    //   send("AT+CMGS=\""+ phoneNumber +"\"\r\n");
   send(message + '\032');
   System.out.println("Message Sent");
 }

 public void hangup() {
   send("ATH\r\n");
 }
 public void welcomeMessage(){

     // open the sound file as a Java input stream
        String gongFile = "C:\\Users\\XXXX\\Desktop\\1-welcome.wav";

        }*/
        try{

            FileInputStream fis = new FileInputStream("C:\\Users\\XXXX\\Desktop\\7001110.mp3");
            Player playMP3 = new Player(fis);

            playMP3.play();
            System.out.print("welcomeMessage() Read");
            }catch(Exception e){

                System.out.println(e);

            }
 }

 public void play() {
        try {
            new Thread() {
                public void run() {
                    for(int i=0;i<1;i++)
                       welcomeMessage();
                }
            }.start();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
 public void connect() throws NullPointerException {
   if (portId != null) {
     try {
       portId.addPortOwnershipListener(this);

       serialPort = (SerialPort) portId.open("MobileGateWay", 2000);
       serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
     } catch (PortInUseException | UnsupportedCommOperationException e) {
       e.printStackTrace();
     }

     try {
       inputStream = serialPort.getInputStream();
       outputStream = serialPort.getOutputStream();

     } catch (IOException e) {
       e.printStackTrace();
     }

     try {
       /** These are the events we want to know about*/
       serialPort.addEventListener(this);
       serialPort.notifyOnDataAvailable(true);
       serialPort.notifyOnRingIndicator(true);

     } catch (TooManyListenersException e) {
       e.printStackTrace();
     }

//Register to home network of sim card

     send("ATZ\r\n");

   } else {
     throw new NullPointerException("COM Port not found!!");
   }
 }

 public void serialEvent(SerialPortEvent serialPortEvent) {
    System.out.println("serialPortEvent.getEventType()"+serialPortEvent.getEventType()); 
   switch (serialPortEvent.getEventType()) {
     case SerialPortEvent.BI:
     case SerialPortEvent.OE:
     case SerialPortEvent.FE:
     case SerialPortEvent.PE:
     case SerialPortEvent.CD:
     case SerialPortEvent.CTS:
     case SerialPortEvent.DSR:
     case SerialPortEvent.RI:
        // System.out.println("Ringing");
          if( serialPortEvent.getNewValue() ) 
          {
              System.out.println("Ring Indicator On");
          }
          else 
          {
              System.out.println("Ring Indicator Off");
          }

          break;



     case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
     case SerialPortEvent.DATA_AVAILABLE:

       StringBuffer sb = new StringBuffer();
       byte[] readBuffer = new byte[2048];
       try {
         while (inputStream.available() > 0) 
         {
           int numBytes = inputStream.read(readBuffer);
           sb.append(new String(readBuffer,0,numBytes));
           System.out.println(numBytes);
           System.out.println(sb);
         }
         System.out.println("Data Available");   

         if((sb.toString()).contains("RING")){
            System.out.println("Enter Inside if RING Loop");   
            //play();
            send("ATA\r\n");

            //welcomeMessage();
         }

         if((sb.toString()).contains("CARRIER")){

                  hangup();
                  //Thread.sleep(1000);
                  closePort();
                  outCommand();
                  System.out.println("Enter Inside if NO CARRIER Loop");   
         }
         //print response message
         System.out.print(sb.toString());
       } catch (IOException  e) {
       }

       break;
   }
 }

 public void outCommand(){
     System.out.print(readBufferTrial);
 }
 public void ownershipChange(int type) {
   switch (type) {
     case CommPortOwnershipListener.PORT_UNOWNED:
       System.out.println(portId.getName() + ": PORT_UNOWNED");
       break;
     case CommPortOwnershipListener.PORT_OWNED:
       System.out.println(portId.getName() + ": PORT_OWNED");
       break;
     case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED:
       System.out.println(portId.getName() + ": PORT_INUSED");
       break;
   }
 }
 public void closePort(){

    serialPort.close(); 
 }

 public static void main(String args[]) {
   GSMConnect gsm = new GSMConnect(comPort);
   if (gsm.init()) {
     try {
         System.out.println("Initialization Success");
       gsm.connect();
       Thread.sleep(5000);
       gsm.checkStatus();
       Thread.sleep(5000);
   //   System.out.println("Before Auto Answer");
     //  gsm.send("ATS0=5");
    //   gsm.dial("87XXXXXSS");
   //    Thread.sleep(7500);
     //  System.out.println("After Auto Answer set");

    //   gsm.sendMessage("8XXXXXS56", "Trial Success Call me");
    //   gsm.sendMessage("80XXXXS56", "Trial Success Call me");
    //   gsm.sendMessage("8XXXXSXS6", "Trial Success Call me");
    //   Thread.sleep(5000);
     //   gsm.sendMessage("+919XXXXXXS3", "Third Msg");
     //  Thread.sleep(1000);
     //  gsm.dial("9XXXXS773");
    //   gsm.dial("871XXXXS5");
     //  Thread.sleep(1000);
     //  gsm.welcomeMessage();
    //   Thread.sleep(1000);
     //  gsm.welcomeMessage();// for turning on Echo ATE1&W

     //  Thread.sleep(20000);
      // welcomeMessage();

     //  gsm.hangup();
     //  Thread.sleep(1000);
     //  gsm.closePort();
     //  gsm.outCommand();
      // System.exit(1);

     } catch (Exception e) {
       e.printStackTrace();
     }
   } else {
     System.out.println("Can't init this card");
   }
 }
}
Cœur
  • 37,241
  • 25
  • 195
  • 267
codefreaK
  • 3,584
  • 5
  • 34
  • 65

1 Answers1

0

Short of spending a good amount of time reproducing your environment I can give you two suggestions on how you might look into this.

a) Place a try-catch Throwable around your entire handler--often throwing exceptions can break event dispatchers

B) print out a debug statement when you enter and exit your event handler and ensure they are paired and that you get an exit after your last enter--a thread locking up will sometimes stop future events from being dispatched.

By the way you have an empty catch statement in one place--those scare the crap out of me because they often mask problems in ways that can waste days of your time. If you absolutely know you want to silently eat an exception there and you expect that exception to occur enough that it would pollute your logs to log it, please put a comment saying so.

Bill K
  • 62,186
  • 18
  • 105
  • 157
  • I have done that bro but once the thread finishes that is audio file is played back it completes execution and executes the below println but after this no new event is detected.About the last empty exception part i wil check into that bro.So other than hidden exceptions nothing affects event listner right ? – codefreaK Sep 01 '15 at 20:46
  • Could you simplify the code to a few lines that fail? Just copy everything then start hacking stuff out until you get a dozen or so lines of code that fails. Also you might try the play without spawning a new thread... I believe play just queues a sound and returns to you, so starting a new thread doesn't help (and might be confusing the issue)--but I could be wrong about that. – Bill K Sep 01 '15 at 21:11
  • Initially What I did was to simply call the welcomeAudio() function inside if condition in the event case .Due to my limited understanding of multithreading I thought since a function executes the event handler was stopped somehow while audio file is played back and Bill I have given the area where the call for audio playback issued and the full source so anyone with gsm modem could test my code if they intend to do s – codefreaK Sep 02 '15 at 09:12