//----------------------------------------------- void UART_IN(void) { //static char flag; char temp,i,count,index; //int temp_int; di(); count=rx_counter; index=rx_wr_index; ei(); if(count&&(rx_buffer[index_offset(index,-1)])==END) { temp=rx_buffer[index_offset(index,-3)]; if(temp<10) { if(control_check(index_offset(index,-1))) { rx_rd_index=index_offset(index,-3-temp); for(i=0;i<temp;i++) { UIB[i]=rx_buffer[index_offset(rx_rd_index,i)]; } rx_rd_index=index; rx_counter-=count; UART_IN_AN(); } } } //UART_IN_end: //ei(); }
//----------------------------------------------- void uart_in(void) { char temp,i,count; //#asm("cli") //disableInterrupts(); if(rx_buffer_overflow) { rx_wr_index=0; rx_rd_index=0; rx_counter=0; rx_buffer_overflow=0; } if(rx_counter&&(rx_buffer[index_offset(rx_wr_index,-1)])==END) { //rx_offset++; //GPIOD->ODR^=(1<<4); //uart_out (3,CMND,1,33,mdr1/**(((char*)&temp_L)+1)*/,mdr2/**(((char*)&temp_L)+2)*/,mdr3/**(((char*)&temp_L)+3)*/); temp=rx_buffer[index_offset(rx_wr_index,-3)]; if(temp<100) { if(control_check(index_offset(rx_wr_index,-1))) {///uart_out (3,CMND,1,33,mdr1/**(((char*)&temp_L)+1)*/,mdr2/**(((char*)&temp_L)+2)*/,mdr3/**(((char*)&temp_L)+3)*/); //GPIOD->ODR^=(1<<4); rx_rd_index=index_offset(rx_wr_index,-3-temp); for(i=0;i<temp;i++) { UIB[i]=rx_buffer[index_offset(rx_rd_index,i)]; } rx_rd_index=rx_wr_index; rx_counter=0; /*if(UIB[1]==21) { char i; for(i=0;i<64;i++) { UIB[2+i]=rx_offset; } }*/ uart_in_an(); /**/ } } } //#asm("sei") //enableInterrupts(); }
static int select_fd(struct conf *cfp, int sock, int master, int ctrls, int parentfd) { char sockbuf[1024], ptybuf[1024]; struct timeval timeout, *tp = NULL; char *pbp = NULL, *sbp = NULL; ssize_t pcc = 0, scc = 0, n; int rsel, maxfd; (void)non_blocking(sock); (void)non_blocking(master); (void)non_blocking(ctrls); (void)non_blocking(parentfd); (void)signal(SIGTTOU, SIG_IGN); maxfd = sock > master ? sock : master; if (maxfd < ctrls) maxfd = ctrls; if (maxfd < pipechld[0]) maxfd = pipechld[0]; if (maxfd < parentfd) maxfd = parentfd; maxfd += 1; for (;;) { fd_set rset, wset, *omask; FD_ZERO(&rset); FD_ZERO(&wset); omask = (fd_set *) NULL; if (scc) { FD_SET(master, &wset); omask = &wset; } else FD_SET(sock, &rset); if (pcc >= 0) { if (pcc) { FD_SET(sock, &wset); omask = &wset; } else FD_SET(master, &rset); } FD_SET(ctrls, &rset); FD_SET(pipechld[0], &rset); FD_SET(parentfd, &rset); /* * Posix.1g defines timeout parameter to const * Linux uses a value-result timeout */ if (cfp->timeout) { timeout.tv_sec = cfp->timeout; timeout.tv_usec = 0; tp = &timeout; } if ((rsel = select(maxfd, &rset, omask, NULL, tp)) == -1) { if (errno == EINTR) continue; else { syslog(LOG_ERR, "selectfd %m"); return -1; } } if (rsel == 0) { if (tp) { syslog(LOG_INFO, "[%s] session time expired for %s", cfp->session, get_pwentry(cfp->setuser)->pw_name); /* * giving a chance to know timeout * XXX: writen()? */ (void)write(sock, "\r\nsession timeout\r\n", (size_t)19); return 0; } else continue; } if (FD_ISSET(parentfd, &rset)) { char c; (void)read(parentfd, &c, 1); return 0; } if (FD_ISSET(pipechld[0], &rset)) { pid_t pid; int st; char c; if (pipechld[0] != -1) (void)read(pipechld[0], &c, 1); while ((pid = waitpid(-1, &st, WNOHANG|WUNTRACED))) { if (pid < 0) { if (errno == EINTR) continue; else break; } if (WIFSTOPPED(st)) { (void)kill(pid, SIGCONT); continue; } } } if (FD_ISSET(ctrls, &rset)) { struct schck sck; n = read(ctrls, &sck, sizeof(sck)); if (n == sizeof(sck)) (void)control_check(ctrls, &sck, master); } if (FD_ISSET(sock, &rset)) { scc = read(sock, sockbuf, sizeof(sockbuf)); if (scc < 0 && errno == EWOULDBLOCK) scc = 0; else { if (scc <= 0) return (scc) ? -1 : 0; sbp = sockbuf; FD_SET(master, &wset); } } if (FD_ISSET(master, &wset) && scc > 0) { n = write(master, sbp, (size_t)scc); if (n < 0 && errno == EWOULDBLOCK) continue; else if (n < 0) return -1; if (n > 0) scc -= n, sbp += n; } if (FD_ISSET(master, &rset)) { pcc = read(master, ptybuf, sizeof(ptybuf)); if (pcc < 0 && errno == EWOULDBLOCK) pcc = 0; else { if (pcc <= 0) return (pcc) ? -1 : 0; pbp = ptybuf; FD_SET(sock, &wset); } } if (FD_ISSET(sock, &wset) && pcc > 0) { n = write(sock, pbp, (size_t)pcc); if (n < 0 && errno == EWOULDBLOCK) continue; else if (n < 0) return -1; if (n > 0) pcc -= n, pbp += n; } } /* * never reached */ return -1; }
int main(int argc, char** argv) { int ref = EXIT_SUCCESS; srand(OSTimeGet()); control_init(); appTimer = timer_create(); fgl_texture* tempDispTex = fgl_texture_create(320, 240); display* appDisplay = display_create(320, 240, 320, (DISPLAY_FILTER_NEAREST | DISPLAY_FORMAT_RGB565), tempDispTex->data, NULL); if(appDisplay == NULL) return EXIT_FAILURE; fgl_draw_buffer_set(tempDispTex); fgl_texture* tempRenderTarget = fgl_draw_buffer_get(); uint16_t* tempDepth = (uint16_t*)malloc(tempRenderTarget->width * tempRenderTarget->height * 2); if(tempDepth != NULL) fgl_depth_buffer_set(tempDepth); fgl_enable(FGL_DEPTH_TEST); fgl_matrix_mode_set(FGL_MATRIX_VIEWPORT); fgl_matrix_identity(); fgl_viewport(0, 0, fgl_fix16_from_int(320), fgl_fix16_from_int(240)); fgl_matrix_mode_set(FGL_MATRIX_PROJECTION); fgl_matrix_identity(); fgl_perspective((fgl_fix16_pi >> 3), fgl_fix16_div(fgl_fix16_from_int(320), fgl_fix16_from_int(240)), fgl_fix16_one, fgl_fix16_from_int(1024)); fgl_matrix_mode_set(FGL_MATRIX_VIEW); fgl_matrix_identity(); fgl_translate(fgl_fix16_from_int(0), fgl_fix16_from_int(0), fgl_fix16_from_int(10)); fgl_matrix_mode_set(FGL_MATRIX_MODEL); fgl_matrix_identity(); fgl_scale(fgl_fix16_from_int(2), fgl_fix16_from_int(2), fgl_fix16_from_int(2)); fgl_texture* tempTexture = fgl_texture_load_tga("earth.tga"); fgl_texture_bind(tempTexture); fgl_enable(FGL_TEXTURE_2D); //fgl_enable(FGL_CULL_FACE); int sysref; while(appRunning) { sysref = _sys_judge_event(NULL); if(sysref < 0) { ref = sysref; break; } // Control control_poll(); if(control_check(CONTROL_BUTTON_START).pressed && control_check(CONTROL_BUTTON_SELECT).pressed) appRunning = false; else if(control_check(CONTROL_BUTTON_SELECT).pressed && control_check(CONTROL_BUTTON_SELECT).changed) appScreenshot(); if(control_just_pressed(CONTROL_DPAD_UP)) { fgl_matrix_mode_set(FGL_MATRIX_VIEW); fgl_translate(fgl_fix16_from_int(0), fgl_fix16_from_int(0), fgl_fix16_from_int(-1)); fgl_matrix_mode_set(FGL_MATRIX_MODEL); } if(control_just_pressed(CONTROL_DPAD_DOWN)) { fgl_matrix_mode_set(FGL_MATRIX_VIEW); fgl_translate(fgl_fix16_from_int(0), fgl_fix16_from_int(0), fgl_fix16_from_int(+1)); fgl_matrix_mode_set(FGL_MATRIX_MODEL); } // Draw fgl_clear(FGL_COLOR_BUFFER_BIT | FGL_DEPTH_BUFFER_BIT); fgl_draw_sphere(16); fgl_rotate_y(500); display_flip(appDisplay); } fgl_texture_delete(tempTexture); if(tempDepth != NULL) free(tempDepth); timer_delete(appTimer); control_term(); display_delete(appDisplay); return EXIT_SUCCESS; }
@far @interrupt void UARTTxInterrupt (void) { #else void UARTTxInterrupt (void) interrupt 17 { #endif #ifdef _wrk_ if (tx_counter){ --tx_counter; UART1->DR=tx_buffer[tx_rd_index]; if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; } else { bOUT_FREE=1; UART1->CR2&= ~UART1_CR2_TIEN; } #endif } /* //----------------------------------------------- char control_check(char index) { char i=0,ii=0,iii; if(rx_buffer[index]!=END) goto error_cc; ii=rx_buffer[index_offset(index,-2)]; iii=0; for(i=0;i<=ii;i++) { iii^=rx_buffer[index_offset(index,-2-ii+i)]; } if (iii!=rx_buffer[index_offset(index,-1)]) goto error_cc; success_cc: return 1; //goto end_cc; error_cc: return 0; //goto end_cc; //end_cc: //return 0; } //----------------------------------------------- char index_offset (signed char index,signed char offset) { index=index+offset; if(index>=RX_BUFFER_SIZE) index-=RX_BUFFER_SIZE; if(index<0) index+=RX_BUFFER_SIZE; return index; } */ #ifdef _wrk_ //----------------------------------------------- void uart_in(void) { char temp,i,count; //#asm("cli") disableInterrupts(); if(rx_buffer_overflow) { rx_wr_index=0; rx_rd_index=0; rx_counter=0; rx_buffer_overflow=0; } if(rx_counter&&(rx_buffer[index_offset(rx_wr_index,-1)])==END) { //GPIOD->ODR^=(1<<4); temp=rx_buffer[index_offset(rx_wr_index,-3)]; if(temp<100) { if(control_check(index_offset(rx_wr_index,-1))) { //GPIOD->ODR^=(1<<4); rx_rd_index=index_offset(rx_wr_index,-3-temp); for(i=0;i<temp;i++) { UIB[i]=rx_buffer[index_offset(rx_rd_index,i)]; } rx_rd_index=rx_wr_index; rx_counter=0; uart_in_an(); /**/ } } } //#asm("sei") enableInterrupts(); }
//----------------------------------------------- void UART_IN(void) { //static char flag; char temp,i,count; //int temp_int; #asm("cli") //char* ptr; //char i=0,t=0; //int it=0; //signed long int char_int; //if(!bRXIN) goto UART_IN_end; //bRXIN=0; //count=rx_counter; //OUT(0x01,0,0,0,0,0); if(rx_buffer_overflow) { rx_wr_index=0; rx_rd_index=0; rx_counter=0; rx_buffer_overflow=0; } if(rx_counter&&(rx_buffer[index_offset(rx_wr_index,-1)])==END) { temp=rx_buffer[index_offset(rx_wr_index,-3)]; if(temp<10) { if(control_check(index_offset(rx_wr_index,-1))) { rx_rd_index=index_offset(rx_wr_index,-3-temp); for(i=0;i<temp;i++) { UIB[i]=rx_buffer[index_offset(rx_rd_index,i)]; } rx_rd_index=rx_wr_index; rx_counter=0; UART_IN_AN(); } } } UART_IN_end: #asm("sei") } //----------------------------------------------- void OUT (char num,char data0,char data1,char data2,char data3,char data4,char data5) { char i,t=0; char UOB[10]; UOB[0]=data0; UOB[1]=data1; UOB[2]=data2; UOB[3]=data3; UOB[4]=data4; UOB[5]=data5; UOB[6]=0; UOB[7]=0; UOB[8]=0; UOB[9]=0; for (i=0;i<num;i++) { t^=UOB[i]; } UOB[num]=num; t^=UOB[num]; UOB[num+1]=t; UOB[num+2]=END; for (i=0;i<num+3;i++) { putchar(UOB[i]); } }