From fc401e372045a728e182cd775e854a404de4bbe4 Mon Sep 17 00:00:00 2001 From: knolax <1339802534.kk@gmail.com> Date: Thu, 21 Apr 2016 04:39:31 -0400 Subject: initial commit :x --- main.c | 230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 main.c (limited to 'main.c') diff --git a/main.c b/main.c new file mode 100644 index 0000000..8f8a91d --- /dev/null +++ b/main.c @@ -0,0 +1,230 @@ +#include "rs232.h" +#include +#include + +int port; // port of the arduinov +typedef struct servo servo; +struct servo { + int Degree; // current degree + unsigned char ADegree; // actual degree + int Center; // center degree from calibration // difference from 90 + int Limit; //limit, eg 0- 180 + int Rate; // how many degrees to increase per time + char Header; // character that is sent + char Name[] ; // name +}; +servo B_S = { 90,90,0,180,1,'B',"Base Servo" }; // base servo position +servo J_S = { 90,90,0,180,1,'J',"Joint Servo"}; // joint servo +servo A_S = { 90,90,0,180,1,'A',"Manipulator Assembly Servo"};// manipulator assembly servo +servo M_S = { 90,90,0,180,1,'J',"Manipulator Servo"}; // manipulator servo +int maxx; +int maxy; +int loop; +int change (servo rservo) { +} +int update ( servo *rservop,int increment) { + servo rservo = *rservop; + int err; + char tempstring [10]; // 10 byte buffer, sprintf should end with null + rservo.Degree =rservo.Degree + increment*rservo.Rate; + if (rservo.Degree + rservo.Center > rservo.Limit) { + rservo.Degree = rservo.Limit - rservo.Center; + mvprintw(maxy*3/4+1,0," %s at limit %d degrees",rservo.Name,rservo.Limit); + } + if (rservo.Degree + rservo.Center < 0) { + rservo.Degree = 0 - rservo.Center; + mvprintw(maxy*3/4,0," %s at limit %d degrees",rservo.Name,0); + } + rservo.ADegree = rservo.Degree + rservo.Center; + *rservop = rservo; + err = RS232_SendBuf(port,&(rservo.Header),1); + if (err) { + mvprintw(maxy*3/4,0,"unable to send header "); + return err; + } + err = RS232_SendBuf(port,&(rservo.ADegree),1); + if (err) { + mvprintw(maxy*3/4,0,"unable to send ADegree "); + return err; + } else { + mvprintw(maxy*3/4,0,"sent ADegree %d",rservo.ADegree); + } + //sprintf(tempstring,"%d",rservo.Degree); + //RS232_cputs(port,tempstring); // no error , returns void + return 0; +} +int startcomm (int rport) { + int err = RS232_OpenComport(rport ,9600,"8N1"); + if (err) { + mvprintw(maxy/2,maxx/2,"couldn't open port %s",comports[port]); + return err; + } + mvprintw(maxy/2,maxx/2,"opened %s succesfully",comports[port]); + return 0; +} +int end () { + echo(); + nocbreak(); + endwin(); + RS232_CloseComport(port); +} +int init () { + WINDOW *errw; // because initscr is only function + int err; + printf("initscr ...\n"); + errw = initscr(); // present window called scr , returns *WINDOW, not int + if (errw == NULL) { + printf("initscr failed\n"); + return 1; + } + maxx = getmaxx(stdscr); + maxy = getmaxy(stdscr); + cbreak(); // no need for enter + noecho(); // no display char + keypad(stdscr,TRUE); // allows f-keys + mvprintw(maxy/2,maxx/2,"%d %d",maxy,maxx); //w here is just to indicate curses + err = startcomm(port); + if (err) { + return err; + } + return 0; +} +int display() { + // y then x, top > bottom , left > right + char tempstring[40]; + mvprintw(0,0,"port: %s",comports[port]); + mvprintw(1,0,"aparent angle | actual angle"); + mvprintw(2,0,"base servo angle: %d | %u ",B_S.Degree,B_S.ADegree); + + mvprintw(3,0,"joint servo angle: %u | %d ",J_S.Degree,(unsigned int)J_S.ADegree); + + mvprintw(4,0,"manipulator assembly servo angle: %d | %u ",A_S.Degree,(unsigned int)A_S.ADegree); + + mvprintw(5,0,"manipulator servo angle : %d | %u ",M_S.Degree,(unsigned int)M_S.ADegree); + return 0; + + +} +int setting() { + int rloop = 1; + int key; + int i = 0; + int v = port; + clear(); + while (rloop) { + clear(); + while (i < 38) { + if (i == v) { + mvprintw(i,maxx/2+5,"<--"); + } + if (i == port) { + mvprintw(i,maxx/2-14,"[*] %s",comports[i]); + } else { + mvprintw(i,maxx/2-10,"%s",comports[i]); + } + i++; + } + mvprintw(38,0," s and d for the base servo, f to center\n w and e for joint servo r to center\n x and c for manipulator v to set\n i and k for up and down assembly servo o to center"); + i = 0; + key = getch(); + switch (key) { + case KEY_UP : + v--; + break; + case KEY_DOWN : + v++; + break; + case ' ' : + RS232_CloseComport(port); + port = v; + int err = startcomm(port); + rloop = 0; + clear(); + return 0; + break; + case 'q' : + clear(); + rloop = 0; + break; + } + if (v >= 38) { + v = 0; + } + if (v < 0) { + v = 37; + } + } + + return 0; +} +int input() { + int err; + int key; + key = getch(); + + switch (key) { + case 'q': + mvprintw(maxy/2,maxx/2,"quitting",maxy,maxx); + loop = 0; + break; + case 's' : + update(&B_S,-1); + break; + case 'd' : + update(&B_S,+1); + break; + case 'f' : + B_S.Center = B_S.Degree - 90; + break; + + case 'w' : + update(&J_S,-1); + break; + case 'e' : + update(&J_S,+1); + break; + case 'r' : + J_S.Center = J_S.Degree - 90; + break; + + case 'x' : + update(&M_S,-1); + break; + case 'c' : + update(&M_S,+1); + break; + case 'v' : + M_S.Center = M_S.Degree - 90; + break; + + case 'i' : + update(&A_S,-1); + break; + case 'k' : + update(&A_S,+1); + break; + case 'o' : + A_S.Center = A_S.Degree - 90; + break; + + + + case 'p' : + setting(); + break; + + } + if (err) { + return err; + } + return 0; +} +int main () { + loop = 1; + init(); + while (loop == 1) { + display(); + input(); + } + end(); +} -- cgit v1.1