LiliyGo-HiGrow-Sensor/build/fs/api_uart.js

166 lines
5.6 KiB
JavaScript

// UART API. Source C API is defined at:
// [mgos_uart.h](https://github.com/cesanta/mongoose-os/blob/master/fw/src/mgos_uart.h)
let UART = {
_free: ffi('void free(void *)'),
_cdef: ffi('void *mgos_uart_config_get_default(int)'),
_cbp: ffi('void mgos_uart_config_set_basic_params(void *, int, int, int, int)'),
_crx: ffi('void mgos_uart_config_set_rx_params(void *, int, int, int)'),
_ctx: ffi('void mgos_uart_config_set_tx_params(void *, int, int)'),
_cfg: ffi('int mgos_uart_configure(int, void *)'),
_wr: ffi('int mgos_uart_write(int, char *, int)'),
_rd: ffi('int mgos_uart_read(int, void *, int)'),
// ## **`UART.setConfig(uartNo, param)`**
// Set UART config. `param` is an
// object with the following optional fields:
//
// - `baudRate`: baud rate, integer, default: 115200;
// - `numDataBits`: Number of data bits, default: 8;
// - `parity`: Parity: 0 - none, 1 - even, 2 - odd; default: none;
// - `numStopBits`: Number of stop bits: 1 - 1 bit, 2 - 2 bits, 3 - 1.5; default: 1;
// - `rxBufSize`: size of the Rx buffer, integer, default: 256;
// - `rxFlowControl`: whether Rx flow control (RTS pin) is enabled, boolean,
// default: false;
// - `rxLingerMicros`: how many microseconds to linger after Rx fifo
// is empty, in case more data arrives. Integer, default: 15;
// - `txBufSize`: size of the Tx buffer, integer, default: 256;
// - `txFlowControl`: whether Tx flow control (CTS pin) is enabled, boolean,
// default: false;
//
// Other than that, there are architecture-dependent settings, grouped in
// the objects named with the architecture name: "esp32", "esp8266", etc.
//
// Settings for esp32:
//
// ```
// esp32: {
// /*
// * GPIO pin numbers, default values depend on UART.
// *
// * UART 0: Rx: 3, Tx: 1, CTS: 19, RTS: 22
// * UART 1: Rx: 13, Tx: 14, CTS: 15, RTS: 16
// * UART 2: Rx: 17, Tx: 25, CTS: 26, RTS: 27
// */
// gpio: {
// rx: number,
// tx: number,
// cts: number,
// rts: number,
// },
//
// /* Hardware FIFO tweaks */
// fifo: {
// /*
// * A number of bytes in the hardware Rx fifo, should be between 1 and 127.
// * How full hardware Rx fifo should be before "rx fifo full" interrupt is
// * fired.
// */
// rxFullThresh: number,
//
// /*
// * A number of bytes in the hardware Rx fifo, should be more than
// * rx_fifo_full_thresh.
// *
// * How full hardware Rx fifo should be before CTS is deasserted, telling
// * the other side to stop sending data.
// */
// rxFcThresh: number,
//
// /*
// * Time in uart bit intervals when "rx fifo full" interrupt fires even if
// * it's not full enough
// */
// rxAlarm: number,
//
// /*
// * A number of bytes in the hardware Tx fifo, should be between 1 and 127.
// * When the number of bytes in Tx buffer becomes less than
// * tx_fifo_empty_thresh, "tx fifo empty" interrupt fires.
// */
// txEmptyThresh: number,
// },
// }
// ```
setConfig: function(uartNo, param) {
let cfg = this._cdef(uartNo);
this._cbp(cfg, param.baudRate || 115200,
param.numDataBits || 8,
param.parity || 0,
param.numStopBits || 1);
this._crx(
cfg,
param.rxBufSize || 256,
param.rxFlowControl || false,
param.rxLingerMicros || 15
);
this._ctx(
cfg,
param.txBufSize || 256,
param.txFlowControl || false
);
// Apply arch-specific config
if (this._arch !== undefined) {
this._arch.scfg(uartNo, cfg, param);
}
let res = this._cfg(uartNo, cfg);
this._free(cfg);
cfg = null;
return res;
},
// ## **`UART.setDispatcher(uartNo, callback, userdata)`**
// Set UART dispatcher
// callback which gets invoked when there is a new data in the input buffer
// or when the space becomes available on the output buffer.
//
// Callback receives the following arguments: `(uartNo, userdata)`.
setDispatcher: ffi('void mgos_uart_set_dispatcher(int, void(*)(int, userdata), userdata)'),
// ## **`UART.write(uartNo, data)`**
// Write data to the buffer. Returns number of bytes written.
//
// Example usage: `UART.write(1, "foobar")`, in this case, 6 bytes will be written.
write: function(uartNo, data) {
this._wr(uartNo, data, data.length);
},
// ## **`UART.writeAvail(uartNo)`**
// Return amount of space available in the output buffer.
writeAvail: ffi('int mgos_uart_write_avail(int)'),
// ## **`UART.read(uartNo)`**
// It never blocks, and returns a string containing
// read data (which will be empty if there's no data available).
read: function(uartNo) {
let n = 0; let res = ''; let buf = 'xxxxxxxxxx'; // Should be > 5
while ((n = this._rd(uartNo, buf, buf.length)) > 0) {
res += buf.slice(0, n);
}
return res;
},
// ## **`UART.readAvail(uartNo)`**
// Return amount of data available in the input buffer.
readAvail: ffi('int mgos_uart_read_avail(int)'),
// ## **`UART.setRxEnabled(uartNo)`**
// Set whether Rx is enabled.
setRxEnabled: ffi('void mgos_uart_set_rx_enabled(int, int)'),
// ## **`UART.isRxEnabled(uartNo)`**
// Returns whether Rx is enabled.
isRxEnabled: ffi('int mgos_uart_is_rx_enabled(int)'),
// ## **`UART.flush(uartNo)`**
// Flush the UART output buffer, wait for the data to be sent.
flush: ffi('void mgos_uart_flush(int)'),
};
// Load arch-specific API
load('api_arch_uart.js');