byte USB_data[1024]; int USB_data_pointer=0; int USB_data_length=0; long USB_time_pointer; unsigned long long curhtime,measurestarthtime,holdstarthtime,senddatatime; double measuretime,dtime,holdtime; int senddataon=0; //turn on datasend int holdon=1; int measureon=0; int running_p=0; int makeonestep=0; int USB_ready=0; int power_enabled=0; int poweron=0; double temp=0; double rate=0; double signedrate=0; double tempto=0; double holduntiltime=0; double zero2=0; double hpower; double tempm_1,tempm_2; double tempmax=600; int timep=0; double q[8]; double lagarray[ISIZE]; double diffarray[DSIZE]; double posdata[DSIZE]; int programpointer=0; int programfill=0; int programfillpointer=0; int saverequest=0; int diffpointer=0; int lagpointer=0; int da2=0; int life=0; int param; double paramdata; unsigned long long t1; unsigned long long t2; long long time_max=0; unsigned long long ledt; unsigned long long t_onestep; unsigned long long t_current; int next=0; int running_v=0; int error_x=0; int error_y=0; char bt[32]; int connectedp=0; int runingp=0; struct data_t{ double ad[8]; double mtime; double cont; // it was temp double rate; double paramdata; int param; }; struct data_t data; unsigned long long currenttime; unsigned long long runningtime; unsigned long long connectedtime; void init_data() { q[0]=1.12; q[1]=2.12; q[2]=3.12; q[3]=4.12; q[4]=5.12; q[5]=6.12; da[0]=10.2; da[1]=20.2; d_in=127; d_out=66; measuretime=1000; param=244; paramdata=700.18; senddataon=1; } double get_double(int start) { int i; double d; char *bytePointer = (char *)&d; for (i=0;i70) gpio_put(LED1, 0); else gpio_put(LED1, 1);; lagarray[lagpointer]=temp-tempm_2; hpower=0; for (j=0;j1.0) hpower=1; if (poweron==0) hpower=0; if (lagarray[lagpointer]<0) hpower=0; if (tempm_1>tempmax) hpower=0; if (tempm_2>tempmax) hpower=0; data.ad[7]=hpower; data.mtime=measuretime; data.cont=temp; data.rate=signedrate; data.param=curprogram.param+ 256*(measureon+4*saverequest+8*running_v+32*poweron); data.paramdata=curprogram.paramdata; if ((holdon)&& (curprogram.param!=SRATE)) data.paramdata=holduntiltime-holdtime; data.ad[0]=dT; data.ad[1]=tempm_1; data.ad[2]=tempm_2; data.ad[3]=temp; data.ad[4]=temp-tempm_2; data.ad[5]=20*(q[3]); //power back; } void sethold(double t) { curprogram.param=SHOLD; curprogram.paramdata=t; holdon=1; holdstarthtime=curhtime; holduntiltime=t; } void timesget(void) { unsigned long long t =millis(); dtime=((double) (t-curhtime))*1000.0; curhtime=t; //Serial.println(measureon); if (!measureon) measurestarthtime=t; if (!holdon) holdstarthtime=t; measuretime=((double) (t-measurestarthtime))*1000.0; holdtime=((double) (t-holdstarthtime))*1000.0; } void limits(int arg) { if (curprogram.param==SLAMPTEST) { if (tempm_10)&&(temp>=tempto)) next=1; if ((signedrate<0)&&(temp<=tempto)) next=1; } if (holdon) { if (holdtime>=holduntiltime) next=1; } return; } void nextp(int arg) { if (!next) return; next=0; programpointer++; curprogram=program_s[programpointer]; switch(curprogram.param){ case SFINISH: running_v=0; sethold(1e30); break; case SHOLD: sethold(curprogram.paramdata); break; case SRATE: rate=curprogram.paramdata; next=1; break; case STO: poweron=1; power_enabled=1; tempto=curprogram.paramdata; holdon=0; signedrate=rate; if (temp>tempto) signedrate=-rate; break; case SSAVE: sethold(1e30); saverequest=1; break; case SMEASUREON: measureon=1; next=1; break; case SMEASUREOFF: measureon=0; next=1; break; case SLAMPTEST: break; case SBACK: temp=curprogram.paramdata; sethold(1e30); break; case SID: temp=0; sethold(1e30); break; case SPOWER: poweron=(int)curprogram.paramdata; next=1; break; } return; } void dasout(int arg) { r_da(0,5.0*hpower); //printf("%f\n",hpower); if (poweron==1) gpio_put(LED3, 0); else gpio_put(LED3, 1); return; } void onestep(void) { struct program_t pp; //if (!USB_ready) return; if (!dostepp) return; dostepp=0; t1 =micros(); timesget(); if ((!holdon) && (curprogram.param!=SLAMPTEST)) temp+=signedrate*dtime; dataget(1); dasout(1); if (power_enabled) gpio_put(EN, 1); else gpio_put(EN, 0); limits(1); nextp(1); t2=micros()-t1; if (t2>time_max) { time_max=t2; } return; } void time_onestep(void) { t_current=micros(); if (running_v) { if ((t_current-t_onestep)>5000) { t_onestep=t_current; dostepp=1; } } else { if ((t_current-t_onestep)>20000) { t_onestep=t_current; dostepp=1; } } } String fill_serial_buff_data(String s,double d) { ftoa(bt,d,8); return s+String(bt); } void interpretlast(void) { int i=0; int j; double mv1,mv2; if (programfill) { programfillpointer++; if (programfillpointer>PROGRAMSIZE) { programfillpointer=PROGRAMSIZE; lastp.param=SFINISH; } program_s[programfillpointer]=lastp; if (lastp.param==SFINISH) { programpointer=0; programfill=0; } } else switch(lastp.param){ case SFILL: programfill=1; programfillpointer=0; for (i=1;iINSTNUM) { Serial.print("MS Illegal intruction "); done=1; return -1; } } lastp.paramdata=dd.toDouble(); //Serial.print("MS ");Serial.println(lastp.param); //Serial.print("MS ");Serial.println(lastp.paramdata); return 1; } int do_serials( String input) { int i=0; if (input.equals("HELP")) {for (i=0;i0) interpretlast(); //Serial.print(lastp.param); Serial.print(' '); Serial.println(lastp.paramdata); return -1; } ss=Serial.readStringUntil(char(13)); s=s+ss; if (do_serials(s)>0) { interpretlast(); return -1; } else { Serial.println("MS Wrong data ."+s+"!"); return -2; } } void main_step(void) { int i; unsigned long long t=millis(); if (t-ledt>50000) { //Serial.println("off"); //REG_PIOB_SODR =(1<<16); // LED off; poweron=0; //REG_PIOB_SODR =(1<<15); } int p=get_bytes_from_USB(); if (p==0) { lastp.param=get_double(0); lastp.paramdata=get_double(8); if ((lastp.param!=SRESET) && (lastp.param!=SSENDDATA) && (lastp.param!=SID)) { Serial.print("MS Get data from USB "); Serial.print(lastp.param); Serial.print(" "); Serial.println(lastp.paramdata); } if (lastp.param==SUSB_READY) { USB_ready=1; } interpretlast(); } } void initdevice(void) { initboard(); init_data(); gpio_init(EN); gpio_set_dir(EN, GPIO_OUT); gpio_put(EN, 0); gpio_init(LED1); gpio_set_dir(LED1, GPIO_OUT); gpio_put(LED1, 0); gpio_init(LED2); gpio_set_dir(LED2, GPIO_OUT); gpio_put(LED2, 0); gpio_init(LED3); gpio_set_dir(LED3, GPIO_OUT); gpio_put(LED3, 1); runningtime=millis();; connectedtime=millis(); temp=15; program_s[0].param=SHOLD; program_s[0].paramdata=1e30; q[1]=0.0; q[2]=0.0; signedrate=0; //send_data(0x101); //send_data('s'); //send_data(0x100); }