alpha server and client for st flash

This commit is contained in:
MaximZaitsev
2016-07-12 13:25:05 +03:00
parent 72e4b532f2
commit d17c8922b8
29 changed files with 3653 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
.idea/workspace.xml
.idea/uiDesigner.xml
out
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>
@@ -0,0 +1,3 @@
<component name="CopyrightManager">
<settings default="" />
</component>
@@ -0,0 +1,12 @@
<component name="libraryTable">
<library name="KotlinJavaRuntime">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/kotlin-runtime.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/kotlin-reflect.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/lib/kotlin-runtime-sources.jar!/" />
</SOURCES>
</library>
</component>
@@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="netty-all-4.1.2.Final-sources">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/netty-all-4.1.2.Final.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/lib/netty-all-4.1.2.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="protobuf-java-3.0.0-beta-3">
<CLASSES>
<root url="jar://$USER_HOME$/Downloads/protobuf-java-3.0.0-beta-3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
+26
View File
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="mavenHome" value="Bundled (Maven 3)" />
</MavenGeneralSettings>
</option>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/stFlashClient.iml" filepath="$PROJECT_DIR$/stFlashClient.iml" />
</modules>
</component>
</project>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+29
View File
@@ -0,0 +1,29 @@
import com.google.protobuf.ByteString
import io.netty.buffer.Unpooled
import io.netty.handler.codec.http.*
import io.netty.util.CharsetUtil
import proto.Carkot
import java.util.*
/**
* Created by user on 7/11/16.
*/
fun main(args: Array<String>) {
//2 argm path to bin and server ip
//1 option - 0x000...
val host = "127.0.0.1"
val port = 8888
val base = "0x08000000"
// val client = client.Client
val bytesBinTest = Carkot.Upload.newBuilder().setData(ByteString.copyFrom(ByteArray(5, {x->0}))).setBase(base).build().toByteArray()
val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/loadBin", Unpooled.copiedBuffer(bytesBinTest));
request.headers().set(HttpHeaderNames.HOST, host)
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes())
request.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8")
client.Client.sendRequest(request, host, port)
println(client.ClientHandler.requestResult.code)
}
@@ -0,0 +1,37 @@
package client
import io.netty.bootstrap.Bootstrap
import io.netty.channel.ChannelFutureListener
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.http.HttpRequest
import io.netty.util.AttributeKey
import java.net.ConnectException
/**
* Created by user on 7/8/16.
*/
object Client {
fun sendRequest(request: HttpRequest, host: String, port: Int):Int {
val group = NioEventLoopGroup()
try {
val bootstrap: Bootstrap = Bootstrap()
bootstrap.group(group).channel(NioSocketChannel().javaClass).handler(ClientInitializer())
val channelFuture = bootstrap.connect(host, port).sync()
val channel = channelFuture.channel()
channel.writeAndFlush(request)
channel.closeFuture().sync()
} catch (e: InterruptedException) {
println("interrupted before request done")
return 2
} catch (e: ConnectException) {
println("connection error to $host:$port")
return 1
} finally {
group.shutdownGracefully()
}
return ClientHandler.requestResult.code
}
}
@@ -0,0 +1,54 @@
package client
import com.google.protobuf.InvalidProtocolBufferException
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.HttpContent
import proto.Carkot
import java.util.*
/**
* Created by user on 7/8/16.
*/
class ClientHandler : SimpleChannelInboundHandler<Any> {
object requestResult {
var code: Int = -1
}
constructor()
var contentBytes: ByteArray = ByteArray(0);
override fun channelReadComplete(ctx: ChannelHandlerContext) {
var resultCode = 0
try {
val uploadResult: Carkot.UploadResult = Carkot.UploadResult.parseFrom(contentBytes)
resultCode = uploadResult.resultCode
} catch (e: InvalidProtocolBufferException) {
e.printStackTrace()
resultCode = 2
}
synchronized(requestResult, {
requestResult.code = resultCode
})
ctx.close()
}
override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) {
if (msg is HttpContent) {
val contentsBytes = msg.content();
contentBytes = ByteArray(contentsBytes.capacity())
contentsBytes.readBytes(contentBytes)
}
}
override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable) {
cause.printStackTrace()
if (ctx != null) {
ctx.close()
}
}
}
@@ -0,0 +1,19 @@
package client
import io.netty.channel.ChannelInitializer
import io.netty.channel.socket.SocketChannel
import io.netty.handler.codec.http.HttpClientCodec
/**
* Created by user on 7/8/16.
*/
class ClientInitializer : ChannelInitializer<SocketChannel> {
constructor()
override fun initChannel(ch: SocketChannel) {
val p = ch.pipeline()
p.addLast(HttpClientCodec())
p.addLast(ClientHandler())
}
}
File diff suppressed because it is too large Load Diff
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="library" name="netty-all-4.1.2.Final-sources" level="project" />
<orderEntry type="library" name="protobuf-java-3.0.0-beta-3" level="project" />
</component>
</module>
+4
View File
@@ -0,0 +1,4 @@
.idea/workspace.xml
.idea/uiDesigner.xml
protobufjs
out
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/stFlashServer.iml" filepath="$PROJECT_DIR$/.idea/stFlashServer.iml" />
</modules>
</component>
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Binary file not shown.
+48
View File
@@ -0,0 +1,48 @@
/**
* Created by user on 7/11/16.
*/
const fs = require("fs");
const protoBuf = require("./protobufjs");
const builder = protoBuf.loadProtoFile("./proto/carkot.proto");//todo перенести как аргумент при запуске.
const protoConstructor = builder.build("carkot");
var commandPrefix = "./data/macosx-x86_64/st-flash write";
var binFilePath = "./f.bin";
function loadBin(httpContent, response) {
var uploadClass = protoConstructor.Upload;
var uploadObject = uploadClass.decode(httpContent);
fs.writeFile(binFilePath, uploadObject.data.buffer, "binary", function (error) {
var uploadResultClass = protoConstructor.UploadResult;
var code = 0;
if (error) {
code = 2;
} else {
code = 0;
console.log(commandPrefix + " " + binFilePath + " " + uploadObject.base);
}
var resultObject = new uploadResultClass({
"stdOut": "",
"resultCode": code,
"stdErr": ""
});
var byteBuffer = resultObject.encode();
var byteArray = [];
for (var i = 0; i < byteBuffer.limit; i++) {
byteArray.push(byteBuffer.buffer[i]);
}
response.writeHead(200, {"Content-Type": "text/plain", "Content-length": byteArray.length});
response.write(new Buffer(byteArray));
response.end();
});
}
function other(request, response) {
console.log("other");
response.writeHead(200, {"Content-Type": "text/plain"});
response.end();
}
exports.loadBin = loadBin;
exports.other = other;
+71
View File
@@ -0,0 +1,71 @@
/**
* Created by user on 7/11/16.
*/
var server = require("./server.js");
var router = require("./router.js");
var handlers = require("./handlers.js");
var handle = {};
handle["/"] = handlers.other;
handle["/loadBin"] = handlers.loadBin;
handle["/other"] = handlers.other;
// UploadR = upRes.UploadResult;
// var res = new UploadR({"error": "test error!"});
// console.log(res.encode());
//
//
// var testBack = UploadR.decode(res.encode());
// console.log(testBack);
// console.log(process.argv);
server.start(router.route, handle);
// var http = require("http");
//
// var global_closure = null;
//
// // nodejs/javascript closures
// http.createServer(function(request, response) {
// // console.log("test");
// global_closure && global_closure();
//
// // console.log(request);
// // response.writeHead(200, {"Content-Type": "text/plain"});
// // response.write("Hello World");
//
// function closure() {
// console.log(request.toString());
// }
// global_closure = closure;
//
// //writeToJournal().getDBData().processDBData().sendResponse().commitJournal();
// function writeToJournal() {
// console.log(request);
// getDBData(processDBData);
// getDBData(function() {});
// }
//
// function getDBData(callback) {
// db.getData({ id : request.query['id'] }, onDbDataReady);
// var i = 0;
//
// function onDbDataReady(err, someDBData) {
// if (err) {
// return response.error();
// }
// console.log(i);
// callback(someDBData);
// }
// }
//
// function processDBData(dbData) {
// function sendResponse() {
//
// }
// }
//
// response.end();
// }).listen(8888);
+39
View File
@@ -0,0 +1,39 @@
syntax = "proto3";
package carkot;
option java_package = "proto";
option java_outer_classname = "Carkot";
message Upload {
message Method {
enum TYPE {
DFU = 0;
STLINK = 1;
}
// Type of upload method.
TYPE type = 1;
// Upload port.
string port = 2;
// Device address, smth like 8087:0ABA.
string device = 3;
// Additional programmator-specific arguments.
repeated string arguments = 4;
}
// Firmware data.
bytes data = 1;
// Firmware load address (string, to avoid 64-bit woes).
string base = 2;
// Method of firmware upload.
Method method = 3;
}
message UploadResult {
string stdOut = 1;
string stdErr = 2;
int32 resultCode = 3;
}
message LogMessage {
string source = 1;
bytes message = 2;
}
+15
View File
@@ -0,0 +1,15 @@
/**
* Created by user on 7/11/16.
*/
function route(handle, pathname, httpContent, response) {
if (typeof handle[pathname] === 'function') {
handle[pathname](httpContent, response);
} else {
console.log("No request handler found for " + pathname);
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not found");
response.end();
}
}
exports.route = route;
+25
View File
@@ -0,0 +1,25 @@
/**
* Created by user on 7/11/16.
*/
var http = require("http");
var url = require("url");
function start(route, handlers) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
var httpContent = [];
request.on("data", function (datas) {
var strDatas = datas.toString();
for (var i = 0; i < datas.length; ++i) {
httpContent.push(strDatas.charCodeAt(i));
}
});
request.on("end", function () {
route(handlers, pathname, httpContent, response);
});
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start = start;