dc550_phonesm_active.c

来自「一款经典的数字电话设计资料」· C语言 代码 · 共 1,542 行 · 第 1/5 页

C
1,542
字号
        if(phonesm_active_pendingonhook) {
          if(phonesm_active_pendingdevice == PHONESM_SPEAKINGDEVICE_HANDSET)
            phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
        }
        break;
    }
  }
  
  // This checks if the hookswitch went up
  else {
    switch (phonesm_infoaudio_speakingdevice) {
      case PHONESM_SPEAKINGDEVICE_NONE:
        if(phonesm_active_pendingonhook) {
          // Switches to the handset regardless of any other pending speaking
          // device
          phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_HANDSET;
        }
        else {
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
          phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
          modemcontroller_send_modemmessage(MDC_CPE_HOOKSTATE_UP);
          phonesm_infoaudio_set_speakingdevice(PHONESM_SPEAKINGDEVICE_HANDSET);
        }
        break;

      case PHONESM_SPEAKINGDEVICE_ALERTER:
        if(phonesm_active_pendingonhook) {
          // Switches to the handset regardless of any other pending speaking
          // device
          phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_HANDSET;
        }
        else {
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
          phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
          modemcontroller_send_modemmessage(MDC_CPE_HOOKSTATE_UP);
          phonesm_infoaudio_set_speakingdevice(PHONESM_SPEAKINGDEVICE_HANDSET);
          switch(phonesm_infoonetouch_getledstate()) {
            case LED_STATE_OFF:
              leddriver_setstate(LED_INDICATOR_VOICEMAIL, LED_STATE_OFF);
              break;
            case LED_STATE_WINK:
            case LED_STATE_FLASH:
            case LED_STATE_ON:
              leddriver_setstate(LED_INDICATOR_VOICEMAIL, LED_STATE_WINK);
              break;
          }
          audio_ringer(FALSE);
        }
        break;
      case PHONESM_SPEAKINGDEVICE_HEADSET:
        if( phonesm_active_pendingoffhook &&
            (phonesm_active_pendingdevice != PHONESM_SPEAKINGDEVICE_NONE) )
          phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
        phonesm_infoaudio_set_speakingdevice(PHONESM_SPEAKINGDEVICE_HANDSET);
        leddriver_setstate(LED_INDICATOR_HEADSET, LED_STATE_OFF);
        if(phonesm_active_handsetactivated) {
          if(phonesm_infoaudio_muteon) {
            audio_mute(FALSE);
            phonesm_infoaudio_muteon = FALSE;
            leddriver_setstate(LED_INDICATOR_MUTE, LED_STATE_OFF);
          }
          audio_select(AUDIO_HANDSET);
        }
        break;
      case PHONESM_SPEAKINGDEVICE_SPEAKERPHONE:
        if( phonesm_active_pendingoffhook &&
            (phonesm_active_pendingdevice != PHONESM_SPEAKINGDEVICE_NONE) )
          phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
        phonesm_infoaudio_set_speakingdevice(PHONESM_SPEAKINGDEVICE_HANDSET);
        leddriver_setstate(LED_INDICATOR_SPEAKERPHONE, LED_STATE_OFF);
        if(phonesm_active_handsetactivated) {
          if(phonesm_infoaudio_muteon) {
            audio_mute(FALSE);
            phonesm_infoaudio_muteon = FALSE;
            leddriver_setstate(LED_INDICATOR_MUTE, LED_STATE_OFF);
          }
          audio_select(AUDIO_HANDSET);
        }
        break;
      case PHONESM_SPEAKINGDEVICE_HANDSET:
        // This should happen only when the DMS switch is too slow
        if(phonesm_active_pendingoffhook) {
          if(phonesm_active_pendingdevice == PHONESM_SPEAKINGDEVICE_HANDSET)
            phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
        }
        break;
    }
  }
  return 0;
}


/******************************************************************************
 *  FUNCTION: BOOL phonesm_active_exec_keypress(unsigned int key, BOOL updown)
 ******************************************************************************
 *  DESCRIPTION:
 *  This function is called whenever a key goes up or down while the phone
 *  is in the Active State.  This function returns 1 if the keypress causes a
 *  Phone SM state change and 0 otherwise.
 *****************************************************************************/
