Skip to content
This repository was archived by the owner on Oct 1, 2024. It is now read-only.

Add arduino integration. #2

Merged
merged 1 commit into from
Jan 5, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,17 @@
],
"activationEvents": [
"onCommand:extension.verifyArduino",
"onCommand:extension.uploadArduino"
"onCommand:extension.uploadArduino",
"workspaceContains:device.json"
],
"main": "./out/src/extension",
"contributes": {
"snippets": [
{
"language": "cpp",
"path": "./snippets/arduino.json"
}
],
"commands": [
{
"command": "extension.verifyArduino",
Expand Down
16 changes: 16 additions & 0 deletions snippets/arduino.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"loop": {
"prefix": "loop",
"body": [
"void loop()",
"{\n}"
]
},
"setup": {
"prefix": "setup",
"body": [
"void setup()",
"{\n}"
]
}
}
52 changes: 44 additions & 8 deletions src/arduino/arduino.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,50 @@
'use strict';
"use strict";

import vscode = require('vscode');
import settings = require('./settings');
import os = require("os");
import fs = require("fs");
import path = require("path");
import vscode = require("vscode");
import settings = require("./settings");
import * as util from "../common/util";

export const outputChannel = vscode.window.createOutputChannel("Arduino");

export function upload(arduinoConfig: settings.IArduinoSettings) {
return loadProjectConfig()
.then((projectConfig: any) => {
const boardDescriptor = getBoardDescriptor(projectConfig);
const appPath = path.join(vscode.workspace.rootPath, projectConfig.appPath || "app.ino");
outputChannel.show(true);
return util.spawn(arduinoConfig.arduinoPath,
outputChannel,
["--upload", "--board", boardDescriptor, "--port", projectConfig.port, appPath]);
});
}

export function verify(arduinoConfig: settings.IArduinoSettings) {
vscode.window.showInformationMessage(arduinoConfig.arduinoPath);
return 'verify';
return loadProjectConfig()
.then((projectConfig: any) => {
const boardDescriptor = getBoardDescriptor(projectConfig);
const appPath = path.join(vscode.workspace.rootPath, projectConfig.appPath || "app.ino");
outputChannel.show(true);
return util.spawn(arduinoConfig.arduinoPath,
outputChannel,
["--verify", "--board", boardDescriptor, "--port", projectConfig.port, appPath]);
});
}

export function upload(arduinoConfig: settings.IArduinoSettings) {
vscode.window.showInformationMessage(arduinoConfig.arduinoPath);
return 'upload';
function loadProjectConfig(): Thenable<Object> {
return vscode.workspace.findFiles("device.json", null, 1)
.then((files) => {
const configFile = files[0];
return JSON.parse(fs.readFileSync(configFile.fsPath, "utf8"));
});
}

function getBoardDescriptor(projectConfig: any): string {
let boardDescriptor = `${projectConfig.package}:${projectConfig.arch}:${projectConfig.board}`;
if (projectConfig.parameters) {
boardDescriptor = `${boardDescriptor}:${projectConfig.parameters}`;
}
return boardDescriptor;
}
38 changes: 19 additions & 19 deletions src/arduino/settings.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
'use strict';
"use strict";

import * as vscode from 'vscode';
import * as path from 'path';
import * as fsHelper from '../helper/fsHelper';
import * as path from "path";
import * as vscode from "vscode";
import * as util from "../common/util";

export const IS_WINDOWS = /^win/.test(process.platform);

Expand All @@ -11,22 +11,23 @@ export interface IArduinoSettings {
}

export class ArduinoSettings implements IArduinoSettings {
public static getIntance(): ArduinoSettings {
return ArduinoSettings.arduinoSettings;
}

private static arduinoSettings: ArduinoSettings = new ArduinoSettings();

private _arduinoPath: string;

constructor() {
this.initializeSettings();
}

public static getIntance(): ArduinoSettings {
return ArduinoSettings.arduinoSettings;
}

private initializeSettings() {
let arduinoConfig = vscode.workspace.getConfiguration('arduino');
this.arduinoPath = arduinoConfig.get<string>('arduinoPath');
let arduinoConfig = vscode.workspace.getConfiguration("arduino");
this.arduinoPath = arduinoConfig.get<string>("arduinoPath");
}

private _arduinoPath: string;

public get arduinoPath(): string {
return this._arduinoPath;
}
Expand All @@ -37,25 +38,24 @@ export class ArduinoSettings implements IArduinoSettings {
}
try {
this._arduinoPath = getArduinoExecutable(value);
}
catch (ex) {
} catch (ex) {
this._arduinoPath = value;
}
}
}

function getArduinoExecutable(arduinoPath: string): string {
if (arduinoPath === 'arduino' || fsHelper.fileExists(arduinoPath)) {
if (arduinoPath === "arduino" || util.fileExists(arduinoPath)) {
return arduinoPath;
}

if (IS_WINDOWS) {
if (fsHelper.fileExists(path.join(arduinoPath, 'arduino.exe'))) {
return path.join(arduinoPath, 'arduino.exe');
if (util.fileExists(path.join(arduinoPath, "arduino.exe"))) {
return path.join(arduinoPath, "arduino.exe");
}
} else {
if (fsHelper.fileExists(path.join(arduinoPath, 'arduino'))) {
return path.join(arduinoPath, 'arduino');
if (util.fileExists(path.join(arduinoPath, "arduino"))) {
return path.join(arduinoPath, "arduino");
}
}
return arduinoPath;
Expand Down
38 changes: 38 additions & 0 deletions src/common/util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"use strict";

import fs = require("fs");
import path = require("path");
import vscode = require("vscode");
import childProcess = require("child_process");

export function fileExists(filePath: string): boolean {
try {
return fs.statSync(filePath).isFile();
} catch (e) {
return false;
}
}

export function spawn(command: string, outputChannel: vscode.OutputChannel, args: T[] = [], options: any = {}): Thenable<Object> {
return new Promise((resolve, reject) => {
let stdout = "";
let stderr = "";
options.cwd = options.cwd || path.resolve(path.join(__dirname, ".."));
const child = childProcess.spawn(command, args, options);

if (outputChannel) {
child.stdout.on("data", (data) => { outputChannel.append(data.toString()); });
child.stderr.on("data", (data) => { outputChannel.append(data.toString()); });
}

child.on("error", (error) => reject({ error, stderr, stdout }));

child.on("exit", (code) => {
if (code === 0) {
resolve({ code, stdout, stderr });
} else {
reject({ code, stdout, stderr });
}
});
});
}
25 changes: 5 additions & 20 deletions src/extension.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,9 @@
'use strict';
import vscode = require("vscode");
import { outputChannel, upload, verify } from "./arduino/arduino";
import * as settings from "./arduino/settings";

import vscode = require('vscode');
import * as settings from './arduino/settings';
import { verify, upload } from './arduino/arduino';

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {

let arduinoSettings = settings.ArduinoSettings.getIntance();

vscode.commands.registerCommand('extension.verifyArduino', () => {
return verify(arduinoSettings);
});

vscode.commands.registerCommand('extension.uploadArduino', () => {
return upload(arduinoSettings);
});
vscode.commands.registerCommand("extension.verifyArduino", () => verify(arduinoSettings));
vscode.commands.registerCommand("extension.uploadArduino", () => upload(arduinoSettings));
}

// this method is called when your extension is deactivated
export function deactivate() {
}
11 changes: 0 additions & 11 deletions src/helper/fsHelper.ts

This file was deleted.

18 changes: 9 additions & 9 deletions test/extension.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@
// Note: This example test is leveraging the Mocha test framework.
// Please refer to their documentation on https://mochajs.org/ for help.
//
import * as assert from 'assert';
import * as vscode from 'vscode';
import * as assert from "assert";
import * as vscode from "vscode";

// Defines a Mocha test suite to group tests of similar kind together
suite("Arduino Extension Tests", () => {

test('Verify command', (done) => {
vscode.commands.executeCommand('extension.verifyArduino')
.then(result => assert(result === 'verify', 'Failed to verify Arduino app'))
test("Verify command", (done) => {
vscode.commands.executeCommand("extension.verifyArduino")
.then((result) => assert(result === "verify", "Failed to verify Arduino app"))
.then(done, done);
});

test('Upload Arduino command', (done) => {
vscode.commands.executeCommand('extension.uploadArduino')
.then(result => assert(result === 'upload', 'Failed to upload arduino app'))
test("Upload Arduino command", (done) => {
vscode.commands.executeCommand("extension.uploadArduino")
.then((result) => assert(result === "upload", "Failed to upload arduino app"))
.then(done, done);
});
});
});
8 changes: 4 additions & 4 deletions test/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
// to report the results back to the caller. When the tests are finished, return
// a possible error to the callback or null if none.

var testRunner = require('vscode/lib/testrunner');
import testRunner = require("vscode/lib/testrunner");

// You can directly control Mocha options by uncommenting the following lines
// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info
testRunner.configure({
ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.)
useColors: true // colored output from test results
ui: "tdd", // the TDD UI is being used in extension.test.ts (suite, test, etc.)
useColors: true, // colored output from test results
});

module.exports = testRunner;
module.exports = testRunner;
10 changes: 9 additions & 1 deletion tslint.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
{
"extends": "tslint:recommended",
"rules": {
"variable-name": [
true,
"allow-leading-underscore"
],
"no-unused-expression": true,
"no-duplicate-variable": true,
"curly": true,
"class-name": true,
"semicolon": [
"always"
],
"triple-equals": true
"triple-equals": true,
"max-line-length": [
150
]
}
}