void jshInit() { jshInitDevices(); nrf_utils_lfclk_config_and_start(); BITFIELD_CLEAR(jshPinSoftPWM); JshUSARTInfo inf; jshUSARTInitInfo(&inf); inf.pinRX = DEFAULT_CONSOLE_RX_PIN; inf.pinTX = DEFAULT_CONSOLE_TX_PIN; inf.baudRate = DEFAULT_CONSOLE_BAUDRATE; jshUSARTSetup(EV_SERIAL1, &inf); // Initialize UART for communication with Espruino/terminal. init = 1; // Enable and sort out the timer nrf_timer_mode_set(NRF_TIMER1,NRF_TIMER_MODE_TIMER); nrf_timer_bit_width_set(NRF_TIMER1, NRF_TIMER_BIT_WIDTH_32); nrf_timer_frequency_set(NRF_TIMER1, NRF_TIMER_FREQ_1MHz); // hmm = only a few options here // Irq setup NVIC_SetPriority(TIMER1_IRQn, 3); // low - don't mess with BLE :) NVIC_ClearPendingIRQ(TIMER1_IRQn); NVIC_EnableIRQ(TIMER1_IRQn); nrf_timer_int_enable(NRF_TIMER1, NRF_TIMER_INT_COMPARE0_MASK ); // Pin change nrf_drv_gpiote_init(); jswrap_nrf_bluetooth_init(); }
/*JSON{ "type":"method", "class": "Serial", "name" : "setup", "description" : ["Setup this Serial port with the given baud rate and options.", "If not specified in options, the default pins are used (usually the lowest numbered pins on the lowest port that supports this peripheral)"], "generate" : "jswrap_serial_setup", "params" : [ [ "baudrate", "JsVar", "The baud rate - the default is 9600"], [ "options", "JsVar", ["An optional structure containing extra information on initialising the serial port.", "```{rx:pin,tx:pin,bytesize:8,parity:null/'none'/'o'/'odd'/'e'/'even',stopbits:1}```", "You can find out which pins to use by looking at [your board's reference page](#boards) and searching for pins with the `UART`/`USART` markers.", "Note that even after changing the RX and TX pins, if you have called setup before then the previous RX and TX pins will still be connected to the Serial port as well - until you set them to something else using digitalWrite" ] ] ] }*/ void jswrap_serial_setup(JsVar *parent, JsVar *baud, JsVar *options) { IOEventFlags device = jsiGetDeviceFromClass(parent); if (!DEVICE_IS_USART(device)) return; JshUSARTInfo inf; jshUSARTInitInfo(&inf); if (!jsvIsUndefined(baud)) { int b = (int)jsvGetInteger(baud); if (b<=100 || b > 10000000) jsExceptionHere(JSET_ERROR, "Invalid baud rate specified"); else inf.baudRate = b; } if (jsvIsObject(options)) { inf.pinRX = jshGetPinFromVarAndUnLock(jsvObjectGetChild(options, "rx", 0)); inf.pinTX = jshGetPinFromVarAndUnLock(jsvObjectGetChild(options, "tx", 0)); JsVar *v; v = jsvObjectGetChild(options, "bytesize", 0); if (jsvIsInt(v)) inf.bytesize = (unsigned char)jsvGetInteger(v); jsvUnLock(v); inf.parity = 0; v = jsvObjectGetChild(options, "parity", 0); if(jsvIsString(v)) { if(jsvIsStringEqual(v, "o") || jsvIsStringEqual(v, "odd")) inf.parity = 1; else if(jsvIsStringEqual(v, "e") || jsvIsStringEqual(v, "even")) inf.parity = 2; } else if(jsvIsInt(v)) { inf.parity = (unsigned char)jsvGetInteger(v); } jsvUnLock(v); if (inf.parity>2) { jsExceptionHere(JSET_ERROR, "Invalid parity %d", inf.parity); return; } v = jsvObjectGetChild(options, "stopbits", 0); if (jsvIsInt(v)) inf.stopbits = (unsigned char)jsvGetInteger(v); jsvUnLock(v); } jshUSARTSetup(device, &inf); // Set baud rate in object, so we can initialise it on startup if (inf.baudRate != DEFAULT_BAUD_RATE) { jsvUnLock(jsvObjectSetChild(parent, USART_BAUDRATE_NAME, jsvNewFromInteger(inf.baudRate))); } else jsvRemoveNamedChild(parent, USART_BAUDRATE_NAME); // Do the same for options if (options) jsvUnLock(jsvSetNamedChild(parent, options, DEVICE_OPTIONS_NAME)); else jsvRemoveNamedChild(parent, DEVICE_OPTIONS_NAME); }
/*JSON{ "type":"method", "class": "Serial", "name" : "setup", "description" : "Setup this Serial port with the given baud rate and options", "generate" : "jswrap_serial_setup", "params" : [ [ "baudrate", "int", "The baud rate - the default is 9600"], [ "options", "JsVar", ["An optional structure containing extra information on initialising the serial port.", "```{rx:pin,tx:pin}```", "Note that even after changing the RX and TX pins, if you have called setup before then the previous RX and TX pins will still be connected to the Serial port as well - until you set them to something else using digitalWrite" ] ] ] }*/ void jswrap_serial_setup(JsVar *parent, JsVarInt baud, JsVar *options) { IOEventFlags device = jsiGetDeviceFromClass(parent); JshUSARTInfo inf; jshUSARTInitInfo(&inf); if (baud>0) inf.baudRate = (int)baud; if (jsvIsObject(options)) { inf.pinRX = jshGetPinFromVarAndUnLock(jsvObjectGetChild(options, "rx", 0)); inf.pinTX = jshGetPinFromVarAndUnLock(jsvObjectGetChild(options, "tx", 0)); inf.bytesize = (unsigned char)jsvGetIntegerAndUnLock(jsvObjectGetChild(options, "bytesize", 0)); JsVar *v; v = jsvObjectGetChild(options, "parity", 0); if(jsvIsNull(v)) { inf.parity = 0; } else if(jsvIsString(v)) { inf.parity = 0xFF; char s[8] = ""; jsvGetString(v, s, sizeof(s) - 1); if(!strcmp(s, "o") || !strcmp(s, "odd")) { inf.parity = 1; } else if(!strcmp(s, "e") || !strcmp(s, "even")) { inf.parity = 2; } } else if(jsvIsInt(v)) { inf.parity = (unsigned char)jsvGetInteger(v); } jsvUnLock(v); v = jsvObjectGetChild(options, "stopbits", 0); inf.stopbits = (unsigned char)jsvGetInteger(v); jsvUnLock(v); } jshUSARTSetup(device, &inf); // Set baud rate in object, so we can initialise it on startup if (baud != DEFAULT_BAUD_RATE) { JsVar *baudVar = jsvNewFromInteger(baud); jsvUnLock(jsvSetNamedChild(parent, baudVar, USART_BAUDRATE_NAME)); jsvUnLock(baudVar); } else jsvRemoveNamedChild(parent, USART_BAUDRATE_NAME); // Do the same for options if (options) jsvUnLock(jsvSetNamedChild(parent, options, DEVICE_OPTIONS_NAME)); else jsvRemoveNamedChild(parent, DEVICE_OPTIONS_NAME); }
/*JSON{ "type" : "method", "class" : "Serial", "name" : "setup", "generate" : "jswrap_serial_setup", "params" : [ ["baudrate","JsVar","The baud rate - the default is 9600"], ["options","JsVar",["An optional structure containing extra information on initialising the serial port.","```{rx:pin,tx:pin,bytesize:8,parity:null/'none'/'o'/'odd'/'e'/'even',stopbits:1,flow:null/undefined/'none'/'xon'}```","You can find out which pins to use by looking at [your board's reference page](#boards) and searching for pins with the `UART`/`USART` markers.","Note that even after changing the RX and TX pins, if you have called setup before then the previous RX and TX pins will still be connected to the Serial port as well - until you set them to something else using digitalWrite"]] ] } Setup this Serial port with the given baud rate and options. If not specified in options, the default pins are used (usually the lowest numbered pins on the lowest port that supports this peripheral) */ void jswrap_serial_setup(JsVar *parent, JsVar *baud, JsVar *options) { IOEventFlags device = jsiGetDeviceFromClass(parent); if (!DEVICE_IS_USART(device)) return; JshUSARTInfo inf; jshUSARTInitInfo(&inf); if (jsvIsUndefined(options)) { options = jsvObjectGetChild(parent, DEVICE_OPTIONS_NAME, 0); } else jsvLockAgain(options); JsVar *parity = 0; JsVar *flow = 0; jsvConfigObject configs[] = { {"rx", JSV_PIN, &inf.pinRX}, {"tx", JSV_PIN, &inf.pinTX}, {"ck", JSV_PIN, &inf.pinCK}, {"bytesize", JSV_INTEGER, &inf.bytesize}, {"stopbits", JSV_INTEGER, &inf.stopbits}, {"parity", JSV_OBJECT /* a variable */, &parity}, {"flow", JSV_OBJECT /* a variable */, &flow}, }; if (!jsvIsUndefined(baud)) { int b = (int)jsvGetInteger(baud); if (b<=100 || b > 10000000) jsExceptionHere(JSET_ERROR, "Invalid baud rate specified"); else inf.baudRate = b; } bool ok = true; if (jsvReadConfigObject(options, configs, sizeof(configs) / sizeof(jsvConfigObject))) { // sort out parity inf.parity = 0; if(jsvIsString(parity)) { if (jsvIsStringEqual(parity, "o") || jsvIsStringEqual(parity, "odd")) inf.parity = 1; else if (jsvIsStringEqual(parity, "e") || jsvIsStringEqual(parity, "even")) inf.parity = 2; } else if (jsvIsInt(parity)) { inf.parity = (unsigned char)jsvGetInteger(parity); } if (inf.parity>2) { jsExceptionHere(JSET_ERROR, "Invalid parity %d", inf.parity); ok = false; } if (ok) { if (jsvIsUndefined(flow) || jsvIsNull(flow) || jsvIsStringEqual(flow, "none")) inf.xOnXOff = false; else if (jsvIsStringEqual(flow, "xon")) inf.xOnXOff = true; else { jsExceptionHere(JSET_ERROR, "Invalid flow control: %q", flow); ok = false; } } #ifdef LINUX if (ok && jsvIsObject(options)) jsvObjectSetChildAndUnLock(parent, "path", jsvObjectGetChild(options, "path", 0)); #endif } jsvUnLock(parity); jsvUnLock(flow); if (!ok) { jsvUnLock(options); return; } jshUSARTSetup(device, &inf); // Set baud rate in object, so we can initialise it on startup jsvObjectSetChildAndUnLock(parent, USART_BAUDRATE_NAME, jsvNewFromInteger(inf.baudRate)); // Do the same for options if (options) jsvObjectSetChildAndUnLock(parent, DEVICE_OPTIONS_NAME, options); else jsvRemoveNamedChild(parent, DEVICE_OPTIONS_NAME); }
/*JSON{ "type" : "init", "generate" : "jswrap_wice_init" }*/ void jswrap_wice_init() { jspCallNamedFunction(execInfo.root, "USB.setConsole", 0, 0); jspEvaluate("USB.setConsole();"); #ifdef WICE_DEBUG WDEBUGLN("USB is console"); #endif /*JsVar *mode = jsvNewFromString("output"); jswrap_io_pinMode(jshGetPinFromString(PIN_DASH7_XTAL_EN), mode); jswrap_io_pinMode(jshGetPinFromString(PIN_DASH7_RST), mode); jsvUnLock(mode);*/ enableDASH(); // Set up the DASH7 USART how we want it JshUSARTInfo inf; jshUSARTInitInfo(&inf); inf.baudRate = 115200; inf.pinRX = jshGetPinFromString(PIN_DASH7_RX); inf.pinTX = jshGetPinFromString(PIN_DASH7_TX); jshUSARTSetup(EV_SERIAL1, &inf); JsVar *serial = jspGetNamedField(execInfo.root, SERIAL1_DASH7, false); jswrap_object_addEventListener(serial, "data", dash7Callback, JSWAT_VOID | (JSWAT_JSVAR<<(JSWAT_BITS))); jsvUnLock(serial); startTime = jshGetSystemTime(); wice_msg_init(&wifiMessage, wifiMessageBuffer, 2048); wice_msg_init(&dash7Message, dash7MessageBuffer, 256); options = jspEvaluate("x = {\"repeat\": \"true\", \"edge\": \"rising\", \"debounce\":\"50\"}"); Pin btn = jshGetPinFromString("B10"); JsVar *btnmode = jsvNewFromString("input"); jswrap_io_pinMode(btn, btnmode); jsvUnLock(btnmode); #ifdef GATEWAY WDEBUGLN("GATEWAY"); blink(PIN_GRN, 50); /// opendrain and digitalwrite 1 will 'opencircuit it' /// http://www.espruino.com/Reference#l__global_pinMode JsVar *opendrain = jsvNewFromString("opendrain"); WDEBUGSTRVAR(opendrain); jswrap_io_pinMode(jshGetPinFromString(PIN_ESP_GPIO_0), opendrain); jswrap_io_pinMode(jshGetPinFromString(PIN_ESP_GPIO_2), opendrain); jshPinOutput(jshGetPinFromString(PIN_ESP_GPIO_0), 1); jshPinOutput(jshGetPinFromString(PIN_ESP_GPIO_2), 1); jsvUnLock(opendrain); /// must opendrain gpio0/2 because of boot modes /// https://github.com/esp8266/esp8266-wiki/wiki/Boot-Process enableWifi(); // Set up the Wifi USART how we want it JshUSARTInfo inf4; jshUSARTInitInfo(&inf4); inf4.baudRate = 115200; inf4.pinRX = jshGetPinFromString(PIN_ESP_RX); inf4.pinTX = jshGetPinFromString(PIN_ESP_TX); jshUSARTSetup(EV_SERIAL4, &inf4); /// make button restart wifi for gateway JsVar *restartWifi_fn = jsvNewNativeFunction(restartWifi, JSWAT_VOID); btnEvent = jswrap_interface_setWatch(restartWifi_fn, btn, options); jsvUnLock(restartWifi_fn); /// configure wifi usart callback JsVar *wifiSerial = jspGetNamedField(execInfo.root, SERIAL4_WIFI, false); jswrap_object_addEventListener(wifiSerial, "data", wifiCallback, JSWAT_VOID | (JSWAT_JSVAR<<(JSWAT_BITS))); jsvUnLock(wifiSerial); doSendSerial(); #else WDEBUGLN("NODE"); blink(PIN_BLUE, 50); /// make button a forced measurement for nodes JsVar *doMeasurementAndWaitForResponse_fn = jsvNewNativeFunction(doMeasurementAndWaitForResponse, JSWAT_VOID); btnEvent = jswrap_interface_setWatch(doMeasurementAndWaitForResponse_fn, btn, options); jsvUnLock(doMeasurementAndWaitForResponse_fn); /// set up main interval callback for nodes JsVar *doMeasurement_fn = jsvNewNativeFunction(doMeasurement, JSWAT_VOID); currentInterval = jswrap_interface_setInterval(doMeasurement_fn, INTERVAL, 0); jsvUnLock(doMeasurement_fn); /// prepare the I2C bus for talking with the Si7050 temp sensor JsVar *s = jspEvaluate("I2C1.setup({scl:B8, sda:B9, bitrate:50000});"); jsvUnLock(s); disableDASH(); jswrap_interface_setDeepSleep(true); //do deep sleep [TODO can we wake on press?] #endif }