mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	bluez5: backend-native: Add AT+CMEE support
Returns extended error report instead of just "ERROR" messages when extended report has been activated by AT+CMEE=1 command.
This commit is contained in:
		
							parent
							
								
									43c4d95794
								
							
						
					
					
						commit
						e9b82252f7
					
				
					 2 changed files with 37 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -169,6 +169,7 @@ struct rfcomm {
 | 
			
		|||
	unsigned int hfp_ag_initial_codec_setup:2;
 | 
			
		||||
	unsigned int cind_call_active:1;
 | 
			
		||||
	unsigned int cind_call_notify:1;
 | 
			
		||||
	unsigned int extended_error_reporting:1;
 | 
			
		||||
	enum hfp_hf_state hf_state;
 | 
			
		||||
	enum hsp_hs_state hs_state;
 | 
			
		||||
	unsigned int codec;
 | 
			
		||||
| 
						 | 
				
			
			@ -379,6 +380,14 @@ static ssize_t rfcomm_send_reply(const struct rfcomm *rfcomm, const char *format
 | 
			
		|||
	return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void rfcomm_send_error(const struct rfcomm *rfcomm, enum cmee_error error)
 | 
			
		||||
{
 | 
			
		||||
	if (rfcomm->extended_error_reporting)
 | 
			
		||||
		rfcomm_send_reply(rfcomm, "+CME ERROR: %d", error);
 | 
			
		||||
	else
 | 
			
		||||
		rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool rfcomm_volume_enabled(struct rfcomm *rfcomm)
 | 
			
		||||
{
 | 
			
		||||
	return rfcomm->device != NULL
 | 
			
		||||
| 
						 | 
				
			
			@ -748,6 +757,7 @@ static bool rfcomm_hfp_ag(struct rfcomm *rfcomm, char* buf)
 | 
			
		|||
	unsigned int selected_codec;
 | 
			
		||||
	unsigned int indicator;
 | 
			
		||||
	unsigned int indicator_value;
 | 
			
		||||
	unsigned int value;
 | 
			
		||||
	int xapl_vendor;
 | 
			
		||||
	int xapl_product;
 | 
			
		||||
	int xapl_features;
 | 
			
		||||
| 
						 | 
				
			
			@ -854,7 +864,7 @@ static bool rfcomm_hfp_ag(struct rfcomm *rfcomm, char* buf)
 | 
			
		|||
		}
 | 
			
		||||
	} else if (!rfcomm->slc_configured) {
 | 
			
		||||
		spa_log_warn(backend->log, "RFCOMM receive command before SLC completed: %s", buf);
 | 
			
		||||
		rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
		rfcomm_send_error(rfcomm, CMEE_AG_FAILURE);
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	/* *****
 | 
			
		||||
| 
						 | 
				
			
			@ -871,7 +881,7 @@ static bool rfcomm_hfp_ag(struct rfcomm *rfcomm, char* buf)
 | 
			
		|||
 | 
			
		||||
		if (selected_codec != HFP_AUDIO_CODEC_CVSD && selected_codec != HFP_AUDIO_CODEC_MSBC) {
 | 
			
		||||
			spa_log_warn(backend->log, "unsupported codec negotiation: %d", selected_codec);
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_AG_FAILURE);
 | 
			
		||||
			if (was_switching_codec)
 | 
			
		||||
				spa_bt_device_emit_codec_switched(rfcomm->device, -EIO);
 | 
			
		||||
			return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -889,7 +899,7 @@ static bool rfcomm_hfp_ag(struct rfcomm *rfcomm, char* buf)
 | 
			
		|||
		if (rfcomm->transport == NULL) {
 | 
			
		||||
			spa_log_warn(backend->log, "can't create transport: %m");
 | 
			
		||||
			// TODO: We should manage the missing transport
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_AG_FAILURE);
 | 
			
		||||
			if (was_switching_codec)
 | 
			
		||||
				spa_bt_device_emit_codec_switched(rfcomm->device, -ENOMEM);
 | 
			
		||||
			return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -931,19 +941,28 @@ next_indicator:
 | 
			
		|||
			str++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		rfcomm_send_reply(rfcomm, "OK");
 | 
			
		||||
	} else if (sscanf(buf, "AT+CMEE=%u", &value) == 1) {
 | 
			
		||||
		if (value > 1) {
 | 
			
		||||
			spa_log_debug(backend->log, "Unsupported AT+CMEE value: %u", value);
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_AG_FAILURE);
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		rfcomm->extended_error_reporting = value;
 | 
			
		||||
		rfcomm_send_reply(rfcomm, "OK");
 | 
			
		||||
	} else if (spa_strstartswith(buf, "AT+COPS=")) {
 | 
			
		||||
		unsigned int mode, val;
 | 
			
		||||
 | 
			
		||||
		if (sscanf(buf, "AT+COPS=%u,%u", &mode, &val) != 2 ||
 | 
			
		||||
		      mode != 3 || val != 0) {
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_AG_FAILURE);
 | 
			
		||||
		} else {
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "OK");
 | 
			
		||||
		}
 | 
			
		||||
	} else if (spa_strstartswith(buf, "AT+COPS?")) {
 | 
			
		||||
		if (!backend->modem.network_has_service) {
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_NO_NETWORK_SERVICE);
 | 
			
		||||
		} else {
 | 
			
		||||
			if (backend->modem.operator_name)
 | 
			
		||||
				rfcomm_send_reply(rfcomm, "+COPS: 0,0,\"%s\"", backend->modem.operator_name);
 | 
			
		||||
| 
						 | 
				
			
			@ -958,7 +977,7 @@ next_indicator:
 | 
			
		|||
			rfcomm_send_reply(rfcomm, "OK");
 | 
			
		||||
		} else {
 | 
			
		||||
			spa_log_debug(backend->log, "RFCOMM receive unsupported VGM gain: %s", buf);
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_OPERATION_NOT_ALLOWED);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (sscanf(buf, "AT+VGS=%u", &gain) == 1) {
 | 
			
		||||
		if (gain <= SPA_BT_VOLUME_HS_MAX) {
 | 
			
		||||
| 
						 | 
				
			
			@ -966,7 +985,7 @@ next_indicator:
 | 
			
		|||
			rfcomm_send_reply(rfcomm, "OK");
 | 
			
		||||
		} else {
 | 
			
		||||
			spa_log_debug(backend->log, "RFCOMM receive unsupported VGS gain: %s", buf);
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_OPERATION_NOT_ALLOWED);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (spa_strstartswith(buf, "AT+BIND=?")) {
 | 
			
		||||
		rfcomm_send_reply(rfcomm, "+BIND: (2)");
 | 
			
		||||
| 
						 | 
				
			
			@ -1169,7 +1188,7 @@ static void rfcomm_event(struct spa_source *source)
 | 
			
		|||
 | 
			
		||||
		if (!res) {
 | 
			
		||||
			spa_log_debug(backend->log, "RFCOMM received unsupported command: %s", buf);
 | 
			
		||||
			rfcomm_send_reply(rfcomm, "ERROR");
 | 
			
		||||
			rfcomm_send_error(rfcomm, CMEE_OPERATION_NOT_SUPPORTED);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,16 @@
 | 
			
		|||
 | 
			
		||||
#include "defs.h"
 | 
			
		||||
 | 
			
		||||
enum cmee_error {
 | 
			
		||||
	CMEE_AG_FAILURE = 0,
 | 
			
		||||
	CMEE_NO_CONNECTION_TO_PHONE = 1,
 | 
			
		||||
	CMEE_OPERATION_NOT_ALLOWED = 3,
 | 
			
		||||
	CMEE_OPERATION_NOT_SUPPORTED = 4,
 | 
			
		||||
	CMEE_INVALID_CHARACTERS_TEXT_STRING = 25,
 | 
			
		||||
	CMEE_INVALID_CHARACTERS_DIAL_STRING = 27,
 | 
			
		||||
	CMEE_NO_NETWORK_SERVICE = 30
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum call_setup {
 | 
			
		||||
	CIND_CALLSETUP_NONE = 0,
 | 
			
		||||
	CIND_CALLSETUP_INCOMING,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue