/* initialize the IO subsystems for the appropriate dongles */ static void io_init(void) { #ifdef IMME #ifdef IMMEDONGLE // CC1110 on IMME pink dongle // IM-ME Dongle. It's a CC1110, so no USB stuffs. Still, a bit of stuff to init for talking // to it's own Cypress USB chip P0SEL |= (BIT5 | BIT3); // Select SCK and MOSI as SPI P0DIR |= BIT4 | BIT6; // SSEL and LED as output P0 &= ~(BIT4 | BIT2); // Drive SSEL and MISO low P1IF = 0; // clear P1 interrupt flag IEN2 |= IEN2_P1IE; // enable P1 interrupt P1IEN |= BIT1; // enable interrupt for P1.1 P1DIR |= BIT0; // P1.0 as output, attention line to cypress P1 &= ~BIT0; // not ready to receive #else // full blown IMME with screen and keyboard //Disable WDT IEN2&=~IEN2_WDTIE; IEN0&=~EA; setIOPorts(); configureSPI(); LCDReset(); //Startup display. setDisplayStart(0); SSN = LOW; setNormalReverse(0); erasescreen(); drawstr(0,0, "IMME SNIFF v0.1"); SSN = HIGH; //immeLCDInitScreen(); //sleepMillis(100); #endif #else // CC1111 #ifdef DONSDONGLES // CC1111 USB Dongle // turn on LED and BUTTON P1DIR |= 3; // Activate BUTTON - Do we need this? //CC1111EM_BUTTON = 1; #else // CC1111 USB (ala Chronos watch dongle), we just need LED P1DIR |= 3; #endif // CC1111 #ifndef VIRTUAL_COM // Turn off LED LED = 0; #endif #endif // conditional }
void fail(char *msg){ u8 i=0; LED_RED=LOW; SSN = LOW; erasescreen(); drawstr(1,2,"FATAL ERROR:"); drawstr(2,2,msg); SSN = HIGH; for(i=0;i<5;i++) sleepMillis(1000); //reset(); }
static int deal(FILE *fp, char *filename, int pipemode) { color *image; void (*outputcolor)(); int width, height, comp, i, j, istep, jstep, ch, scale, scalew, scaleh, offset, imagewidth, imageheight, margintopbottom, marginleftright, marginleft, margintop, paddingtopbottom, paddingleftright, paddingleft, paddingright, paddingtop, paddingbottom, ipaddingleftright, ipaddingleft, ipaddingright; image = stbi_load_from_file(fp, &width, &height, &comp, 0); /* error handling */ if (image == NULL) { if ((!qflag) && (stbi_failure_reason() != NULL)) warnx("%s: %s", filename, stbi_failure_reason()); goto ERR_DEAL; } if (width <= 0 || height <= 0) { if (!qflag) warnx("%s %s (width: %d, height: %d)", filename, "is an invalid image", width, height); goto ERR_DEAL; } /* ok, it is surely a valid image */ /* get terminal size before processing each image */ terminalsize(); /* set scale parameters */ scale = 1; if (Sflag) { if (cflag) outputcolor = outputcolor_3; else outputcolor = outputcolor_1; scale = (int)Sval; /* TODO */ istep = 2 * (jstep = scale); imageheight = (int)ceil((double)height / (double)istep); imagewidth = (int)ceil((double)width / (double)jstep); } else if (2 * width <= outputwidth && height <= outputheight) { if (cflag) outputcolor = outputcolor_4; else outputcolor = outputcolor_2; istep = jstep = 1; imagewidth = width * 2; imageheight = height; } else { if (cflag) outputcolor = outputcolor_3; else outputcolor = outputcolor_1; scalew = (int)ceil((double)width / (double)outputwidth); scaleh = (int)ceil((double)height / 2.0 / (double)outputheight); if (Hval == 0 && hval == 0 && (wval > 0 || Wval > 0)) scale = scalew; else if ((hval > 0 || Hval > 0) && wval == 0 && Wval == 0) scale = scaleh; else scale = ((scalew) > (scaleh) ? (scalew) : (scaleh)); istep = 2 * (jstep = scale); imageheight = (int)ceil((double)height / (double)istep); imagewidth = (int)ceil((double)width / (double)jstep); } if (istep * jstep >= INT_MAX / 256 || width * height >= INT_MAX / 3) { if (!qflag) warnx("%s %s (width: %d, height: %d)", filename, "is too large", width, height); goto ERR_DEAL; } /* setting parameters */ margintopbottom = terminalheight - outputheight - iflag; marginleftright = terminalwidth - outputwidth; paddingtopbottom = outputheight - imageheight; paddingleftright = outputwidth - imagewidth; if (Rflag && !Lflag) { marginleft = marginleftright; } else if (Lflag && !Rflag) { marginleft = 0; } else if ((Lflag && Rflag) || Cflag || Tflag || Bflag) { marginleft = marginleftright / 2; } else { marginleft = 0; } if (PRflag && !PLflag) { paddingleft = paddingleftright; } else if (PLflag && !PRflag) { paddingleft = 0; } else if ((PLflag && PRflag) || PCflag || PTflag || PBflag) { paddingleft = paddingleftright / 2; } else if (Rflag && !Lflag) { paddingleft = paddingleftright; } else if (Lflag && !Rflag) { paddingleft = 0; } else if ((Lflag && Rflag) || Cflag || Tflag || Bflag) { paddingleft = paddingleftright / 2; } else { paddingleft = 0; } if (Bflag) { margintop = margintopbottom; } else if (Tflag) { margintop = 0; } else if (Cflag) { margintop = margintopbottom / 2; } else { margintop = 0; } if (PBflag) { paddingtop = paddingtopbottom; } else if (PTflag) { paddingtop = 0; } else if (PCflag) { paddingtop = paddingtopbottom / 2; } else if (Bflag) { paddingtop = paddingtopbottom; } else if (Tflag) { paddingtop = 0; } else if (Cflag) { paddingtop = paddingtopbottom / 2; } else { paddingtop = 0; } paddingright = paddingleftright - paddingleft; paddingbottom = paddingtopbottom - paddingtop; /* start up */ setdefaultcolor(); if (uflag) { cursorhide(); cursorsave(); } /* main process */ if (Eflag && filecount == 0) erasescreen(); if (Cflag || Tflag || Bflag) { if (!eflag) { if (margintop >= 0) cursormove(margintop + 1, 1); for (i = 0; i < paddingtop; i++) { if (marginleft > 0) cursorforward(marginleft); replicatespace(outputwidth); cursordown_cursorhorizontalabsolute(); } } if (margintop + paddingtop >= 0) cursormove(margintop + paddingtop + 1, 1); } if (iflag) { ipaddingleftright = outputwidth - strlen(filename); if (PRflag && !PLflag) { ipaddingleft = ipaddingleftright; } else if (PLflag && !PRflag) { ipaddingleft = 0; } else if ((PLflag && PRflag) || PCflag || PTflag || PBflag) { ipaddingleft = ipaddingleftright / 2; } else if (Rflag && !Lflag) { ipaddingleft = ipaddingleftright; } else if (Lflag && !Rflag) { ipaddingleft = 0; } else if ((Lflag && Rflag) || Cflag || Tflag || Bflag) { ipaddingleft = ipaddingleftright / 2; } else { ipaddingleft = 0; } ipaddingright = ipaddingleftright - ipaddingleft; if (Cflag || Lflag || Rflag || Tflag || Bflag || PCflag || PLflag || PRflag || PTflag || PBflag) { if (marginleft > 0) cursorforward(marginleft); if (ipaddingleft > 0) { if (eflag) { cursorforward(ipaddingleft); } else { replicatespace(ipaddingleft); } } else if (ipaddingleftright < 0) { filename[outputwidth] = '\0'; } } printf("%s", filename); if (Cflag || Tflag || Bflag || PCflag || PTflag || PBflag) { if (ipaddingright > 0) { if (!eflag) { replicatespace(ipaddingright); } } if (Cflag || Tflag || Bflag) { cursordown_cursorhorizontalabsolute(); } else { newline(); } } else { newline(); } } for (i = 0; i < height; i += istep) { if (Cflag || Lflag || Rflag || Tflag || Bflag || PCflag || PLflag || PRflag || PTflag || PBflag) { if (marginleft > 0) cursorforward(marginleft); if (paddingleft > 0) { if (eflag) { cursorforward(paddingleft); } else { replicatespace(paddingleft); } } } for (j = 0; j < width; j += jstep) { offset = (i * width + j) * comp; outputcolor(image, height, width, offset, i, j, (i + istep > height ? height - i : istep), (j + jstep > width ? width - j : jstep), comp); } setdefaultcolor(); if (Cflag || Tflag || Bflag || PCflag || PTflag || PBflag) { if (paddingright > 0) { if (!eflag) { replicatespace(paddingright); } } if (Cflag || Tflag || Bflag) { cursordown_cursorhorizontalabsolute(); } else { newline(); } } else { newline(); } } if (Cflag || Tflag) { if (!eflag) { for (i = 0; i < paddingbottom; i++) { if (marginleft > 0) cursorforward(marginleft); if (outputwidth > 0) replicatespace(outputwidth); cursordown_cursorhorizontalabsolute(); } } } /* clean up */ setdefaultcolor(); if (uflag) { cursorunsave(); cursorshow(); } fflush(stdout); stbi_image_free(image); ++filecount; /* debug mode */ if (dflag) { cursorsave(); cursormove(1, 1); printf(PACKAGE); if (iflag) printf(" -i"); if (qflag) printf(" -q"); if (sflag) printf(" -s %lf", sval); if (rflag) printf(" -r %ld", rval); if (Lflag) printf(" -L"); if (Rflag) printf(" -R"); if (Cflag) printf(" -C"); if (Tflag) printf(" -T"); if (Bflag) printf(" -B"); if (Eflag) printf(" -E"); if (hflag) printf(" -h %ld", hval); if (Hflag) printf(" -H %ld", Hval); if (wflag) printf(" -w %ld", wval); if (Wflag) printf(" -W %ld", Wval); printf(" %s\n", filename); printf("terminalwidth: %d\n", terminalwidth); printf("terminalheight: %d\n", terminalheight); printf("outputwidth: %d\n", outputwidth); printf("outputheight: %d\n", outputheight); printf("imagewidth: %d\n", imagewidth); printf("imageheight: %d\n", imageheight); printf("margintop: %d\n", margintop); printf("marginleft: %d\n", marginleft); printf("paddingtop: %d\n", paddingtop); printf("paddingleft: %d\n", paddingleft); printf("paddingbottom: %d\n", paddingbottom); printf("paddingright: %d\n", paddingright); fflush(stdout); cursorunsave(); } /* check next file if pipe or fifo */ if (pipemode) { ch = getc(fp); if (ch != EOF) { if (ch != '\0' && ch != '\n') { ungetc(ch, fp); } else if ((ch = getc(fp)) != '\0' && ch != '\n') { ungetc(ch, fp); } else if ((ch = getc(fp)) != '\0' && ch != '\n') { ungetc(ch, fp); } if (ch != EOF) { if (sflag && sval > 0) { usleep(sval * 1e6); } deal(fp, filename, pipemode); } } } return 0; ERR_DEAL: return 1; }
static inline void erasescreen_cursorhome(void) { erasescreen(); cursorhome(); }