diff options
-rw-r--r-- | include/gsmd/state.h | 1 | ||||
-rw-r--r-- | include/gsmd/usock.h | 2 | ||||
-rw-r--r-- | include/libgsmd/misc.h | 4 | ||||
-rw-r--r-- | src/gsmd/usock.c | 33 | ||||
-rw-r--r-- | src/libgsmd/libgsmd_phone.c | 12 | ||||
-rw-r--r-- | src/util/shell.c | 22 |
6 files changed, 73 insertions, 1 deletions
diff --git a/include/gsmd/state.h b/include/gsmd/state.h index 65659ef..7162b4f 100644 --- a/include/gsmd/state.h +++ b/include/gsmd/state.h @@ -13,6 +13,7 @@ struct gsmd_device_state { unsigned int network_state_gsm; unsigned int network_state_gprs; } ciph_ind; + unsigned int vibrator; unsigned int on; unsigned int registered; unsigned int ringing; diff --git a/include/gsmd/usock.h b/include/gsmd/usock.h index 7df22b2..bb03aa1 100644 --- a/include/gsmd/usock.h +++ b/include/gsmd/usock.h @@ -140,6 +140,8 @@ enum gsmd_msg_phone { 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 { diff --git a/include/libgsmd/misc.h b/include/libgsmd/misc.h index 884e294..9100260 100644 --- a/include/libgsmd/misc.h +++ b/include/libgsmd/misc.h @@ -73,4 +73,8 @@ extern int lgsm_voicemail_set(struct lgsm_handle *lh, const char *number); 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 diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c index 119ed56..c7f8827 100644 --- a/src/gsmd/usock.c +++ b/src/gsmd/usock.c @@ -679,6 +679,32 @@ static int phone_get_battery_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) 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 @@ static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 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; } diff --git a/src/libgsmd/libgsmd_phone.c b/src/libgsmd/libgsmd_phone.c index 2c67e8e..5ad5e44 100644 --- a/src/libgsmd/libgsmd_phone.c +++ b/src/libgsmd/libgsmd_phone.c @@ -74,3 +74,15 @@ int lgsm_get_battery(struct lgsm_handle *lh) { 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); +} + diff --git a/src/util/shell.c b/src/util/shell.c index af6f795..85aa902 100644 --- a/src/util/shell.c +++ b/src/util/shell.c @@ -428,6 +428,18 @@ static int phone_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) 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 @@ static void shell_help(void) "\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 @@ int shell_main(struct lgsm_handle *lgsmh, int sync) } 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 "); |