Commit 93d7974b authored by Isabella Skořepová's avatar Isabella Skořepová
Browse files

Create monitor command

parent 2fbfb9f7
......@@ -2,16 +2,13 @@ BASE_URL := http://git.ok1kvk.cz/apps/
QMAKE := qmake-qt5
CMAKE := cmake
build: build-dserial-cli/Makefile dserial-protocol/Readme.md build-dserial-server/Makefile
build: dserial-protocol/Readme.md build-dserial-server/Makefile
cd build-dserial-server && make qmake && make
cd build-dserial-cli && make
rm -rf build-dserial-cli && mkdir -p build-dserial-cli && cd build-dserial-cli && $(CMAKE) ../dserial-cli/ && make
build-dserial-server/Makefile: dserial-server/Readme.md
mkdir -p build-dserial-server && cd build-dserial-server && $(QMAKE) ../dserial-server/dserial-server.pro
build-dserial-cli/Makefile: dserial-cli/Readme.md
mkdir -p build-dserial-cli && cd build-dserial-cli && $(CMAKE) ../dserial-cli/
install: dserial-cli/Readme.md dserial-protocol/Readme.md dserial-server/Readme.md
cd build-dserial-cli && make install
cd build-dserial-server && make install
......@@ -22,5 +19,8 @@ push:
git subtree push --prefix=dserial-protocol/ protocol master
git subtree push --prefix=dserial-server/ server master
run: build
build-dserial-cli/dserial interactive
%/Readme.md:
git clone $(BASE_URL)%.git
......@@ -46,6 +46,7 @@ public class HelpCommand : Object, Command
stdout.printf("unbind\t\t\t\tRemoves binding (interactive only)\n");
stdout.printf("autowrite on|off\t\tSet whether every line should start with write\n");
stdout.printf("exit\t\t\t\tExits interactive session (interactive only)\n");
stdout.printf("monitor\t\t\t\tShows data written and red simultaneously\n");
}else if(args[0] == "commands") {
for( int i = 0; i < state.command_list.length; i++) {
stdout.printf("%s\n", state.command_list.index(i).name());
......
......@@ -75,7 +75,7 @@ public class InteractiveCommand : Object, Command
state.interactive = true;
stdout.printf("dserial: Serial communication program\n");
stdout.printf("License: GPL3+\n");
stdout.printf("Version: 0.4b\n");
stdout.printf("Version: 0.5\n");
stdout.printf("Write help for help\n");
Readline.History.read(Environment.get_variable("HOME")+"/.dserial-history");
Readline.attempted_completion_function = readline_completion;
......
......@@ -22,7 +22,12 @@
public class ReadCommand : Object, Command
{
private static MainLoop loop;
public int execute(string[] other_args, ApplicationState state)
public virtual int execute(string[] other_args, ApplicationState state)
{
return do_read(other_args, state, false);
}
public int do_read(string[] other_args, ApplicationState state, bool monitor)
{
loop = new MainLoop();
Serial.SerialClient p;
......@@ -84,6 +89,11 @@ public class ReadCommand : Object, Command
uint counter = 0;
uint8[print_length] tmpbuf = new uint8[print_length];
uint pccounter = 0;
PosColor[print_length] pcbuf = new PosColor[print_length];
for(int i = 0; i < print_length; i++) pcbuf[i] = new PosColor();
pcbuf[0].pos = 0;
pcbuf[0].color = 0;
p.open();
p.closing.connect(() => {
......@@ -93,26 +103,71 @@ public class ReadCommand : Object, Command
ulong connection = p.data_recieved.connect((array) => {
for(int i = 0; i < array.length; i++) {
// For each char
uint8[1] onebuf = new uint8[1];
// Print it using first printer
onebuf[0] = array[i];
printers[0].a(onebuf);
printers[0].a(array[i]);
stdout.flush();
// Save it
if(counter == 0 || pcbuf[pccounter-1].color != 0) {
pcbuf[pccounter].pos = counter;
pcbuf[pccounter++].color = 0; // RESET COLOR
}
tmpbuf[counter++] = array[i];
if(counter >= print_length) {
for(int x = 1; x < printers.length; x++) {
stdout.printf(" ");
printers[x].a(tmpbuf);
pccounter = 0;
for(int pos = 0; pos < tmpbuf.length; pos++) {
if(pcbuf[pccounter].pos == pos) {
stdout.printf("\x1b[%im", pcbuf[pccounter++].color);
}
printers[x].a(tmpbuf[pos]);
}
}
if(display_fields != "s") stdout.printf("\n");
counter = 0;
pccounter = 0;
}
}
});
ulong connection2 = 0;
if(monitor) {
connection2 = p.data_sent.connect((array) => {
stdout.printf("\x1b[32m");
for(int i = 0; i < array.length; i++) {
// For each char
// Print it using first printer
printers[0].a(array[i]);
stdout.flush();
// Save it
if(counter == 0 || pcbuf[pccounter-1].color != 32) {
pcbuf[pccounter].pos = counter;
pcbuf[pccounter++].color = 32; // GREEN COLOR
}
tmpbuf[counter++] = array[i];
if(counter >= print_length) {
for(int x = 1; x < printers.length; x++) {
stdout.printf(" ");
pccounter = 0;
for(int pos = 0; pos < tmpbuf.length; pos++) {
if(pcbuf[pccounter].pos == pos) {
stdout.printf("\x1b[%im", pcbuf[pccounter++].color);
}
printers[x].a(tmpbuf[pos]);
}
}
if(display_fields != "s") stdout.printf("\n");
counter = 0;
}
}
stdout.printf("\x1b[0m");
});
}
var action = Posix.sigaction_t();
action.sa_handler = (a)=> {
loop.quit();
......@@ -120,6 +175,7 @@ public class ReadCommand : Object, Command
Posix.sigaction(Posix.SIGINT,action,null);
loop.run();
p.disconnect(connection);
if(monitor) p.disconnect(connection2);
stdout.printf("\n");
var dflact = Posix.sigaction_t();
Posix.sigaction(Posix.SIGINT,dflact,null);
......@@ -127,10 +183,15 @@ public class ReadCommand : Object, Command
return 0;
}
private delegate void FormatPrintArray(uint8[] array);
private delegate void FormatPrintChar(uint8 c);
private class PosColor {
public uint pos;
public int color;
}
private class FormatWrapper {
public FormatPrintArray a;
public FormatPrintChar a;
public int width_per_char;
}
......@@ -141,67 +202,55 @@ public class ReadCommand : Object, Command
var fw = new FormatWrapper();
if(c == "X".get_char(0)) {
fw.a = (a) => {
for(int x = 0; x < a.length; x++) {
if(a[x]<16) stdout.printf("0");
stdout.printf("%X ", a[x]);
}
if(a<16) stdout.printf("0");
stdout.printf("%X ", a);
};
fw.width_per_char = 3;
} else if(c == "x".get_char(0)) {
fw.a = (a) => {
for(int x = 0; x < a.length; x++) {
if(a[x]<16) stdout.printf("0");
stdout.printf("%x ", a[x]);
}
if(a<16) stdout.printf("0");
stdout.printf("%x ", a);
};
fw.width_per_char = 3;
} else if(c == "d".get_char(0) ||
c == "i".get_char(0) ) {
fw.a = (a) => {
for(int x = 0; x < a.length; x++) {
stdout.printf("%d ", a[x]);
if(a[x] < 10) stdout.printf(" ");
if(a[x] < 100) stdout.printf(" ");
}
stdout.printf("%d ", a);
if(a < 10) stdout.printf(" ");
if(a < 100) stdout.printf(" ");
};
fw.width_per_char = 4;
} else if(c == "c".get_char(0)) {
fw.a = (a) => {
for(int x = 0; x < a.length; x++) {
if(a[x]>=32&&a[x]<127){
stdout.printf("%c", a[x]);
} else {
stdout.printf(".");
}
}
if(a>=32&&a<127){
stdout.printf("%c", a);
} else {
stdout.printf(".");
}
};
fw.width_per_char = 1;
} else if(c == "s".get_char(0)) {
fw.a = (a) => {
for(int x = 0; x < a.length; x++) {
if(a[x]>=32&&a[x]<127){
stdout.printf("%c", a[x]);
} else {
if(a[x] == 10) { // \n (LF)
stdout.printf("\n");
} else if(a[x] == 13) { // \r (CR)
} else if(a[x] == 9) { // \t (TAB)
stdout.printf("\t");
} else {
stdout.printf(".");
}
}
}
if(a>=32&&a<127){
stdout.printf("%c", a);
} else {
if(a == 10) { // \n (LF)
stdout.printf("\n");
} else if(a == 13) { // \r (CR)
} else if(a == 9) { // \t (TAB)
stdout.printf("\t");
} else {
stdout.printf(".");
}
}
};
fw.width_per_char = 1;
} else if(c == "b".get_char(0)) {
fw.a = (a) => {
for(int x = 0; x < a.length; x++) {
for(int i = 0; i < 8; i++){
stdout.printf("%d",(a[x]&1<<i)!=0?1:0);
}
stdout.printf(" ");
}
for(int i = 0; i < 8; i++){
stdout.printf("%d",(a&1<<i)!=0?1:0);
}
stdout.printf(" ");
};
fw.width_per_char = 9;
} else {
......@@ -210,7 +259,7 @@ public class ReadCommand : Object, Command
return fw;
}
public string name()
public virtual string name()
{
return "read";
}
......@@ -223,7 +272,7 @@ public class ReadCommand : Object, Command
return {};
}
public void help(string[] args)
public virtual void help(string[] args)
{
stdout.printf("Synopsis: read <port> [format-string] [format-length]\n");
stdout.printf("Reads from port\n");
......@@ -239,3 +288,23 @@ public class ReadCommand : Object, Command
stdout.printf("Default is determined automagically from terminal width\n");
}
}
public class MonitorCommand : ReadCommand
{
public override int execute(string[] args, ApplicationState state)
{
return do_read(args, state, true);
}
public override string name()
{
return "monitor";
}
public override void help(string[] args)
{
stdout.printf("Synopsis: monitor <port> [format-string] [format-length]\n");
stdout.printf("Reads from port AND prints messages you send to it\n");
stdout.printf("See help read for formatting options\n");
}
}
......@@ -78,6 +78,8 @@ void init_list(ApplicationState state) {
state.command_list.append_val(c);
c = new AutowriteCommand();
state.command_list.append_val(c);
c = new MonitorCommand();
state.command_list.append_val(c);
}
/*=====================================
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment