init on github

This commit is contained in:
eddyem
2015-07-23 13:44:53 +03:00
parent 506e00e282
commit 6443a7dbf4
18 changed files with 2696 additions and 0 deletions

389
02-TEST/Frontend/FE.c Normal file
View File

@@ -0,0 +1,389 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termio.h>
#include <termios.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <time.h>
#include <strings.h>
#include <string.h>
#include <linux/serial.h>
#include <signal.h>
#include "signals.h" // ÏÐÒÅÄÅÌÅÎÉÑ ÓÉÇÎÁÌÏ× Ó×ÑÚÉ
#define C_NO 224 // ÎÏÍÅÒ ËÏÎÔÒÏÌÌÅÒÁ (ÓÔÁÒÛÉÅ 3 ÂÉÔÁ)
int BAUD_RATE = B9600;
struct termio oldtty, tty; // ÆÌÁÇÉ ÄÌÑ UART
struct termios oldt, newt; // ÆÌÁÇÉ ÄÌÑ ËÏÎÓÏÌÉ
//struct serial_struct old_extra_term;
int comfd; // æÁÊÌÏ×ÙÊ ÄÅÓËÒÉÐÔÏÒ ÐÏÒÔÁ
char *comdev = "/dev/ttyS0"; // õÓÔÒÏÊÓÔ×Ï ÐÏÒÔÁ (ÐÏÔÏÍ ÐÅÒÅÄÅÌÁÔØ ÄÌÑ ÚÁÐÒÏÓÁ)
void tty_sig(unsigned char rb);
unsigned char crc(unsigned char data){
unsigned char crc = data & 1;
unsigned int i;
for(i = 1; i<8; i++) crc ^= (data >> i) & 1;
return crc;
}
void quit(int ex_stat){ // ×ÙÈÏÄ ÉÚ ÐÒÏÇÒÁÍÍÙ
tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); // ×ÏÚ×ÒÁÝÁÅÍ ËÏÎÓÏÌØ × ÎÁÞÁÌØÎÏÅ ÓÏÓÔÏÑÎÉÅ (ÎÁ ×ÓÑËÉÊ ÓÌÕÞÁÊ)
ioctl(comfd, TCSANOW, &oldtty ); // ×ÏÓÓÔÁÎÁ×ÌÉ×ÁÅÍ ÒÅÖÉÍ ÒÁÂÏÔÙ com
close(comfd); // ÚÁËÒÙ×ÁÅÍ ÓÏÅÄÉÎÅÎÉÅ
printf("÷ÙÈÏÄ... (ÓÉÇÎÁÌ %d)\n", ex_stat);
exit(ex_stat);
}
void tty_init(){
printf("\nïÔËÒÙ×ÁÀ ÐÏÒÔ...\n");
if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){
fprintf(stderr,"Can't use port %s\n",comdev);
quit(1);
}
printf(" OK\nðÏÌÕÞÁÀ ÔÅËÕÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ...\n");
ioctl(comfd,TCGETA,&oldtty); // õÚÎÁÅÍ ÔÅËÕÝÉÅ ÐÁÒÁÍÅÔÒÙ ÐÏÒÔÁ
tty = oldtty;
tty.c_lflag = 0; // ~(ICANON | ECHO | ECHOE | ISIG)
tty.c_iflag = BRKINT; // ÐÏÄÇÏÔÏ×ËÁ Ë 9ÂÉÔÎÏÊ ÐÅÒÅÄÁÞÅ
tty.c_oflag = 0;
tty.c_cflag = BAUD_RATE|CS8|CREAD|CLOCAL|PARENB; // 9.6Ë, 8N1, RW, ÉÇÎÏÒÉÒÏ×ÁÔØ ËÏÎÔÒ. ÌÉÎÉÉ
tty.c_cc[VMIN] = 0; // ÎÅ ËÁÎÏÎÉÞÅÓËÉÊ ÒÅÖÉÍ
tty.c_cc[VTIME] = 5; // (ÂÅÚ ÓÉÍ×ÏÌÏ× ÷ë É ÐÒ.)
if(ioctl(comfd,TCSETA,&tty)<0) exit(-1); // õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÔÅËÕÝÉÅ ÐÁÒÁÍÅÔÒÙ ÐÏÒÔÁ
printf(" OK\n");
}
unsigned char read_tty(unsigned char *byte){
*byte = 0;
fd_set rfds; // ÎÁÂÏÒ ÆÁÊÌÏ×ÙÈ ÄÅÓËÒÉÐÔÏÒÏ×
struct timeval tv; // ×ÒÅÍÑ ÏÖÉÄÁÎÉÑ
int retval; // ×ÏÚ×ÒÁÝÁÅÍÏÅ Æ-Ê select ÚÎÁÞÅÎÉÅ
tty.c_iflag &= ~PARODD;
ioctl(comfd,TCSETA,&tty);
// öÄÅÍ, ÓÉÇÎÁÌÁ Ó ÐÏÒÔÁ
FD_ZERO(&rfds); // ÏÞÉÝÁÅÍ ÎÁÂÏÒ
FD_SET(comfd, &rfds); // ÔÅÐÅÒØ ÜÔÏ - Ó×ÏÊÓÔ×Á ÐÏÒÔÁ
tv.tv_sec = 0; tv.tv_usec = 50000; // ÖÄÅÍ
retval = select(comfd + 1, &rfds, NULL, NULL, &tv);
if (!retval) return 0; // ÅÓÌÉ ÓÉÇÎÁÌÁ ÎÅÔ, ×ÏÚ×ÒÁÝÁÅÍ ÎÏÌØ
if(FD_ISSET(comfd, &rfds)){
// printf("ready ");
if(read(comfd, byte, 1) < 1) return 0; // ÏÛÉÂËÁ ÓÞÉÔÙ×ÁÎÉÑ
}
else return 0; // ÏÛÉÂËÁ
/* if(*byte == 8){
return 0;
}
else*/
// printf("ÓÞÉÔÁÎ: %d (ËÏÍÁÎÄÁ %d)\n", *byte, *byte & 0x1f);
return 1;
}
unsigned char read_console(){ // ÓÞÉÔÙ×ÁÅÍ ÄÁÎÎÙÅ Ó ËÏÎÓÏÌÉ
unsigned char rb;
struct timeval tv;
int retval;
tcgetattr( STDIN_FILENO, &oldt ); // ÏÔËÒÙ×ÁÅÍ ÔÅÒÍÉÎÁÌ ÄÌÑ ÒÅÁËÃÉÉ ÎÁ ËÌÁ×ÉÛÉ ÂÅÚ ÜÈÁ
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds); // 0 - ÓÔÁÎÄÁÒÔÎÙÊ ×ÈÏÄ
tv.tv_sec = 0; tv.tv_usec = 10000; // ÖÄÅÍ 0.01Ó
retval = select(1, &rfds, NULL, NULL, &tv);
if (!retval) rb = 0;
else {
if(FD_ISSET(STDIN_FILENO, &rfds)) rb = getchar();
else rb = 0;
}
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return rb;
}
unsigned char mygetchar(){ // ÁÎÁÌÏÇ getchar() ÂÅÚ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÖÁÔØ Enter
unsigned char ret;
do ret = read_console();
while(ret == 0);
return ret;
}
void write_tty_raw(unsigned char wb){
if(crc(wb)) // ÎÅÞÅÔÎÁÑ ÓÕÍÍÁ
tty.c_cflag |=PARODD; // 9-Ê ÂÉÔ = 0
else
tty.c_cflag &= ~PARODD; // = 1
ioctl(comfd,TCSETA,&tty); // ÐÅÒÅÎÁÓÔÒÁÉ×ÁÅÍ ÐÏÒÔ
if(write(comfd, &wb, 1) < 0) err("ïÛÉÂËÁ! úÁÐÉÓØ ÎÅ ÕÄÁÌÁÓØ :(\n"); // É ÐÉÛÅÍ × ÎÅÇÏ ÂÁÊÔ
}
void write_tty(unsigned char wb){
unsigned char tmp = wb;
tmp &= 0x1f; // ÎÁ ×ÓÑËÉÊ ÓÌÕÞÁÊ ÏÞÉÝÁÅÍ ÏÔ ÍÕÓÏÒÁ
tmp |= C_NO; // ÄÏÂÁ×ÌÑÅÍ Ë ËÏÍÁÎÄÅ
write_tty_raw(tmp);
}
int send_cmd(unsigned char cmd){ // ÐÏÓÙÌËÁ ËÏÎÔÒÏÌÌÅÒÕ ËÏÍÁÎÄÙ Ó ËÏÎÔÒÏÌÅÍ
unsigned char rtn=ERR_CMD, byte=0, i=0;
while(i<2 && rtn != 1){
write_tty(cmd);
usleep(100000);
rtn = read_tty(&byte);
byte &= 0x1f;
i++;
}
if(byte != cmd){
printf("\n\n!!!!!! ïÛÉÂËÁ! ëÏÎÔÒÏÌÌÅÒ ÎÅ ÏÔ×ÅÞÁÅÔ (ÏÔ×ÅÔ %d ÎÁ ËÏÍÁÎÄÕ %d) !!!!!\n\n", byte, cmd);
return 0;
}
else return 1;
}
void sendword(unsigned int data){
unsigned char tmp,i=0,rr=0, ret;
tmp = (data >> 8) & 0xFF;
if(crc(tmp)) // ÎÅÞÅÔÎÁÑ ÓÕÍÍÁ
tty.c_cflag &= ~PARODD; // 9-Ê ÂÉÔ = 0
else
tty.c_cflag |= PARODD; // = 1
ioctl(comfd,TCSETA,&tty); // ÐÅÒÅÎÁÓÔÒÁÉ×ÁÅÍ ÐÏÒÔ
write(comfd, &tmp, 1);
do{ i++;
usleep(10000);
ret = read_tty(&rr); rr &= 0x1F;
}while((ret == 0 || rr != OK) && i < 10 );
if(rr != OK){ err("ïÛÉÂËÁ ÚÁÐÉÓÉ"); return;}
i = 0;
tmp = data & 0xFF;
if(crc(tmp)) // ÎÅÞÅÔÎÁÑ ÓÕÍÍÁ
tty.c_cflag &= ~PARODD; // 9-Ê ÂÉÔ = 0
else
tty.c_cflag |= PARODD; // = 1
ioctl(comfd,TCSETA,&tty); // ÐÅÒÅÎÁÓÔÒÁÉ×ÁÅÍ ÐÏÒÔ
write(comfd, &tmp, 1);
do{ i++;
usleep(10000);
ret = read_tty(&rr); rr &= 0x1F;
}while((ret == 0 || rr != OK) && i < 10 );
if(rr != OK){err("îÅÕÄÁÞÁ"); return;}
}
void send_seq(){
unsigned char seq[1024], byte;
char *line;
int cntr = 0, n, sz = 9;
line = (char*) malloc(10);
printf("\n÷×ÏÄÉÔÅ ÞÉÓÌÁ ÐÏ ÏÄÎÏÍÕ × ÓÔÒÏËÅ, ÏËÏÎÞÁÎÉÅ - ÓÌÏ×Ï end\n");
do{
n = getline(&line, &sz, stdin);
if(n == 0 || strstr(line, "end") != NULL) break;
seq[cntr++] = (unsigned char)atoi(line);
}while(cntr < 1024);
printf("\nîÁÞÉÎÁÀ ÐÅÒÅÄÁÞÕ\n");
for(n=0; n<cntr; n++){
if(send_cmd(SPI_send_one)){
write_tty_raw(seq[n]);
printf("ðÅÒÅÄÁÎ ÂÁÊÔ \e[1;32;40m%d\e[0m\n", seq[n]);
if(read_tty(&byte))
tty_sig(byte);
}
}
free(line);
printf("\nðÅÒÅÄÁÞÁ ÏËÏÎÞÅÎÁ\n");
}
void send_rand(){
int i; unsigned char byte, rb;
srand(time(NULL));
for(i=0; i<1024; i++)
if(send_cmd(SPI_send_one)){
byte = (rand()|rand()) & 0xff;
write_tty_raw(byte);
printf("%d: ÐÅÒÅÄÁÎ ÂÁÊÔ \e[1;32;40m%d\e[0m\n", i, byte);
if(read_tty(&byte))
tty_sig(byte);
rb = read_console();
if(rb == 'q') break;
}
}
void send_same(){
int i; unsigned char cmd, byte, rb;
printf("\n÷×ÅÄÉÔÅ ËÏÍÁÎÄÕ: ");
scanf("%d", &i);
cmd = i;
for(i=0; i<1024; i++)
if(send_cmd(SPI_send_one)){
byte = (i%16) ? 0:cmd;
write_tty_raw(byte);
printf("%d: ÐÅÒÅÄÁÎ ÂÁÊÔ \e[1;32;40m%d\e[0m\n", i, byte);
if(read_tty(&rb))
tty_sig(rb);
rb = read_console();
if(rb == 'q') break;
}
}
void ssend(){
unsigned char cmds[] = {31,0,0,79,0,0,0,95,0,0,224,0,0}, rb;
int i, s=sizeof(cmds);
while(1){
printf("\n");
for(i=0; i<s; i++){
if(send_cmd(SPI_send_one)){
printf("þÉÓÌÏ %d\n", cmds[i]);
write_tty_raw(cmds[i]);
}
if(read_tty(&rb))
tty_sig(rb);
rb = read_console();
if(rb == 'q') return;
}
}
}
void tmrset(){
unsigned char t_h,t_l;
float period;
if(send_cmd(TMR_SETTINGS) == 0) return;
usleep(10000);
read(comfd, &t_h, 1);
usleep(10000);
read(comfd, &t_l, 1);
period = (65536.0 - 256.0*(float)t_h - (float)t_l)/125000.0;
printf("ðÅÒÉÏÄ ÔÁÊÍÅÒÁ: T=%f", period);
}
void help(){
printf("\nh\tðÏÍÏÝØ\n"
"t\tõÚÎÁÔØ ÔÅËÕÝÉÊ ÐÅÒÉÏÄ ÔÁÊÍÅÒÁ\n"
"T\tóÍÅÎÉÔØ ÐÅÒÉÏÄ ÔÁÊÍÅÒÁ\n"
"s\tïÔÏÓÌÁÔØ Ä×Á ÂÁÊÔÁ ÐÏ SPI\n"
"S\tïÔÏÓÌÁÔØ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÂÁÊÔ (ÎÅ ÂÏÌÅÅ 1024, ÚÁ×ÅÒÛÅÎÉÅ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ - end)\n"
"R\tïÔÓÙÌÁÔØ ÓÌÕÞÁÊÎÙÅ ÞÉÓÌÁ (1024 ÛÔÕËÉ)\n"
"w\tïÔÓÙÌÁÔØ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÏÄÉÎÁËÏ×ÙÈ ××ÅÄÅÎÎÙÈ ËÏÍÁÎÄ\n"
"d\tóÞÉÔÁÔØ ÂÕÆÅÒ SPI\n"
"i\t(òÅ)ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ËÏÎÔÒÏÌÌÅÒ\n"
"r\tðÒÅÒÙ×ÁÎÉÅ sync ÐÏ ×ÏÚÒÁÓÔÁÀÝÅÍÕ ÕÒÏ×ÎÀ\n"
"f\tðÒÅÒÙ×ÁÎÉÅ sync ÐÏ ÓÐÁÄÁÀÝÅÍÕ ÆÒÏÎÔÕ\n"
"m\täÁÎÎÙÅ ÓÞÉÔÙ×ÁÀÔÓÑ × ÓÅÒÅÄÉÎÅ ÔÁËÔÁ\n"
"e\täÁÎÎÙÅ ÓÞÉÔÙ×ÁÀÔÓÑ × ËÏÎÃÅ ÔÁËÔÁ\n"
"0\t÷ÙËÌÀÞÉÔØ SPI\n"
"1\t÷ËÌÀÞÉÔØ SPI\n"
"a\tSPI × ÁËÔÉ×ÎÏÍ ÒÅÖÉÍÅ\n"
"p\tSPI × ÐÁÓÓÉ×ÎÏÍ ÒÅÖÉÍÅ\n"
"L\tóËÏÒÏÓÔØ 9600\n"
"H\tóËÏÒÏÓÔØ 115200\n"
"M\tóËÏÒÏÓÔØ 19200\n"
"2\t÷ÙËÌÀÞÉÔØ TEST\n"
"F\tðÏÐÙÔÁÔØÓÑ ÐÏÊÍÁÔØ ÆÏËÕÓ\n"
"\n");
}
void set_speed(int spd){
//B115200 ÉÌÉ B9600
BAUD_RATE = spd;
ioctl(comfd, TCSANOW, &oldtty ); // ×ÏÓÓÔÁÎÁ×ÌÉ×ÁÅÍ ÒÅÖÉÍ ÒÁÂÏÔÙ com
close(comfd); // ÚÁËÒÙ×ÁÅÍ ÓÏÅÄÉÎÅÎÉÅ
tty_init();
}
void spi_show(){
unsigned char cntr;
send_cmd(SPI_SHOW);
while(!read_tty(&cntr));
printf("\n÷ ÂÕÆÅÒÅ %d ÄÁÎÎÙÈ\n", cntr);
}
void con_sig(unsigned char rb){ // ÏÂÒÁÂÏÔËÁ ÓÉÇÎÁÌÏ× Ó ËÏÎÓÏÌÉ
unsigned int tmp;
if(rb == 'q') quit(0); // ×ÙÈÏÄÉÍ ÐÏ ÎÁÖÁÔÉÀ q
switch(rb){
case 'h': help(); break;
case 't': tmrset(); break;
case 'T': printf("\nðÅÒÉÏÄ × ÍËÓ:\n"); scanf("%d", &tmp);
if(send_cmd(SET_TIMER)) sendword(65536 - tmp/8); break;
case 'i': send_cmd(INIT); break;
case 's': printf("\näÁÎÎÙÅ:\n"); scanf("%d", &tmp);
if(send_cmd(SPI_send)) sendword(tmp); break;
case 'S': send_seq(); break;
case 'R': send_rand(); break;
case 'w': send_same(); break;
case 'r': send_cmd(IMP_RISE); break;
case 'f': send_cmd(IMP_FALL); break;
case 'm': send_cmd(MID_DATA); break;
case 'e': send_cmd(END_DATA); break;
case '0': send_cmd(SPI_OFF); break;
case '1': send_cmd(SPI_ON); break;
case 'a': send_cmd(SPI_ACTIVE); break;
case 'p': send_cmd(SPI_PASSIVE); break;
case 'L': set_speed(B9600); break;
case 'H': send_cmd(HIG_SPD); set_speed(B115200); break;
case 'M': send_cmd(MID_SPD); set_speed(B19200); break;
case '2': send_cmd(TEST); break;
case 'd': spi_show(); break;
case 'F': ssend(); break;
}
}
void dec2bin(unsigned char ii, char* bin){
int i;
for(i=0; i<8; i++){
bin[7-i] = (ii & 1) ? '1' : '0';
ii>>=1;
}
bin[8]=0;
}
void tty_sig(unsigned char rb){ // ÏÂÒÁÂÏÔËÁ ÓÉÇÎÁÌÏ× Ó ËÏÎÔÒÏÌÌÅÒÁ
char bin[9];
dec2bin(rb, bin);
switch(rb){
case ERR_CMD: printf("ïÛÉÂËÁ (\e[1;31;40m%d\e[0m?)\n", ERR_CMD); break;
case OK: printf("OK (\e[1;31;40m%d\e[0m?)\n", OK); break;
default: printf("\e[1;31;40m%d\e[0m\t(%s)\n", rb, bin);
}
}
int main(int argc, char *argv[]){
unsigned char rb, byte, i = 0; // ÓÞÉÔÁÎÎÙÅ ÄÁÎÎÙÅ, ÓÞÅÔÞÉË
tty_init();
rb = ERR_CMD;
signal(SIGTERM, quit); // kill (-15)
signal(SIGINT, quit); // ctrl+C
signal(SIGQUIT, SIG_IGN); // ctrl+\ .
signal(SIGTSTP, SIG_IGN); // ctrl+Z
setbuf(stdout, NULL);
printf("\néÎÉÃÉÁÌÉÚÁÃÉÑ...\n");
do{
write_tty(INIT); // éÎÉÃÉÁÌÉÚÁÃÉÑ ËÏÎÔÒÏÌÌÅÒÁ
rb = read_tty(&byte);
usleep(100000);
i ++;
}
while(i<3 && rb != 1); // ÐÒÏ×ÅÒËÁ Ó×ÑÚÉ
if(i > 2 || (byte&0x1f) != INIT){
fprintf(stderr,"\n!!!!!! ïÛÉÂËÁ: ËÏÎÔÒÏÌÌÅÒ ÎÅ ÏÔ×ÅÞÁÅÔ (%d) !!!!!!\n", byte);
}
else printf(" OK\n");
while(1){ // ÂÅÓËÏÎÅÞÎÏ ÚÁÃÉËÌÉ×ÁÅÍÓÑ
rb = read_console();
if(rb != 0) con_sig(rb); // ÅÓÌÉ ÞÔÏ-ÔÏ ÐÏÑ×ÉÌÏÓØ - ÏÂÒÁÂÁÔÙ×ÁÅÍ
rb = read_tty(&byte);
if(rb != 0) tty_sig(byte); // ÅÓÌÉ ÅÓÔØ ÓÉÇÎÁÌ Ó ËÏÎÔÒÏÌÌÅÒÁ - ÏÂÒÁÂÁÔÙ×ÁÅÍ
}
}

275
02-TEST/Frontend/main.c Normal file
View File

@@ -0,0 +1,275 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termio.h>
#include <termios.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <time.h>
#include <strings.h>
#include "signals.h" // ÏÐÒÅÄÅÌÅÎÉÑ ÓÉÇÎÁÌÏ× Ó×ÑÚÉ
#include "func.h" // ÆÕÎËÃÉÉ ÏÂÒÁÂÏÔËÉ ÓÉÇÎÁÌÏ×, ÇÌÏÂÁÌØÎÙÅ ÐÅÒÅÍÅÎÎÙÅ
#include "keys.h" // ËÌÁ×ÉÛÎÙÅ ËÏÍÁÎÄÙ
#include "killbrothers.h"
#include "queues.h"
#define CMSPAR 010000000000
extern int get_auth_level();
FILE* outfile;
double tm0, tm; // ×ÒÅÍÑ × ÓÅËÕÎÄÁÈ
struct termio oldtty, tty; // ÆÌÁÇÉ ÄÌÑ UART
int comfd = -1; // æÁÊÌÏ×ÙÊ ÄÅÓËÒÉÐÔÏÒ ÐÏÒÔÁ
static char *comdev = "/dev/ttyS1"; // õÓÔÒÏÊÓÔ×Ï ÐÏÒÔÁ (ÐÏÔÏÍ ÐÅÒÅÄÅÌÁÔØ ÄÌÑ ÚÁÐÒÏÓÁ)
unsigned char crc(unsigned char data){
unsigned char crc = data & 1;
unsigned int i;
for(i = 1; i<8; i++) crc ^= (data >> i) & 1;
return crc;
}
double dtime(){
struct timeval tv;
struct timezone tz;
int ret;
double t;
ret = gettimeofday(&tv, &tz);
t = (double)tv.tv_sec + (double)tv.tv_usec*0.000001;
t -= timezone;
return(t);
}
void quit(int ex_stat){ // ×ÙÈÏÄ ÉÚ ÐÒÏÇÒÁÍÍÙ
unsigned char i;
err("ïÔËÌÀÞÁÀÓØ...");
if(comfd > 0){
for(i=0; i<8; i++)
stop_motor(i<<5, "0"); // ÏÓÔÁÎÁ×ÌÉ×ÁÅÍ Ä×ÉÇÁÔÅÌØ
ioctl(comfd, TCSETA, &oldtty); // ×ÏÓÓÔÁÎÁ×ÌÉ×ÁÅÍ ÒÅÖÉÍ ÒÁÂÏÔÙ com
close(comfd); // ÚÁËÒÙ×ÁÅÍ ÓÏÅÄÉÎÅÎÉÅ
}
rm_queues();
exit(ex_stat);
}
void tty_init(){
if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0)
die("Can't use port %s\n",comdev);
ioctl(comfd,TCGETA,&oldtty); // õÚÎÁÅÍ ÔÅËÕÝÉÅ ÐÁÒÁÍÅÔÒÙ ÐÏÒÔÁ
tty = oldtty;
tty.c_lflag = 0;
tty.c_iflag = BRKINT;//|PARENB|CMSPAR;
tty.c_oflag = 0;
tty.c_cflag = B9600|CS8|CREAD|CLOCAL|PARENB;//|CMSPAR;
tty.c_cflag &= ~PARODD;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 1;
ioctl(comfd,TCSETA,&tty);
}
unsigned char read_tty(){ // ÓÞÉÔÙ×ÁÅÍ 1 ÂÁÊÔ (Ó ÏÖÉÄÁÎÉÅÍ ÓÉÇÎÁÌÁ)
unsigned char rb; // ÔÏ, ÞÔÏ ÓÞÉÔÙ×ÁÅÍ
tty.c_iflag &= ~PARODD; // ÐÒÉÎÉÍÁÅÍ Ó ÄÅ×ÑÔÙÍ ÂÉÔÏÍ = 0
ioctl(comfd,TCSETA,&tty);
if(read(comfd, &rb, 1) < 1) return 0; // ÏÛÉÂËÁ ÓÞÉÔÙ×ÁÎÉÑ
tm = dtime() - tm0;
tm0 = dtime();
fprintf(stderr,"ÓÞÉÔÁÎ ÓÉÇÎÁÌ: %d Ó ËÏÎÔÒÏÌÌÅÒÁ %d, ×ÒÅÍÑ ÏÔ ÐÒÅÄÙÄÕÝÅÇÏ ÓÞÉÔÙ×ÁÎÉÑ: %f Ó\n", rb&0x1F, rb&0xE0, tm);
return rb;
}
void write_tty_raw(unsigned char wb){
if(crc(wb)) // ÎÅÞÅÔÎÁÑ ÓÕÍÍÁ
tty.c_cflag |=PARODD; // 9-Ê ÂÉÔ = 0
else
tty.c_cflag &= ~PARODD; // = 1
ioctl(comfd,TCSETA,&tty); // ÐÅÒÅÎÁÓÔÒÁÉ×ÁÅÍ ÐÏÒÔ
if(write(comfd, &wb, 1) < 0) err("ïÛÉÂËÁ! úÁÐÉÓØ ÎÅ ÕÄÁÌÁÓØ :(\n"); // É ÐÉÛÅÍ × ÎÅÇÏ ÂÁÊÔ
}
void write_tty(unsigned char wb, unsigned char cno){
unsigned char tmp = wb;
tmp &= 0x1f; // ÎÁ ×ÓÑËÉÊ ÓÌÕÞÁÊ ÏÞÉÝÁÅÍ ÏÔ ÍÕÓÏÒÁ
tmp |= cno; // ÄÏÂÁ×ÌÑÅÍ Ë ËÏÍÁÎÄÅ
write_tty_raw(tmp);
}
int send_cmd(unsigned char cmd, unsigned char flag, unsigned char cno){ // ÐÏÓÙÌËÁ ËÏÎÔÒÏÌÌÅÒÕ ËÏÍÁÎÄÙ Ó ËÏÎÔÒÏÌÅÍ
// flag = 1 - ËÏÍÁÎÄÁ ÏÔÓÙÌÁÅÔÓÑ ÔÅËÕÝÅÍÕ ËÏÎÔÒÏÌÌÅÒÕ, 0 - ÐÏ ÚÁÐÒÏÓÕ
int ret = -1;
unsigned char rtn=0, i=0, cmd1;
cmd1 = (flag)? ((cmd&0x1F)|cno) : cmd;
while(i<10 && rtn != cmd1){ // 10 ÐÏÐÙÔÏË
usleep(1000);
if(flag) write_tty(cmd, cno);
else write_tty_raw(cmd);
usleep(100000);
rtn = read_tty();
i++;
}
if(rtn != cmd1)
err("!!!!!! ïÛÉÂËÁ! ëÏÎÔÒÏÌÌÅÒ ÎÅ ÏÔ×ÅÞÁÅÔ !!!!!");
else ret = (i<2)?1:0;
return ret;
}
void sendword(unsigned int data){
unsigned char tmp,i=0,rr=0;
tmp = (data >> 8) & 0xFF;
if(crc(tmp)) // ÎÅÞÅÔÎÁÑ ÓÕÍÍÁ
tty.c_cflag &= ~PARODD; // 9-Ê ÂÉÔ = 0
else
tty.c_cflag |= PARODD; // = 1
ioctl(comfd,TCSETA,&tty); // ÐÅÒÅÎÁÓÔÒÁÉ×ÁÅÍ ÐÏÒÔ
do{ i++;
if(write(comfd, &tmp, 1) < 0){continue;}
usleep(10000);
rr = read_tty() & 0x1F;
}while(rr != OK && i < 10);
if(rr != OK){ err("ïÛÉÂËÁ ÚÁÐÉÓÉ"); return;}
i = 0;
tmp = data & 0xFF;
if(crc(tmp)) // ÎÅÞÅÔÎÁÑ ÓÕÍÍÁ
tty.c_cflag &= ~PARODD; // 9-Ê ÂÉÔ = 0
else
tty.c_cflag |= PARODD; // = 1
ioctl(comfd,TCSETA,&tty); // ÐÅÒÅÎÁÓÔÒÁÉ×ÁÅÍ ÐÏÒÔ
do{ i++;
if(write(comfd, &tmp, 1) < 0){continue;}
usleep(10000);
rr = read_tty() & 0x1F;
}while(rr != OK && i < 10);
if(rr != OK){err("îÅÕÄÁÞÁ"); return;}
}
/*
int getl(int fd, char* data, int N){
int rb = 0, i=0;
char *ptr = data;
do{
if((rb = read(fd, ptr, 1)) != 1) break;
if(*ptr == '\0' || *ptr == '\n') break;
ptr++;
}while(++i < N);
if(rb != 1 && i == 0) return (-1);
*ptr = '\0';
return i;
}*/
void tmrset(unsigned char cno){
unsigned char t_h,t_l;
float period;
if(send_cmd(TMR_SETTINGS, 1, cno)<0) return;
usleep(10000);
read(comfd, &t_h, 1);
usleep(10000);
read(comfd, &t_l, 1);
period = (65536.0 - 256.0*(float)t_h - (float)t_l)/125000.0;
warn("ðÅÒÉÏÄ ÔÁÊÍÅÒÁ: T=%f", period);
}
void init_ctrlr(unsigned char cno){
unsigned char rb = ERR_CMD;
unsigned char ini = INIT | cno;
int i=0;
warn("éÎÉÃÉÁÌÉÚÁÃÉÑ...");
do{
write_tty(INIT, cno); // éÎÉÃÉÁÌÉÚÁÃÉÑ ËÏÎÔÒÏÌÌÅÒÁ
rb = read_tty();
usleep(100000);
i++;
}
while(i<10 && rb != ini); // ÐÒÏ×ÅÒËÁ Ó×ÑÚÉ
if(i > 9 || rb != ini){
err("!!!!!! ïÛÉÂËÁ: ËÏÎÔÒÏÌÌÅÒ ÎÅ ÏÔ×ÅÞÁÅÔ !!!!!!");
}
else{
warn("... ÕÓÐÅÛÎÏ.");
}
}
void con_sig(unsigned char cno, unsigned char rb, char *val){ // ÏÂÒÁÂÏÔËÁ ÓÉÇÎÁÌÏ× Ó ËÏÎÓÏÌÉ
//fprintf(stderr, "key: %c, cno: %d, val:%s\n", rb, cno, val);
switch(rb){
case KEY_QUIT: quit(0); break;
case KEY_DEVICE: set_dev(cno, val); break;
case KEY_LEFT: rotate_left(cno, val); break;
case KEY_RIGHT: rotate_right(cno, val); break;
case KEY_NR: steps_(cno,RIGHT, val); break;
case KEY_NL: steps_(cno,LEFT, val); break;
case KEY_STOP: stop_motor(cno, val); break;
case KEY_VOLTAGE: set_voltage(cno, val); break;
case KEY_TMR: set_timer(cno, val); break;
case KEY_TMR_STOP: send_cmd(STOP_TIMER, 1, cno); break;
case KEY_TMR_STNGS: tmrset(cno); break;
case KEY_INIT: init_ctrlr(cno); break;
case KEY_Xplus: corrector(cno,0, val); break;
case KEY_Xminus: corrector(cno,1, val); break;
case KEY_Yplus: corrector(cno,2, val); break;
case KEY_Yminus: corrector(cno,3, val); break;
case KEY_MIDDLE: goto_middle(cno); break;
case KEY_TEST: send_cmd(TEST,1, cno); break;
/* default: send_cmd(rb, 0); // ÓÐÅÃ. ËÏÍÁÎÄÁ (ÄÌÑ ×ÙÄÅÌÅÎÎÙÈ ËÏÎÔÒÏÌÌÅÒÏ×)
data = read_int();
if(data != -1) sendword(data); */
}
}
void tty_sig(unsigned char rb){ // ÏÂÒÁÂÏÔËÁ ÓÉÇÎÁÌÏ× Ó ËÏÎÔÒÏÌÌÅÒÁ
unsigned char cno = rb & 0xE0;
rb &= 0x1F;
switch(rb){
case TERMINAL_: terminals(cno); break; // ÏÂÒÁÂÏÔËÁ ËÏÎÃÅ×ÉËÏ×
case STACK_OVERFLOW: error(STACK_OVERFLOW, cno); break; // ÐÅÒÅÐÏÌÎÅÎÉÅ ÓÔÅËÁ RX ËÏÎÔÒÏÌÌÅÒÁ
case NO_STOP_BIT: error(NO_STOP_BIT, cno); break;
}
}
int main(int argc, char *argv[]){
unsigned char rb, key;// ÓÞÉÔÁÎÎÙÅ ÄÁÎÎÙÅ, ÓÞÅÔÞÉË
char *val;
setbuf(stdout, NULL);
printf("Content-type: multipart/form-data; charset=koi8-r\n\n");
if(!killbrothers()) die("îÅ ÍÏÇÕ ÇÁÒÁÎÔÉÒÏ×ÁÔØ ÍÏÎÏÐÏÌØÎÙÊ ÄÏÓÔÕÐ..");
printf("ðÅÒÅÈÏÖÕ × ÒÅÖÉÍ ÄÅÍÏÎÁ\n");
umask(0);
mk_queues();
val = calloc(512, 1);
tty_init();
close(0); close(1); close(2); // ÏÔËÌÀÞÁÅÍÓÑ ÏÔ ÔÅÒÍÉÎÁÌÁ
if(fork() != 0) exit(0); // ÚÁËÒÙ×ÁÅÍ ÒÏÄÉÔÅÌØÓËÉÊ ÐÏÔÏË
if(argc > 1){ //comdev = argv[1];
if(strcmp(argv[1], "XY") == 0){
warn("òÅÖÉÍ XY-ÁËÔÕÁÔÏÒÏ×\n");
if(init_motor(MOTOR_X)==0){ // Ä×ÉÇÁÔÅÌØ Y
err("Y: ïÛÉÂËÁ !");
}
if(init_motor(MOTOR_Y)==0){ // Ä×ÉÇÁÔÅÌØ X
err("X: ïÛÉÂËÁ!");
}
}
}
else
warn("ïÂÙÞÎÙÊ ÒÅÖÉÍ ÒÁÂÏÔÙ");
signal(SIGTERM, quit); // kill (-15)
signal(SIGINT, quit); // ctrl+C
signal(SIGQUIT, SIG_IGN); // ctrl+\ .
signal(SIGTSTP, SIG_IGN); // ctrl+Z
tm0 = dtime();
while(1){ // ÂÅÓËÏÎÅÞÎÏ ÚÁÃÉËÌÉ×ÁÅÍÓÑ
if(read_queue(&rb, &key, val) > 0){
if(key != 0) con_sig(rb, key, val); // ÅÓÌÉ ÞÔÏ-ÔÏ ÐÏÑ×ÉÌÏÓØ - ÏÂÒÁÂÁÔÙ×ÁÅÍ
}
rb = read_tty();
if(rb != 0) tty_sig(rb); // ÅÓÌÉ ÅÓÔØ ÓÉÇÎÁÌ Ó ËÏÎÔÒÏÌÌÅÒÁ - ÏÂÒÁÂÁÔÙ×ÁÅÍ
}
}

View File

@@ -0,0 +1,39 @@
/*********** ðÅÒÅÞÅÎØ ËÏÍÁÎÄ ************/
// ÐÏÌÕÞÉÔØ Ó ËÏÍÐØÀÔÅÒÁ Ä×Á ÂÁÊÔÁ ÄÁÎÎÙÈ É ÚÁÐÉÓÁÔØ ÉÈ × SPI
#define SPI_send 1
// ÒÅÖÉÍÙ ÒÁÂÏÔÙ SPI
#define IMP_RISE 2
#define IMP_FALL 3
#define SPI_ON 4
#define SPI_OFF 5
#define SPI_ACTIVE 6
#define SPI_PASSIVE 7
#define MID_DATA 8
#define END_DATA 9
#define SPI_SHOW 14
// ÓËÏÒÏÓÔÉ ÐÏÒÔÁ (ÐÏ ÕÍÏÌÞÁÎÉÀ 9600)
#define MID_SPD 15
#define HIG_SPD 16
// ÚÁÐÉÓÁÔØ × ÐÏÒÔ ÏÄÉÎ ÐÏÌÕÞÅÎÎÙÊ ÂÁÊÔ
#define SPI_send_one 17
// ÔÅËÕÝÉÊ ÐÅÒÉÏÄ ÔÁÊÍÅÒÁ
#define TMR_SETTINGS 18
// ÕÓÔÁÎÏ×ÉÔØ ÚÎÁÞÅÎÉÅ ÔÁÊÍÅÒÁ
#define SET_TIMER 26
// ÓÂÒÏÓ
#define INIT 28
#define TEST 29
/************** ïÛÉÂËÉ É ÓÉÇÎÁÌÙ ËÏÎÔÒÏÌÌÅÒÁ ******************/
// ×ÓÅ × ÐÏÒÑÄËÅ
#define OK 22
// ÎÅÔ ÓÔÏÐÏ×ÏÇÏ ÂÉÔÁ
#define NO_STOP_BIT 24
// ÐÅÒÅÐÏÌÎÅÎÉÅ ÒÅÇÉÓÔÒÏ×
#define STACK_OVERFLOW 25
// ÏÛÉÂÏÞËÁÑ ËÏÍÁÎÄÁ
#define ERR_CMD 31
#define TWOBYTE 33 // Ä×ÕÈÂÁÊÔÎÁÑ ÐÏÓÙÌËÁ