code: def dial(self, number, timeout=5, callStatusUpdateCallbackFunc=None):
          
          if self._waitForCallInitUpdate:
              # Wait for the "call originated" notification message
              self._dialEvent = threading.Event()
              try:
                  self.write('ATD{0};'.format(number), timeout=timeout, waitForResponse=self._waitForAtdResponse)
              except Exception:
                  self._dialEvent = None # Cancel the thread sync lock
                  raise
          else:
              # Don't wait for a call init update - base the call ID on the number of active calls
              self.write('ATD{0};'.format(number), timeout=timeout, waitForResponse=self._waitForAtdResponse)
              self.log.debug("Not waiting for outgoing call init update message")
              callId = len(self.activeCalls) + 1
              callType = 0 # Assume voice
              call = Call(self, callId, callType, number, callStatusUpdateCallbackFunc)
              self.activeCalls[callId] = call
              return call
  
          if self._mustPollCallStatus:
              # Fake a call notification by polling call status until the status indicates that the call is being dialed
              threading.Thread(target=self._pollCallStatus, kwargs={'expectedState': 0, 'timeout': timeout}).start()
  
          if self._dialEvent.wait(timeout):
              self._dialEvent = None
              callId, callType = self._dialResponse
              call = Call(self, callId, callType, number, callStatusUpdateCallbackFunc)
              self.activeCalls[callId] = call
              return call
          else: # Call establishing timed out
              self._dialEvent = None
              raise TimeoutException()
docs: Calls the specified phone number using a voice phone call
  
          :param number: The phone number to dial
          :param timeout: Maximum time to wait for the call to be established
          :param callStatusUpdateCallbackFunc: Callback function that is executed if the call's status changes due to
                 remote events (i.e. when it is answered, the call is ended by the remote party)
  
          :return: The outgoing call
          :rtype: gsmmodem.modem.Call