166 lines
5.6 KiB
JavaScript
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');
|