Skip to content

Commit 0ebbfd1

Browse files
committed
Change address string type so we can specify puclic or randon addresses in the string. Tidy write_params to cope with potential extra args in future
1 parent fa5307f commit 0ebbfd1

File tree

5 files changed

+77
-41
lines changed

5 files changed

+77
-41
lines changed

libs/bluetooth/jswrap_bluetooth.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ NRF.setScan(false);
11421142
11431143
// getting all services
11441144
var device;
1145-
NRF.connect("d1:53:36:1a:7a:17").then(function(d) {
1145+
NRF.connect("d1:53:36:1a:7a:17 random").then(function(d) {
11461146
device = d;
11471147
console.log("Connected ",d);
11481148
return d.getPrimaryServices();
@@ -1159,6 +1159,23 @@ NRF.connect("d1:53:36:1a:7a:17").then(function(d) {
11591159
console.log("Oops");
11601160
});
11611161
1162+
NRF.connect("d1:53:36:1a:7a:17 random").then(function(d) {
1163+
device = d;
1164+
console.log("Connected ",d);
1165+
return d.getPrimaryService("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
1166+
}).then(function(s) {
1167+
console.log("Services ",s);
1168+
return s.getCharacteristic("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
1169+
}).then(function(c) {
1170+
console.log("Characteristics ",c);
1171+
return c.writeValue("LED1.set()\n");
1172+
}).then(function() {
1173+
console.log("Written. Disconnecting");
1174+
device.disconnect();
1175+
}).catch(function() {
1176+
console.log("Oops");
1177+
});
1178+
11621179
11631180
// ------------------------------ on BLE server (microbit) - allow display of data
11641181
NRF.setServices({

src/jsvar.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,17 +1854,14 @@ JsVar *jsvSkipOneNameAndUnLock(JsVar *a) {
18541854
}
18551855

18561856

1857-
/*
1858-
jsvIsStringEqualOrStartsWith(A, B, false) is a proper A==B
1859-
jsvIsStringEqualOrStartsWith(A, B, true) is A.startsWith(B)
1860-
*/
1861-
bool jsvIsStringEqualOrStartsWith(JsVar *var, const char *str, bool isStartsWith) {
1857+
1858+
bool jsvIsStringEqualOrStartsWithOffset(JsVar *var, const char *str, bool isStartsWith, size_t startIdx) {
18621859
if (!jsvHasCharacterData(var)) {
18631860
return 0; // not a string so not equal!
18641861
}
18651862

18661863
JsvStringIterator it;
1867-
jsvStringIteratorNew(&it, var, 0);
1864+
jsvStringIteratorNew(&it, var, startIdx);
18681865
while (jsvStringIteratorHasChar(&it) && *str) {
18691866
if (jsvStringIteratorGetChar(&it) != *str) {
18701867
jsvStringIteratorFree(&it);
@@ -1879,6 +1876,14 @@ bool jsvIsStringEqualOrStartsWith(JsVar *var, const char *str, bool isStartsWith
18791876
return eq;
18801877
}
18811878

1879+
/*
1880+
jsvIsStringEqualOrStartsWith(A, B, false) is a proper A==B
1881+
jsvIsStringEqualOrStartsWith(A, B, true) is A.startsWith(B)
1882+
*/
1883+
bool jsvIsStringEqualOrStartsWith(JsVar *var, const char *str, bool isStartsWith) {
1884+
return jsvIsStringEqualOrStartsWithOffset(var, str, isStartsWith, 0);
1885+
}
1886+
18821887
// Also see jsvIsBasicVarEqual
18831888
bool jsvIsStringEqual(JsVar *var, const char *str) {
18841889
return jsvIsStringEqualOrStartsWith(var, str, false);

src/jsvar.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,8 @@ void jsvGetLineAndCol(JsVar *v, size_t charIdx, size_t *line, size_t *col); ///<
520520
size_t jsvGetIndexFromLineAndCol(JsVar *v, size_t line, size_t col); ///< IN A STRING, get a character index from a line and column
521521

522522

523+
/// Like jsvIsStringEqualOrStartsWith, but starts comparing at some offset (not the beginning of the string)
524+
bool jsvIsStringEqualOrStartsWithOffset(JsVar *var, const char *str, bool isStartsWith, size_t startIdx);
523525
/**
524526
Compare a string with a C string. Returns 0 if A is not a string.
525527

targets/nrf5x/bluetooth.c

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ bool jsble_check_error(uint32_t err_code) {
132132
if (!err_code) return false;
133133
const char *name = 0;
134134
if (err_code==NRF_ERROR_INVALID_PARAM) name="INVALID_PARAM";
135+
else if (err_code==NRF_ERROR_DATA_SIZE) name="DATA_SIZE";
135136
if (name) jsExceptionHere(JSET_ERROR, "Got BLE error %s", name);
136137
else jsExceptionHere(JSET_ERROR, "Got BLE error code %d", err_code);
137138
return true;
@@ -427,10 +428,11 @@ static void on_ble_evt(ble_evt_t * p_ble_evt)
427428
#if CENTRAL_LINK_COUNT>0
428429
// For discovery....
429430
case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: {
431+
bool done = true;
432+
433+
JsVar *srvcs = jsvObjectGetChild(execInfo.hiddenRoot, "bleSvcs", JSV_ARRAY);
430434
if (p_ble_evt->evt.gattc_evt.gatt_status == BLE_GATT_STATUS_SUCCESS &&
431435
p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count!=0) {
432-
433-
JsVar *srvcs = jsvObjectGetChild(execInfo.hiddenRoot, "bleSvcs", JSV_ARRAY);
434436
if (srvcs) {
435437
int i;
436438
// Should actually return 'BLEService' object here
@@ -452,23 +454,23 @@ static void on_ble_evt(ble_evt_t * p_ble_evt)
452454

453455
uint16_t last = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count-1;
454456
if (p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[last].handle_range.end_handle < 0xFFFF) {
455-
jsvUnLock(srvcs);
456457
// Now try again
457458
uint16_t start_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[last].handle_range.end_handle+1;
458-
sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gap_evt.conn_handle, start_handle, NULL);
459-
} else {
460-
// When done, send the result to the handler
461-
if (srvcs && bleUUIDFilter.type != BLE_UUID_TYPE_UNKNOWN) {
462-
// single item because filtering
463-
JsVar *t = jsvSkipNameAndUnLock(jsvArrayPopFirst(srvcs));
464-
jsvUnLock(srvcs);
465-
srvcs = t;
466-
}
467-
bleCompleteTaskSuccess(BLETASK_PRIMARYSERVICE, srvcs);
459+
done = sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gap_evt.conn_handle, start_handle, NULL) != NRF_SUCCESS;;
460+
}
461+
}
462+
if (done) {
463+
// When done, send the result to the handler
464+
if (srvcs && bleUUIDFilter.type != BLE_UUID_TYPE_UNKNOWN) {
465+
// single item because filtering
466+
JsVar *t = jsvSkipNameAndUnLock(jsvArrayPopFirst(srvcs));
468467
jsvUnLock(srvcs);
469-
jsvObjectSetChild(execInfo.hiddenRoot, "bleSvcs", 0);
468+
srvcs = t;
470469
}
470+
bleCompleteTaskSuccess(BLETASK_PRIMARYSERVICE, srvcs);
471+
jsvObjectSetChild(execInfo.hiddenRoot, "bleSvcs", 0);
471472
} // else error
473+
jsvUnLock(srvcs);
472474
break;
473475
}
474476
case BLE_GATTC_EVT_CHAR_DISC_RSP: {
@@ -846,10 +848,7 @@ static void ble_stack_init() {
846848
&ble_enable_params);
847849
APP_ERROR_CHECK(err_code);
848850

849-
uint32_t softdevice_extra_ram_hack = 0;
850-
851851
ble_enable_params.common_enable_params.vs_uuid_count = 3;
852-
softdevice_extra_ram_hack += 32; // now we have more UUIDs, SD needs more RAM
853852

854853
//Check the ram settings against the used number of links
855854
CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT, PERIPHERAL_LINK_COUNT);
@@ -1260,7 +1259,7 @@ void jsble_nfc_start(const uint8_t *data, size_t len) {
12601259
#if CENTRAL_LINK_COUNT>0
12611260
void jsble_central_connect(ble_gap_addr_t peer_addr) {
12621261
uint32_t err_code;
1263-
// TODO: do these need to be static?
1262+
// TODO: do these really need to be static?
12641263

12651264
static ble_gap_scan_params_t m_scan_param;
12661265
memset(&m_scan_param, 0, sizeof(m_scan_param));
@@ -1310,18 +1309,19 @@ void jsble_central_getCharacteristics(JsVar *service, ble_uuid_t uuid) {
13101309
}
13111310

13121311
void jsble_central_characteristicWrite(JsVar *characteristic, char *dataPtr, size_t dataLen) {
1313-
const ble_gattc_write_params_t write_params = {
1314-
.write_op = BLE_GATT_OP_WRITE_CMD,
1315-
.flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE,
1316-
.handle = jsvGetIntegerAndUnLock(jsvObjectGetChild(characteristic, "handle_value", 0)),
1317-
.offset = 0,
1318-
.len = dataLen,
1319-
.p_value = (uint8_t*)dataPtr
1320-
};
1321-
uint32_t err_code;
1322-
err_code = sd_ble_gattc_write(m_central_conn_handle, &write_params);
1323-
if (jsble_check_error(err_code))
1324-
bleCompleteTaskFail(BLETASK_CHARACTERISTIC_WRITE, 0);
1312+
ble_gattc_write_params_t write_params;
1313+
memset(&write_params, 0, sizeof(write_params));
1314+
write_params.write_op = BLE_GATT_OP_WRITE_CMD;
1315+
write_params.flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE;
1316+
write_params.handle = jsvGetIntegerAndUnLock(jsvObjectGetChild(characteristic, "handle_value", 0));
1317+
write_params.offset = 0;
1318+
write_params.len = dataLen;
1319+
write_params.p_value = (uint8_t*)dataPtr;
1320+
1321+
uint32_t err_code;
1322+
err_code = sd_ble_gattc_write(m_central_conn_handle, &write_params);
1323+
if (jsble_check_error(err_code))
1324+
bleCompleteTaskFail(BLETASK_CHARACTERISTIC_WRITE, 0);
13251325
}
13261326

13271327
void jsble_central_characteristicRead(JsVar *characteristic) {

targets/nrf5x/bluetooth_utils.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,42 @@ JsVar *bleUUIDToStr(ble_uuid_t uuid) {
4949
// Convert a variable of the form "aa:bb:cc:dd:ee:ff" to a mac address
5050
bool bleVarToAddr(JsVar *mac, ble_gap_addr_t *addr) {
5151
if (!jsvIsString(mac) ||
52-
jsvGetStringLength(mac)!=17 ||
5352
jsvGetCharInString(mac, 2)!=':' ||
5453
jsvGetCharInString(mac, 5)!=':' ||
5554
jsvGetCharInString(mac, 8)!=':' ||
5655
jsvGetCharInString(mac, 11)!=':' ||
5756
jsvGetCharInString(mac, 14)!=':') {
5857
return false;
5958
}
60-
addr->addr_type = BLE_GAP_ADDR_TYPE_RANDOM_STATIC; // not sure why this isn't public?
59+
memset(addr, 0, sizeof(ble_gap_addr_t));
60+
addr->addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
6161
int i;
6262
for (i=0;i<6;i++)
6363
addr->addr[5-i] = (chtod(jsvGetCharInString(mac, i*3))<<4) | chtod(jsvGetCharInString(mac, (i*3)+1));
64+
if (jsvGetStringLength(mac)!=17) {
65+
if (jsvIsStringEqualOrStartsWithOffset(mac, " public", false, 17))
66+
addr->addr_type = BLE_GAP_ADDR_TYPE_PUBLIC; // default
67+
else if (jsvIsStringEqualOrStartsWithOffset(mac, " random", false, 17))
68+
addr->addr_type = BLE_GAP_ADDR_TYPE_RANDOM_STATIC;
69+
else return false;
70+
}
6471
return true;
6572
}
6673

6774
/// BLE MAC address to string
6875
JsVar *bleAddrToStr(ble_gap_addr_t addr) {
69-
return jsvVarPrintf("%02x:%02x:%02x:%02x:%02x:%02x",
76+
const char *typeStr = "";
77+
if (addr.addr_type == BLE_GAP_ADDR_TYPE_PUBLIC)
78+
typeStr = " public";
79+
else if (addr.addr_type == BLE_GAP_ADDR_TYPE_RANDOM_STATIC)
80+
typeStr = " random";
81+
return jsvVarPrintf("%02x:%02x:%02x:%02x:%02x:%02x%s",
7082
addr.addr[5],
7183
addr.addr[4],
7284
addr.addr[3],
7385
addr.addr[2],
7486
addr.addr[1],
75-
addr.addr[0]);
87+
addr.addr[0], typeStr);
7688
}
7789

7890
/** Convert a JsVar to a UUID - 0 if handled, a string showing the error if not

0 commit comments

Comments
 (0)