From b3f6fbb0c65e3b1483ed8f8bb6059da08c775b49 Mon Sep 17 00:00:00 2001 From: "matthias.ringwald@gmail.com" Date: Sat, 11 Jan 2014 22:32:32 +0000 Subject: [PATCH] emit Modem Status --- src/rfcomm.c | 22 +++++++++++++++++++++- src/rfcomm.h | 8 ++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/rfcomm.c b/src/rfcomm.c index bc5cd27b3..8a885ece2 100644 --- a/src/rfcomm.c +++ b/src/rfcomm.c @@ -1318,6 +1318,7 @@ void rfcomm_channel_packet_handler(rfcomm_multiplexer_t * multiplexer, uint8_t rfcomm_channel_event_t event; rfcomm_channel_event_pn_t event_pn; rfcomm_channel_event_rpn_t event_rpn; + rfcomm_channel_event_msc_t event_msc; // switch by rfcomm message type switch(packet[1]) { @@ -1375,7 +1376,8 @@ void rfcomm_channel_packet_handler(rfcomm_multiplexer_t * multiplexer, uint8_t case BT_RFCOMM_MSC_CMD: message_dlci = packet[payload_offset+2] >> 2; - event.type = CH_EVT_RCVD_MSC_CMD; + event_msc.super.type = CH_EVT_RCVD_MSC_CMD; + event_msc.modem_status = packet[payload_offset+3]; log_info("Received MSC CMD for #%u, \n", message_dlci); rfcomm_channel_state_machine_2(multiplexer, message_dlci, &event); break; @@ -1540,6 +1542,12 @@ static void rfcomm_channel_state_machine(rfcomm_channel_t *channel, rfcomm_chann rfcomm_channel_event_rpn_t *event_rpn = (rfcomm_channel_event_rpn_t*) event; memcpy(&channel->rpn_data, &event_rpn->data, sizeof(rfcomm_rpn_data_t)); rfcomm_channel_state_add(channel, RFCOMM_CHANNEL_STATE_VAR_SEND_RPN_RSP); + // notify client about new settings + uint8_t event[2+sizeof(rfcomm_rpn_data_t)]; + event[0] = RFCOMM_EVENT_PORT_NEGOTIATION; + event[1] = sizeof(rfcomm_rpn_data_t); + memcpy(&event[2], (uint8_t*) &event_rpn->data, sizeof(rfcomm_rpn_data_t)); + (*app_packet_handler)(channel->connection, HCI_EVENT_PACKET, channel->rfcomm_cid, (uint8_t*)&event, sizeof(event)); return; } @@ -1569,6 +1577,18 @@ static void rfcomm_channel_state_machine(rfcomm_channel_t *channel, rfcomm_chann } } + // emit MSC status to app + if (event->type == CH_EVT_RCVD_MSC_CMD){ + // notify client about new settings + rfcomm_channel_event_msc_t *event_msc = (rfcomm_channel_event_msc_t*) event; + uint8_t event[2+1]; + event[0] = RFCOMM_EVENT_REMOTE_MODEM_STATUS; + event[1] = 1; + event[2] = event_msc->modem_status; + (*app_packet_handler)(channel->connection, HCI_EVENT_PACKET, channel->rfcomm_cid, (uint8_t*)&event, sizeof(event)); + // no return, MSC_CMD will be handled by state machine below + } + rfcomm_channel_event_pn_t * event_pn = (rfcomm_channel_event_pn_t*) event; switch (channel->state) { diff --git a/src/rfcomm.h b/src/rfcomm.h index bdc3f4f8c..ee2531dff 100644 --- a/src/rfcomm.h +++ b/src/rfcomm.h @@ -215,6 +215,11 @@ typedef struct rfcomm_channel_event_rls { uint8_t line_status; } rfcomm_channel_event_rls_t; +typedef struct rfcomm_channel_event_msc { + rfcomm_channel_event_t super; + uint8_t modem_status; +} rfcomm_channel_event_msc_t; + // info regarding potential connections typedef struct { // linked list - assert: first field @@ -321,6 +326,9 @@ typedef struct { // rls line status. RFCOMM_RLS_STATUS_INVALID if not set uint8_t rls_line_status; + // msc modem status. + uint8_t msc_modem_status; + // server channel (see rfcomm_service_t) - NULL => outgoing channel rfcomm_service_t * service;