mirror of
https://github.com/sensebox/blockly-app
synced 2025-04-19 16:07:33 +02:00
fix integration with MCU OTA firmware
This commit is contained in:
parent
28b30b37e3
commit
3faea789cb
4 changed files with 38 additions and 20 deletions
|
@ -8,7 +8,8 @@
|
||||||
"start": "ionic-app-scripts serve",
|
"start": "ionic-app-scripts serve",
|
||||||
"clean": "ionic-app-scripts clean",
|
"clean": "ionic-app-scripts clean",
|
||||||
"build": "ionic-app-scripts build",
|
"build": "ionic-app-scripts build",
|
||||||
"android:deploy": "ionic cordova build android; adb install -r platforms/android/app/build/outputs/apk/debug/app-debug.apk",
|
"android:build": "ionic cordova build android",
|
||||||
|
"android:deploy": "adb install -r platforms/android/app/build/outputs/apk/debug/app-debug.apk",
|
||||||
"android:start": "adb shell am force-stop io.ionic.starter; adb shell am start -n io.ionic.starter/io.ionic.starter.MainActivity; sleep 1; adb logcat | grep -F \"`adb shell ps | grep io.ionic.starter | cut -c15-18`\"",
|
"android:start": "adb shell am force-stop io.ionic.starter; adb shell am start -n io.ionic.starter/io.ionic.starter.MainActivity; sleep 1; adb logcat | grep -F \"`adb shell ps | grep io.ionic.starter | cut -c15-18`\"",
|
||||||
"lint": "ionic-app-scripts lint"
|
"lint": "ionic-app-scripts lint"
|
||||||
},
|
},
|
||||||
|
|
|
@ -29,7 +29,7 @@ export class OtaWizardPage implements OnInit, OnDestroy {
|
||||||
sketch = ''
|
sketch = ''
|
||||||
filterSsids = true
|
filterSsids = true
|
||||||
availableSenseboxes: string[] = [] // list of SSIDs
|
availableSenseboxes: string[] = [] // list of SSIDs
|
||||||
compiledSketch = undefined
|
compiledSketch: ArrayBuffer = undefined
|
||||||
errorMsg = ''
|
errorMsg = ''
|
||||||
|
|
||||||
state: OtaState = {
|
state: OtaState = {
|
||||||
|
@ -127,10 +127,13 @@ export class OtaWizardPage implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleCompilation () {
|
private handleCompilation () {
|
||||||
|
// skip compilation slide if already compiled
|
||||||
this.slides.lockSwipeToNext(!this.compiledSketch)
|
this.slides.lockSwipeToNext(!this.compiledSketch)
|
||||||
|
if (this.compiledSketch)
|
||||||
|
return this.slides.slideNext(0)
|
||||||
|
|
||||||
// need to go online for compilation. compilation is retriggered via this.onlineSub
|
// need to go online for compilation. compilation is retriggered via this.onlineSub
|
||||||
if (!this.compiledSketch && !this.state.isOnline) {
|
if (!this.state.isOnline) {
|
||||||
switch (this.otaWifi.strategy) {
|
switch (this.otaWifi.strategy) {
|
||||||
case WifiStrategy.Automatic:
|
case WifiStrategy.Automatic:
|
||||||
// TODO: auto connect to previous network, if available
|
// TODO: auto connect to previous network, if available
|
||||||
|
@ -138,6 +141,8 @@ export class OtaWizardPage implements OnInit, OnDestroy {
|
||||||
this.state.compilation = 'go-online'
|
this.state.compilation = 'go-online'
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.compileSketch()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +187,12 @@ export class OtaWizardPage implements OnInit, OnDestroy {
|
||||||
this.slides.lockSwipeToNext(false)
|
this.slides.lockSwipeToNext(false)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.state.compilation = 'error'
|
this.state.compilation = 'error'
|
||||||
this.errorMsg = err.message
|
this.errorMsg = !err.message ? err : err.message
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
.replace(/\n/g, '<br/>')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { timeout } from 'rxjs/operators'
|
||||||
|
|
||||||
const URL = "https://compiler.sensebox.de"
|
// const URL = "https://compiler.sensebox.de"
|
||||||
|
const URL = "http://compiler.snsbx.nroo.de"
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class CompilerProvider {
|
export class CompilerProvider {
|
||||||
|
@ -10,23 +12,28 @@ export class CompilerProvider {
|
||||||
console.log('Hello CompilerProvider Provider');
|
console.log('Hello CompilerProvider Provider');
|
||||||
}
|
}
|
||||||
|
|
||||||
async callcompiler(sketch : string): Promise<any> {
|
async callcompiler(sketch : string): Promise<ArrayBuffer> {
|
||||||
const headers = new HttpHeaders({'Content-Type': 'application/json'} );
|
const headers = new HttpHeaders({'Content-Type': 'application/json'} );
|
||||||
const data = { board: 'sensebox-mcu', sketch }
|
const data = { board: 'sensebox-mcu', sketch }
|
||||||
|
|
||||||
// send compilation request, returning a job ID
|
// send compilation request, returning a job ID
|
||||||
return this.http.post(`${URL}/compile`, data, { headers }).toPromise()
|
return this.http.post(`${URL}/compile`, data, { headers })
|
||||||
|
.pipe(timeout(4000))
|
||||||
|
.toPromise()
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
let msg = ''
|
let msg = 'unable to contact web compiler. are you online?'
|
||||||
try { msg = JSON.parse(err.error.message).process } catch (err) {}
|
try {
|
||||||
throw new Error(msg || err)
|
// attempt to extract the compilation error message and clean it up
|
||||||
|
msg = JSON.parse(err.error.message).process
|
||||||
|
msg = `compilation error: ${msg.substr(msg.indexOf(' ') + 14)}`
|
||||||
|
msg = msg.substr(0, msg.indexOf('^'))
|
||||||
|
} catch (err) {}
|
||||||
|
throw Error(msg)
|
||||||
})
|
})
|
||||||
.then((response:any) =>{
|
|
||||||
// download the resulting sketch binary
|
// download the resulting sketch binary
|
||||||
return this.http.get(`${URL}/download?id=${response.data.id}&board=sensebox-mcu`, {
|
.then((response: any) => {
|
||||||
responseType: 'text',
|
const url = `${URL}/download?id=${response.data.id}&board=sensebox-mcu`
|
||||||
}).toPromise()
|
return this.http.get(url, { responseType: 'arraybuffer' }).toPromise()
|
||||||
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,12 +62,12 @@ export class OtaWifiProvider {
|
||||||
: WifiWizard2.connect(ssid, true)
|
: WifiWizard2.connect(ssid, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
async uploadFirmware (binary: string): Promise<any> {
|
async uploadFirmware (binary: ArrayBuffer): Promise<any> {
|
||||||
// TODO: send checksum?
|
// TODO: send checksum?
|
||||||
return this.http.post(`${SENSEBOX_API}/flash`, binary, {
|
return this.http.post(`${SENSEBOX_API}/sketch`, binary, {
|
||||||
responseType: 'text',
|
responseType: 'text',
|
||||||
})
|
})
|
||||||
.pipe(timeout(2500), catchError(err => {
|
.pipe(timeout(5000), catchError(err => {
|
||||||
throw new Error('senseBox not found. Is it running in OTA mode?')
|
throw new Error('senseBox not found. Is it running in OTA mode?')
|
||||||
}))
|
}))
|
||||||
.toPromise()
|
.toPromise()
|
||||||
|
|
Loading…
Add table
Reference in a new issue