static void programer(set s) { set s1, s2; if(setpower(s) > 1) { split(s,&s1,&s2); prgcode[ncode][0] = set_first(&s1,1); prgcode[ncode][1] = set_first(&s2,1); ncode++; programer(s1); programer(s2); } }
int main() { laseron = 0; led1=led2=led3=enable=0; int cnt = 0; pc.printf("Starting\n\r"); pwm.period(1.0/PWMFREQ); setpower(pwr); while(1) { if (button) { setpower(pwr); pc.printf("Fire laser\n\r"); enable = led3 = 1; while (button) wait(0.01); enable = led3 = 0; cnt = 0; } wait(0.01); if (cnt++ > 500) { cnt = 0; led1 = !led1; } } }
static void init(Hci *hp) { Ctlr *ctlr; Dwcregs *r; uint n, rx, tx, ptx; ctlr = hp->aux; r = ctlr->regs; ctlr->nchan = 1 + ((r->ghwcfg2 & Num_host_chan) >> ONum_host_chan); ctlr->chanintr = malloc(ctlr->nchan * sizeof(Rendez)); r->gahbcfg = 0; setpower(PowerUsb, 1); while((r->grstctl&Ahbidle) == 0) ; greset(r, Csftrst); r->gusbcfg |= Force_host_mode; tsleep(&up->sleep, return0, 0, 25); r->gahbcfg |= Dmaenable; n = (r->ghwcfg3 & Dfifo_depth) >> ODfifo_depth; rx = 0x306; tx = 0x100; ptx = 0x200; r->grxfsiz = rx; r->gnptxfsiz = rx | tx<<ODepth; tsleep(&up->sleep, return0, 0, 1); r->hptxfsiz = (rx + tx) | ptx << ODepth; greset(r, Rxfflsh); r->grstctl = TXF_ALL; greset(r, Txfflsh); dprint("usbotg: FIFO depth %d sizes rx/nptx/ptx %8.8ux %8.8ux %8.8ux\n", n, r->grxfsiz, r->gnptxfsiz, r->hptxfsiz); r->hport0 = Prtpwr|Prtconndet|Prtenchng|Prtovrcurrchng; r->gintsts = ~0; r->gintmsk = Hcintr; r->gahbcfg |= Glblintrmsk; }
static void split(set s,set *ss1,set *ss2) { int nsub; set s1_, s2_,s1,s2; int w, w_; int i, j, l, cross, cross_,dim; int *nextelem; dim=1<<(setpower(s)-1); nextelem=m_alloc(dim*sizeof(int)); for(l=set_first(&s,1),w=0,nsub=0;l; ) { int l1; w += vertinfo[l-1].weight; l1=set_first(&s,l+1); if(l1) { nextelem[nsub]=l; for(i=1; i<=nsub; i++) nextelem[nsub+i]=-nextelem[nsub-i]; nsub = 2 * nsub + 1; } l=l1; } l = nextelem[0]-1; w -= 2 * vertinfo[l].weight; s2=set_constr(l+1,_E); s1=set_aun(s,s2); cross = 0; for(j=0; j<vertinfo[l].vlnc; j++) if(set_in(vertinfo[l].link[j],s1))cross++; s1_=s1; s2_=s2; w_ = w; cross_ = cross; for (i = 1; i < nsub; i++) { l = abs(nextelem[i])-1; if (nextelem[i] > 0) { set_del1(&s1_,l+1); for (j = 0; j < vertinfo[l].vlnc; j++) { int ll=vertinfo[l].link[j]; if(set_in(ll,s1_)) (cross_)++; else if(set_in(ll,s2_)) (cross_)--; } set_add1(&s2_,l+1); w_ -= 2 * vertinfo[l].weight; } else { set_del1(&s2_,l+1); for (j = 0; j < vertinfo[l].vlnc; j++) { int ll=vertinfo[l].link[j]; if(set_in(ll,s2_)) (cross_)++; else if(set_in(ll,s1_)) (cross_)--; } set_add1(&s1_,l+1); w_ += 2 * vertinfo[l].weight; } if (MEMORY_OPTIM) { if(abs(w_) < abs(w) || (abs(w_) == abs(w) && cross_ < cross)) { s1=s1_; s2=s2_; w = w_; cross = cross_; } } else { if(cross_ < cross || (cross_ == cross && abs(w_) < abs(w))) { s1=s1_; s2=s2_; w = w_; cross = cross_; } } } free(nextelem); *ss1=s1; *ss2=s2; }