# node-jlink

A NodeJS alternative to nrfjprog

This is a NodeJS driver for the Segger JLink command line tool, `jlinkexe`, 
including conveniences found in nrfjprog 
(Nordic's commandline tool for the NRF series of micro-controllers).

Calls the jlinkexe cli tool for maximum compatibility. 
Tested on Windows, MacOS and Raspberry Pi.

## Getting Started

First, install the [nRF Command line Tools](https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Command-Line-Tools),
including the jlink cli, `Jlinkexe`
   
Then install `node-jlink`

```shell
npm install -g @connectedyard/node-jlink
```

Test you installation

```shell
node-jlink -t
```

### Command line Usage

`Usage: node-jlink [options] <commands>`

All args after options will be sent to the jlink exe as commands, followed by `exit`

## Module Usage

All commands return promises.

```
var jlink = require("node-jlink");
jlink.reset();              // resets the device attached to the jlink programmer

var readMyMemCommands = ["h", "mem 0x10001004, 0x20"];
jlink.executeCommands( readMyMemCommands )
    .then( function( results ){
        console.log( result.stdout );
    });
```

## nrfjprog Commands

The following nrfjprog commands are implemented as follows.

These commands return a Promise, resolve( true ) on success, reject( error ) on failure.

```
jlink.reset();                      // nrfjprog --reset
jlink.pinReset();                   // nrfjprog --pinreset
jlink.eraseAll();                   // nrfjprog --eraseAll
jlink.program( firmwareFilePath );  // nrfjprog --program <firmwareFilePath>
```

### Reading Flash Memory

Flash memory is returned in a buffer.

```
jlink.readmem( address, numBytes)  // nrfjprog --memrd <address> --w 32 --n <numBytes>
.then( function( buffer ){
})
.catch( function( error ){
});
```

## Executing Arbitrary JLinkEXE Scripts

Arbitrary JLinkEXE scripts can be executed by passing an array of commands into `jlink.executeCommands( commands )`. An Promise is returned, and on resolve the Result be as follows:

```
{
	 stdout: String, captured from jlinkexe stdout stream, or empty string
	 stderr: String, captured from jlinkexe stdout stream, or empty string
	 code: Integer, captured from jlinkexe exit code, or 0
	 error: Error, from jlinkexe or internal error, or null
}
```

A complete list of JLinkEXE commands are available at https://www.segger.com/admin/uploads/productDocs/UM08001_JLink.pdf

### JLinkEXE

By default, the JLinkEXE command is expected to be found on the path as `jlinkexe`. 
The default commandline options to jlinkexe are `"-device nrf51822 -if swd -speed 4000"`.
These options will be sent with every command unless `options` are passed to `executeCommands`

To change these values, set `jlink.JLinkExe` and `jlink.JLinkExeOptions`.

To test your executable path, call `jlink.isJLinkEXEInstalled()` or run 

```shell
node-jlink -t
```
