commit d79e2ec5ec3ac7e3216ed7606337881bc4b91b4f
parent 333394dd1ba87d2efcbb7b41e608d7ad5b118b26
Author: Dominik Schmidt <das1993@hotmail.com>
Date: Thu, 13 Dec 2012 22:59:58 +0100
Problem of Baudswitching solved by unclean waittime...
Diffstat:
7 files changed, 58 insertions(+), 22 deletions(-)
diff --git a/ctrl.c b/ctrl.c
@@ -3,7 +3,7 @@
*
* @copyright: Copyright (c) 2012, Dominik Schmidt
* @author: Dominik Schmidt <das1993@hotmail.com>
- * @version: 0.0.0
+ * @version: 0.0.0
* @license: CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)
*
*/
@@ -12,8 +12,12 @@
#include <com.h>
#include <unistd.h>
int main(int argc, char **argv){
- engine_init(argc,argv);
- engine_run();
- engine_deinit();
+ return engine_autorun(argc,argv);
+ /*
+ int fd=openDevice("/dev/ttyUSB0");
+ sendMagicPacket(fd,'m');
+ readMagicPacket(fd);
+ closeDevice(fd);
+ */
return 0;
}
diff --git a/include/dev.h b/include/dev.h
@@ -13,6 +13,7 @@ extern int closeDevice(int dev);
extern int autoConfigBaud(int fd);
extern int openDevice(char *dev);
extern int setBaudRate(int fd, speed_t baud, unsigned int baud_select);
+extern int setBaudRateExt(int fd, speed_t baud, unsigned int baud_select, int extra);
enum BAUD_SELECT{
BAUD_INPUT=(1<<0),
BAUD_OUTPUT=(1<<1)
diff --git a/include/engine.h b/include/engine.h
@@ -13,3 +13,4 @@ extern void print_usage(FILE *stream);
extern int engine_init(int argc, char **argv);
extern int engine_run(void);
extern int engine_deinit(void);
+extern int engine_autorun(int argc, char **argv);
diff --git a/src/cmd.c b/src/cmd.c
@@ -137,15 +137,13 @@ GENERATE_CALLBACK(cmd_set_emul_mode){
char str[50];
sprintf(str,"Setting mode to %c",mode);
do_log("cmd_set_emul_mode",str,LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL);
- if(newBaud!=0){
- setBaudRate(fd,newBaud,BAUD_INPUT);
- }
if(sendMagicPacket(fd,mode)<0){
do_log("cmd_set_emul_mode","Couldn't send magic packet",LOG_LEVEL_ERROR,LOG_TYPE_NORMAL);
return -2;
}
if(newBaud!=0){
- setBaudRate(fd,newBaud,BAUD_OUTPUT);
+ usleep(5000);
+ setBaudRateExt(fd,newBaud,BAUD_INPUT|BAUD_OUTPUT, TCSADRAIN);
}
if(readMagicPacket(fd)!=mode){
do_log("cmd_set_emul_mode","Couldn't set Mode",LOG_LEVEL_ERROR,LOG_TYPE_NORMAL);
diff --git a/src/cmd_dispatch.c b/src/cmd_dispatch.c
@@ -11,12 +11,13 @@
#include <cmd_dispatch.h>
#include <cmd.h>
#include <stdlib.h>
-#include <stdio.h>
#include <option.h>
#include <termios.h>
#include <string.h>
#include <com.h>
#include <dev.h>
+#include <stdio.h>
+#include <unistd.h>
struct command_def commands[]={
{.name="Status", .opt={.arg_length=0, .short_option="-s", .long_option="--status"}, .request_mymode=0, .callback=&cmd_status},
{.name="Reset", .opt={.arg_length=0, .short_option="-R", .long_option="--reset"}, .request_mymode=1, .callback=&cmd_reset},
@@ -83,12 +84,16 @@ int prepareCommandExecution(int fd, struct conf *config){
sendMagicPacket(fd,'i');
config->oldmode=readMagicPacket(fd);
if(config->oldmode!='m'){
+ fsync(fd);
sendMagicPacket(fd,'m');
- setBaudRate(fd,B500000, BAUD_INPUT|BAUD_OUTPUT);
- if(readMagicPacket(fd)!='m'){
+ usleep(5000);
+ setBaudRateExt(fd,B500000, BAUD_INPUT|BAUD_OUTPUT, TCSADRAIN);
+ char c=readMagicPacket(fd);
+ if(c!='m'){
do_log("prepareCommandExecution","Couldn't switch to mymode",LOG_LEVEL_ERROR,LOG_TYPE_NORMAL);
return -1;
}
+ setBaudRate(fd,B500000, BAUD_INPUT|BAUD_OUTPUT);
}
}
@@ -96,7 +101,7 @@ int prepareCommandExecution(int fd, struct conf *config){
}
int finishCommandExecution(int fd, struct conf *config){
if(config->oldmode>0){
- sendMagicPacket(fd,config->oldmode);
+ sendMagicPacket(fd,config->oldmode);
}
return 0;
}
diff --git a/src/dev.c b/src/dev.c
@@ -27,9 +27,10 @@ int autoConfigBaud(int fd){
unsigned int i=0;
char str[50];
do_log("autoConfigBaud","Testing preset Baud",LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL);
+ char c;
for(i=0;i<=3; i++){
sendMagicPacket(fd,'i');
- char c=readMagicPacket(fd);
+ c=readMagicPacket(fd);
if(c!=0){
break;
}
@@ -46,10 +47,13 @@ int autoConfigBaud(int fd){
do_log("autoConfigBaud",str,LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL);
}
do_log("autoConfigBaud","BaudRate autoconfiguration successfull",LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL);
-
+ fsync(fd);
return 0;
}
int setBaudRate(int fd, speed_t baud, unsigned int baud_select){
+ return setBaudRateExt(fd, baud, baud_select, TCSANOW);
+}
+int setBaudRateExt(int fd, speed_t baud, unsigned int baud_select, int extra){
struct termios options;
char str[50];
if(tcgetattr(fd, &options)<0){
@@ -78,7 +82,7 @@ int setBaudRate(int fd, speed_t baud, unsigned int baud_select){
do_log("setBaudRate", str, LOG_LEVEL_DEBUG, LOG_TYPE_NORMAL);
}
}
- if(tcsetattr(fd, TCSANOW, &options)<0){
+ if(tcsetattr(fd, extra, &options)<0){
do_log("setBaudRate","Couldn't set Options",LOG_LEVEL_ERROR,LOG_TYPE_SIGNAL);
closeDevice(fd);
return -4;
@@ -92,7 +96,7 @@ int openDevice(char *dev){
do_log("openDevice", "Couldn't open Device", LOG_LEVEL_FATAL,LOG_TYPE_SIGNAL);
return -1;
}
- ioctl(fd, TIOCEXCL);
+ //ioctl(fd, TIOCEXCL);
struct termios options;
tcgetattr(fd, &options);
diff --git a/src/engine.c b/src/engine.c
@@ -12,7 +12,7 @@
#include <cmd_dispatch.h>
#include <dev.h>
#include <log.h>
-
+#include <engine.h>
void print_usage(FILE *stream){
fprintf(stream,"Usage of %s\n",configuration.filename);
fprintf(stream,"Global Commands:\n");
@@ -33,10 +33,29 @@ void print_usage(FILE *stream){
}
-
+int engine_autorun(int argc, char **argv){
+ int ret=engine_init(argc,argv);
+ if(ret<-1){
+ do_log("engine_autorun", "Couldn't initialize engine",LOG_LEVEL_FATAL, LOG_TYPE_NORMAL);
+ return -1;
+ }
+ if(ret>-1&&engine_run()<0){
+ do_log("engine_autorun", "Couldn't run the command",LOG_LEVEL_FATAL, LOG_TYPE_NORMAL);
+ return -3;
+ }
+ return engine_deinit();
+}
int engine_init(int argc, char **argv){
configuration.filename=argv[0];
- parseArguments(argc-1, &argv[1],&configuration);
+ if(argc<=1){
+ configuration.print_usage=1;
+ return -1;
+ }
+
+ if(parseArguments(argc-1, &argv[1],&configuration)<0){
+ do_log("engine_init", "Couldn't parse Arguments",LOG_LEVEL_FATAL, LOG_TYPE_NORMAL);
+ return -2;
+ }
return 0;
@@ -45,10 +64,14 @@ int engine_init(int argc, char **argv){
int engine_run(void){
int fd=openDevice(configuration.device);
if(fd<0){
- do_log("main","Couldn't open device",LOG_LEVEL_FATAL,LOG_TYPE_NORMAL);
- return 1;
+ do_log("engine_run","Couldn't open device",LOG_LEVEL_FATAL,LOG_TYPE_NORMAL);
+ return -1;
+ }
+ if(prepareCommandExecution(fd, &configuration)<0){
+ do_log("engine_run", "CommandExecution Preparation failed", LOG_LEVEL_FATAL, LOG_TYPE_NORMAL);
+ closeDevice(fd);
+ return -2;
}
- prepareCommandExecution(fd, &configuration);
processCommands(configuration.cmdlist.data,fd);
finishCommandExecution(fd, &configuration);
closeDevice(fd);