BOOL phonesm_active_exec_keypress(unsigned int key, BOOL updown) {
  // Currently the Idle State will only respond to key down messages
  if(updown == KEYSTATE_DOWN) {
    switch(key) {
    
      /***** Dialpad Digits **************************************************/
      case KEYPAD_DIGIT_0:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_0);
          phonesm_active_display_echochar('0');
          phonesm_active_storenumber_append('0');
        }
        return 0;
      case KEYPAD_DIGIT_1:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_1);
          phonesm_active_display_echochar('1');
          phonesm_active_storenumber_append('1');
        }
        return 0;
      case KEYPAD_DIGIT_2:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_2);
          phonesm_active_display_echochar('2');
          phonesm_active_storenumber_append('2');
        }
        return 0;
      case KEYPAD_DIGIT_3:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_3);
          phonesm_active_display_echochar('3');
          phonesm_active_storenumber_append('3');
        }
        return 0;
      case KEYPAD_DIGIT_4:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_4);
          phonesm_active_display_echochar('4');
          phonesm_active_storenumber_append('4');
       }
        return 0;
      case KEYPAD_DIGIT_5:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_5);
          phonesm_active_display_echochar('5');
          phonesm_active_storenumber_append('5');
        }
        return 0;
      case KEYPAD_DIGIT_6:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_6);
          phonesm_active_display_echochar('6');
          phonesm_active_storenumber_append('6');
        }
        return 0;
      case KEYPAD_DIGIT_7:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_7);
          phonesm_active_display_echochar('7');
          phonesm_active_storenumber_append('7');
        }
        return 0;
      case KEYPAD_DIGIT_8:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_8);
          phonesm_active_display_echochar('8');
          phonesm_active_storenumber_append('8');
        }
        return 0;
      case KEYPAD_DIGIT_9:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_9);
          phonesm_active_display_echochar('9');
          phonesm_active_storenumber_append('9');
        }
        return 0;
      case KEYPAD_DIGIT_STAR:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_STAR);
          phonesm_active_display_echochar('*');
          phonesm_active_storenumber_append('*');
        }
        return 0;
      case KEYPAD_DIGIT_POUND:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          modemcontroller_send_modemmessage(MDC_CPE_DIGIT_POUND);
          phonesm_active_display_echochar('#');
          phonesm_active_storenumber_append('#');
        }
        return 0;

      /***** Pause Key *******************************************************/
      case KEYPAD_LOCAL_PAUSE:
        if(phonesm_infoaudio_speakingdevice!=PHONESM_SPEAKINGDEVICE_ALERTER) {
          phonesm_active_display_echochar('P');
          phonesm_active_storenumber_append('P');
        }
        return 0;

      /***** Scroll Keys *****************************************************/
      // The Scroll Keys activate the Contrast State
      case KEYPAD_SCROLL_UP:
      case KEYPAD_SCROLL_DOWN:
        phonesm_activate_state(PHONESM_STATE_CONTRAST);
        return 1;
        
      /***** Store # Key *****************************************************/
      case KEYPAD_LOCAL_STORENUM:
        if(phonesm_active_storenextdigit)
          phonesm_infonumbers_setstorenumber(phonesm_active_storenumber);
        return 0;

      /***** Feature Keys ****************************************************/
      // These keys are sent to the Central Office
      case KEYPAD_FEATURE_01:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_01);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_02:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_02);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_03:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_03);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_04:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_04);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_05:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_05);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_06:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_06);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_07:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_07);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_08:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_08);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_09:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_09);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_10:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_10);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;
      case KEYPAD_FEATURE_11:
        modemcontroller_send_modemmessage(MDC_CPE_FEATURE_11);
        if(phonesm_active_handsetactivated)
          phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
        return 0;

      /***** Voicemail Key ***************************************************/
      case KEYPAD_FEATURE_VOICEMAIL:
        switch(phonesm_infoaudio_speakingdevice) {
          case PHONESM_SPEAKINGDEVICE_HEADSET:
          case PHONESM_SPEAKINGDEVICE_SPEAKERPHONE:
          case PHONESM_SPEAKINGDEVICE_HANDSET:
            modemcontroller_send_modemmessage(MDC_CPE_FEATURE_VOICEMAIL);
            if(phonesm_infoonetouch_getenabled()) {
              if(phonesm_infoaudio_speakingdevice ==
                PHONESM_SPEAKINGDEVICE_SPEAKERPHONE) {
                leddriver_setstate(LED_INDICATOR_MUTE, LED_STATE_ON);
                phonesm_infoaudio_muteon = TRUE;
                audio_mute(TRUE);
              }
              phonesm_active_onetouch_timeout = 
                phonesm_infoonetouch_getwaitseconds_int() * 10;
              if( phonesm_active_onetouch_timeout == 0) {
                phonesm_active_predial_clear();
                phonesm_infoonetouch_getpin( phonesm_active_predialnumber );
                phonesm_active_predialoff = PHONESM_ACTIVE_PREDIAL_OFFTIME;
                phonesm_active_onetouch = ONETOUCHSTATE_DIALING_PIN;
              }
              else {
                phonesm_active_predial_clear();
                phonesm_active_onetouch = ONETOUCHSTATE_SECONDSOFWAIT;
              }
            }
            else
              phonesm_active_onetouch = ONETOUCHSTATE_OFF;
            break;
          case PHONESM_SPEAKINGDEVICE_NONE:
          /*
            phonesm_active_pendingoffhook = PHONESM_ACTIVE_OFFHOOK_PENDING;
            phonesm_active_pendingonhook = 0;
            phonesm_active_pendingdevice = PHONESM_SPEAKINGDEVICE_NONE;
            modemcontroller_send_modemmessage(MDC_CPE_HOOKSTATE_UP);
            phonesm_active_onetouch = ONETOUCHSTATE_AWAITING_HANDSETON;
            if( controller_gethookswitchstate() == HOOKSTATE_UP ) {
              phonesm_infoaudio_set_speakingdevice(PHONESM_SPEAKINGDEVICE_HANDSET);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?