-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all,
Attaching a patch adding support for "AT+CVIB" for controlling the vibrator.
- From 3GPP TS 07.07 subclause 8.22

I haven't been able to test it out on a real device though :(. Tested it
on my box using phonesim.

Thanks and Regards
Sudharshan S
blog: http://www.sudharsh.wordpress.com

P.S: I feel some of the prototypes in misc.h should be moved to
handset.h under include/libgsmd (especially lgsm_phone_* ones). Just my
two cents :)

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.7 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFHvagZSsRjJNRMc4kRAp+WAJ4j79+CLMESxNRAL7+/fUF3f7qLqwCgmSGp
tXKr32PfC31XDse2/p8Pnkg=
=5YA8
-----END PGP SIGNATURE-----
Index: include/libgsmd/misc.h
===================================================================
--- include/libgsmd/misc.h	(revision 4101)
+++ include/libgsmd/misc.h	(working copy)
@@ -73,4 +73,8 @@
 extern int lgsm_voicemail_get(struct lgsm_handle *lh);
 /* Get Battery Connection status and charge level */
 extern int lgsm_get_battery(struct lgsm_handle *lh);
+
+/* Enable vibrator */
+extern int lgsm_phone_vibrator(struct lgsm_handle *lh, int enable);
+
 #endif
Index: include/gsmd/state.h
===================================================================
--- include/gsmd/state.h	(revision 4101)
+++ include/gsmd/state.h	(working copy)
@@ -13,6 +13,7 @@
 		unsigned int network_state_gsm;
 		unsigned int network_state_gprs;
 	} ciph_ind;
+	unsigned int vibrator;
 	unsigned int on;
 	unsigned int registered;
         unsigned int ringing;
Index: include/gsmd/usock.h
===================================================================
--- include/gsmd/usock.h	(revision 4101)
+++ include/gsmd/usock.h	(working copy)
@@ -140,6 +140,8 @@
 	GSMD_PHONE_GET_REVISION	= 6,
 	GSMD_PHONE_GET_SERIAL	= 7,
 	GSMD_PHONE_GET_BATTERY  = 8,
+	GSMD_PHONE_VIB_ENABLE   = 9,
+	GSMD_PHONE_VIB_DISABLE  = 10,
 };
 
 enum gsmd_msg_modem {
Index: src/libgsmd/libgsmd_phone.c
===================================================================
--- src/libgsmd/libgsmd_phone.c	(revision 4101)
+++ src/libgsmd/libgsmd_phone.c	(working copy)
@@ -74,3 +74,15 @@
 {
 	return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_BATTERY);
 }
+
+int lgsm_phone_vibrator(struct lgsm_handle *lh, int enable)
+{
+	int type;
+	if(enable)
+		type = GSMD_PHONE_VIB_ENABLE;
+	else
+		type = GSMD_PHONE_VIB_DISABLE;
+	
+	return lgsm_send_simple(lh, GSMD_MSG_PHONE, type);
+}
+		
Index: src/gsmd/usock.c
===================================================================
--- src/gsmd/usock.c	(revision 4101)
+++ src/gsmd/usock.c	(working copy)
@@ -679,6 +679,32 @@
 		cmd -> id, sizeof(gbs), &gbs);
 }
 
+static int phone_vibrator_enable_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	struct gsmd_user *gu = ctx;
+	int ret = cmd->ret;
+
+	switch(ret) {
+	case 0:
+		gsmd_log(GSMD_DEBUG, "Vibrator enabled\n");
+		gu->gsmd->dev_state.vibrator = 1;
+		break;
+	default:
+		gsmd_log(GSMD_DEBUG, "AT+CVIB=1 operation failed\n");
+		break;
+	}
+	
+	return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_VIB_ENABLE,
+				cmd->id, sizeof(ret), &ret);
+}
+
+static int phone_vibrator_disable_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	int ret = cmd->ret;
+	return gsmd_ucmd_submit(ctx, GSMD_MSG_PHONE, GSMD_PHONE_VIB_DISABLE,
+				cmd->id, sizeof(ret), &ret);
+}
+	
 static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
 			   int len)
 {
@@ -718,6 +744,13 @@
 	case GSMD_PHONE_GET_BATTERY:
 		cmd = atcmd_fill("AT+CBC", 6+1, &phone_get_battery_cb, gu, 0, NULL);
 		break;
+	case GSMD_PHONE_VIB_ENABLE:
+		cmd = atcmd_fill("AT+CVIB=1", 9+1, &phone_vibrator_enable_cb, gu, 0, NULL);
+		break;
+	case GSMD_PHONE_VIB_DISABLE:
+		cmd = atcmd_fill("AT+CVIB=0", 9+1, &phone_vibrator_disable_cb, gu, 0, NULL);
+		gu->gsmd->dev_state.vibrator = 0;
+		break;
 	default:
 		return -EINVAL;
 	}
Index: src/util/shell.c
===================================================================
--- src/util/shell.c	(revision 4101)
+++ src/util/shell.c	(working copy)
@@ -428,6 +428,18 @@
 	case GSMD_PHONE_GET_BATTERY:
 		printf("<BCS>: %d <BCL>: %d \n", bc->bcs, bc->bcl);
 		break;		
+	case GSMD_PHONE_VIB_ENABLE:
+		if(*intresult)
+			printf("Vibrator enable failed: %i\n", *intresult);
+		else
+			printf("Vibrator enabled\n");
+		break;
+	case GSMD_PHONE_VIB_DISABLE:
+		if(*intresult)
+			printf("Vibrator disable failed: %i\n", *intresult);
+		else
+			printf("VIbrator disabled\n");
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -534,7 +546,9 @@
 		"\tH\tHangup call\n"
 		"\tO\tAntenna Power On\n"
 		"\to\tAntenna Power Off\n"
-		"\tM\tModem Power On\n"
+		"\tV\tVibrator Enable (CVIB=1)\n"
+		"\tv\tVibrator Disable (CVIB=0)\n"
+	       	"\tM\tModem Power On\n"
 		"\tm\tModem Power Off\n"
 		"\tr\tRegister to network\n"
 		"\tR\tRegister to given operator (R=number)\n"
@@ -666,6 +680,12 @@
 			} else if (!strcmp(buf, "o")) {
 				printf("Power-Off\n");
 				lgsm_phone_power(lgsmh, 0);
+			} else if (!strcmp(buf, "V")) {
+				printf("Vibrator-Enable\n");
+				lgsm_phone_vibrator(lgsmh, 1);
+			} else if (!strcmp(buf, "v")) {
+				printf("Vibrator-Disable\n");
+				lgsm_phone_vibrator(lgsmh, 0);
 			} else if (!strcmp(buf, "r")) {
 				printf("Register\n");
 				lgsm_netreg_register(lgsmh, "\0     ");

Reply via email to