/*JSON{ "type" : "staticmethod", "ifndef" : "SAVE_ON_FLASH", "class" : "Storage", "name" : "readArrayBuffer", "generate" : "jswrap_storage_readArrayBuffer", "params" : [ ["name","JsVar","The filename - max 8 characters (case sensitive)"] ], "return" : ["JsVar","An ArrayBuffer containing data from the file, or undefined"] } Read a file from the flash storage area that has been written with `require("Storage").write(...)`, and return the raw binary data as an ArrayBuffer. This can be used: * In a `DataView` with `new DataView(require("Storage").readArrayBuffer("x"))` * In a `Uint8Array/Float32Array/etc` with `new Uint8Array(require("Storage").readArrayBuffer("x"))` */ JsVar *jswrap_storage_readArrayBuffer(JsVar *name) { JsVar *v = jsfReadFile(jsfNameFromVar(name)); if (!v) return 0; JsVar *r = jsvNewArrayBufferFromString(v, 0); jsvUnLock(v); return r; }
/*JSON{ "type" : "constructor", "class" : "ArrayBuffer", "name" : "ArrayBuffer", "generate" : "jswrap_arraybuffer_constructor", "params" : [ ["byteLength","int","The length in Bytes"] ], "return" : ["JsVar","An ArrayBuffer object"] } Create an Array Buffer object */ JsVar *jswrap_arraybuffer_constructor(JsVarInt byteLength) { if (byteLength <= 0 || byteLength>65535) { jsExceptionHere(JSET_ERROR, "Invalid length for ArrayBuffer\n"); return 0; } if (byteLength > JSV_ARRAYBUFFER_MAX_LENGTH) { jsExceptionHere(JSET_ERROR, "ArrayBuffer too long\n"); return 0; } JsVar *arrData = jsvNewStringOfLength((unsigned int)byteLength); if (!arrData) return 0; JsVar *v = jsvNewArrayBufferFromString(arrData, (unsigned int)byteLength); jsvUnLock(arrData); return v; }
/*JSON{ "type" : "constructor", "class" : "ArrayBuffer", "name" : "ArrayBuffer", "generate" : "jswrap_arraybuffer_constructor", "params" : [ ["byteLength","int","The length in Bytes"] ], "return" : ["JsVar","An ArrayBuffer object"] } Create an Array Buffer object */ JsVar *jswrap_arraybuffer_constructor(JsVarInt byteLength) { if (byteLength < 0 || byteLength>65535) { jsExceptionHere(JSET_ERROR, "Invalid length for ArrayBuffer\n"); return 0; } if (byteLength > JSV_ARRAYBUFFER_MAX_LENGTH) { jsExceptionHere(JSET_ERROR, "ArrayBuffer too long\n"); return 0; } // try and use a flat string - which will be faster JsVar *arrData = 0; /* if the bytes could fit into 1 or 2 normal string blocks, do that. * It's faster to allocate and can use less memory (if it fits into one block) */ if (byteLength > JSV_FLAT_STRING_BREAK_EVEN) arrData = jsvNewFlatStringOfLength((unsigned int)byteLength); // if we haven't found one, spread it out if (!arrData) arrData = jsvNewStringOfLength((unsigned int)byteLength, NULL); if (!arrData) return 0; JsVar *v = jsvNewArrayBufferFromString(arrData, (unsigned int)byteLength); jsvUnLock(arrData); return v; }
/**@brief Function for the application's SoftDevice event handler. * * @param[in] p_ble_evt SoftDevice event. */ static void on_ble_evt(ble_evt_t * p_ble_evt) { uint32_t err_code; switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_TIMEOUT: // the timeout for sd_ble_gap_adv_start expired - kick it off again jswrap_nrf_bluetooth_startAdvertise(); break; case BLE_GAP_EVT_CONNECTED: m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; bleStatus &= ~BLE_IS_SENDING; // reset state - just in case jsiSetConsoleDevice( EV_BLUETOOTH ); break; case BLE_GAP_EVT_DISCONNECTED: m_conn_handle = BLE_CONN_HANDLE_INVALID; jsiSetConsoleDevice( DEFAULT_CONSOLE_DEVICE ); // restart advertising after disconnection jswrap_nrf_bluetooth_startAdvertise(); break; case BLE_GAP_EVT_SEC_PARAMS_REQUEST: // Pairing not supported err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); APP_ERROR_CHECK(err_code); break; case BLE_GATTS_EVT_SYS_ATTR_MISSING: // No system attributes have been stored. err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0); APP_ERROR_CHECK(err_code); break; case BLE_EVT_TX_COMPLETE: // UART Transmit finished - we can try and send more data bleStatus &= ~BLE_IS_SENDING; jswrap_nrf_transmit_string(); break; case BLE_GAP_EVT_ADV_REPORT: { // Advertising data received const ble_gap_evt_adv_report_t *p_adv = &p_ble_evt->evt.gap_evt.params.adv_report; JsVar *evt = jsvNewObject(); if (evt) { jsvObjectSetChildAndUnLock(evt, "rssi", jsvNewFromInteger(p_adv->rssi)); jsvObjectSetChildAndUnLock(evt, "addr", jsvVarPrintf("%02x:%02x:%02x:%02x:%02x:%02x", p_adv->peer_addr.addr[5], p_adv->peer_addr.addr[4], p_adv->peer_addr.addr[3], p_adv->peer_addr.addr[2], p_adv->peer_addr.addr[1], p_adv->peer_addr.addr[0])); JsVar *data = jsvNewStringOfLength(p_adv->dlen); if (data) { jsvSetString(data, p_adv->data, p_adv->dlen); JsVar *ab = jsvNewArrayBufferFromString(data, p_adv->dlen); jsvUnLock(data); jsvObjectSetChildAndUnLock(evt, "data", ab); } jsiQueueObjectCallbacks(execInfo.root, BLE_SCAN_EVENT, &evt, 1); jsvUnLock(evt); } break; } default: // No implementation needed. break; } }
/*JSON{ "type" : "staticmethod", "class" : "E", "name" : "toArrayBuffer", "generate" : "jswrap_espruino_toArrayBuffer", "params" : [ ["str","JsVar","The string to convert to an ArrayBuffer"] ], "return" : ["JsVar","An ArrayBuffer that uses the given string"], "return_object" : "ArrayBufferView" } Create an ArrayBuffer from the given string. This is done via a reference, not a copy - so it is very fast and memory efficient. Note that this is an ArrayBuffer, not a Uint8Array. To get one of those, do: `new Uint8Array(E.toArrayBuffer('....'))`. */ JsVar *jswrap_espruino_toArrayBuffer(JsVar *str) { if (!jsvIsString(str)) return 0; return jsvNewArrayBufferFromString(str, 0); }