//clock task __task void clock_task(void){ uint32_t ticks; uint32_t last_keys = 0; uint32_t last_joy = 0; uint32_t value = 0; static unsigned char sec; for(;;){ os_dly_wait(10); ticks++; if(ticks >= 10) { ticks = 0; os_sem_send(&semIncSec); } value = KBD_GetKeys(); os_evt_set((uint16_t)((value ^ last_keys) & ~value),keyTaskId); last_keys = value; value = JOY_GetKeys(); os_evt_set((uint16_t)((value ^ last_joy) & ~value),joyTaskId); last_joy = value; } }
/***sound控制***/ void sound_control(u8 state) { switch(state) { case 0: //不叫 GPIO_ResetBits(GPIOB,BELL);break; case 1: //叫 GPIO_SetBits(GPIOB,BELL);os_sem_send(sound);break; } }
static void sh_main(void) { while(1) { // Wait for start flag os_evt_wait_or(FLAGS_SH_START, NO_TIMEOUT); do { if (swd_is_semihost_event(&r0, &r1)) { if (process_event()) { swd_semihost_restart(r0); } } else { // Wait for 2 scheduler tick; the serial task may run at this point os_dly_wait(2); } // Loop until stop flag is set } while (os_evt_wait_or(FLAGS_SH_STOP, 0 )==OS_R_TMO); // Stopped os_sem_send(semihostStoppedSem); } }
/***接收ad转换数据 读取传感器数值 测量硬币种类***/ __task void get_adc_value(void) { u8 bf=0,read_flash[2],dia_b=0,n; u16 adc_data=0,clear_config=0; u32 adc_buff=0; os_sem_init(adcsem,0); memset(view_detial,0,530); memset(view_send,0,10); memset(read_flash,0,4); ReadFlashNByte(0,read_flash,2); limitup=read_flash[0]+read_flash[1]*256; if(limitup==0||limitup==0xffff) limitup=7500; while(1) { // os_sem_wait(adcsem,0xffff); while(1) { adc_value1=spi_readwrite_byte(SPI1,adc_data); adc_value=change_data(adc_value1); if((1000<adc_value&&adc_value<7500)) break; clear_config++; if(clear_config==50000) { clear_config=0; memset(&refresh,0,8); i=0; //5秒种没有硬币就将计数清零 } os_dly_wait(1); } GPIO_ResetBits(GPIOC,GPIO_Pin_5); os_sem_send(iosem); TIM_Cmd(TIM4,ENABLE); value_count=0; // while(add_count<25) // { while(adc_value<7500) // while(1) { adc_buff=adc_buff+adc_value; add_count++; //采样次数 0.2ms一次 view_detial[view_i][add_count]=adc_value; os_dly_wait(1); adc_value=spi_readwrite_byte(SPI1,adc_data); adc_value=change_data(adc_value); // if(count==50) // break; if(add_count==49) break; } // } // view_detial[view_i][add_count+2]=count; //view_detial数据位后面第二位是金属传感器检测的时间 // count=0; GPIO_SetBits(GPIOC,GPIO_Pin_5); adc_buff=adc_buff/add_count; if(add_count>20) { dia_b=(add_count/2)-2; adc_buff=0; for(n=0;n<5;n++) adc_buff=view_detial[view_i][dia_b+n]+adc_buff; adc_buff=adc_buff/5; } else adc_buff=8888; //调试看数据 view_detial[view_i][0]=add_count; //对金属传感器采样的详细数据个数 view_detial[view_i][add_count+1]=adc_buff; //view_detial数据位后面第一位是对金属传感器采样得到数据的平均值 //*** coin_kind[bf]=deal_value(adc_buff); //比较金属传感器的电压值,得出币种 // if(view_detial[view_i][10]>6000) // coin_kind[bf]=0; view_i++; if(view_i==5) view_i=0; bf++; if(bf==5) bf=0; adc_buff=0; add_count=0; clear_config=0; // os_sem_send(iosem); // os_sem_send(resultsem); } }
/***读取IO状态 对IO特定状态计时 测量硬币直径***/ __task void io_keep_time(void) { u8 bf=0,n=0; os_sem_init(iosem,0); while(1) { os_sem_wait(iosem,0xffff); /***光钎传感器 测直径***/ while(1) { if(get_diasensor_state()==0) { TIM_Cmd(TIM2,ENABLE); TIM_Cmd(TIM4,DISABLE); value_count=0; break; } iotask_overtime(); os_dly_wait(1); } while(1) { if(get_diasensor_state()==1) { TIM_Cmd(TIM2,DISABLE); n=view_detial[view_j][0]; view_detial[view_j][n+2]=count; //view_detial数据位后面第三位是光钎传感器测得的时间 t2=count; count=0; break; } os_dly_wait(1); } /*** ***/ if(coin_kind[bf]!=0) { if(coin_kind[bf]==1&&deal_time(t2)==1) coin_kind[bf]=1; //比较通过时间长度 得出币种 else if(coin_kind[bf]==2&&deal_time(t2)>1) { coin_kind[bf]=deal_time(t2); } else coin_kind[bf]=0; } b_kind=coin_kind[bf]; bf++; if(bf==5) bf=0; view_detial[view_j][n+3]=b_kind; view_j++; if(view_j==5) view_j=0; deal_coin(b_kind); // b_kind=0; if(b_kind==0) os_sem_send(jbsem); // no_i=0; // os_sem_send(rfsem); os_sem_send(resultsem); } }
// //=============================================================== // 主循环任务 //=============================================================== __task void mainLoopTask(void) { static uint32 buzzerTimer; static uint32 tempTimer; static uint32 enterTimer; static bool enterTriFlag; static bool laserTriFlag; gpio.pinMode(PIN_END1_FAN, OUTPUT); gpio.pinMode(PIN_END2_FAN, OUTPUT); mainTaskRunEnable = true; while (taskRunEnable() == false) os_dly_wait(1); while (1) { // //=========================================================== // 激光控制 if (lcd.laserModle == false) { if (laserTriFlag == true) { stepMoto.dev->fanSpeed = 0; laserTriFlag = false; } } else { if (laserTriFlag == false) { gcode.G28(); laserTriFlag = true; gcode.moveAbs (0, 0, para.printer.laserFocus, 0, para.motion.maxSpeed[X_AXIS]/2); for (int i=0; i<MAX_AXIS; i++) { gcode.targetPos[i] = gcode.currentPos[i]; } } } // //=========================================================== // 温度控制 if ((os_time_get() - tempTimer) > PID_DT) { tempHotBed .outManage (); tempHotEnd1.outManage (); if (lcd.laserModle == false) { tempHotEnd2.outManage (); } tempTimer = os_time_get(); } // //=========================================================== // 电机空闲待机 if ((os_time_get() - stepMoto.motoIdleTimer > (uint32)(MOTO_IDLE_TIME*60000)) && (stepMoto.dev->runningFlag == false)){ stepMoto.motoIdleTimer = os_time_get(); gcode.M84(); gcode.printStartTime = 0; } // //=========================================================== //== 蜂鸣器 if (lcd.buzzerFlag) { if ((os_time_get() - buzzerTimer) > 50) { (lcd.buzzerFlag) ? (lcd.buzzerFlag--) : (lcd.buzzerFlag = 0); buzzerTimer = os_time_get(); } gpio.digitalWrite(LCD_BUZZER_PIN, HIGH); } else { buzzerTimer = os_time_get(); gpio.digitalWrite(LCD_BUZZER_PIN, LOW); } // //=========================================================== //== enter 按键 if (gpio.digitalRead(LCD_ENCODENT) == HIGH) { if (((os_time_get() - enterTimer) > 100) && (enterTriFlag == false)){ lcd.encoderEnt = true; lcd.buzzerFlag = 2; enterTriFlag = true; os_sem_send(&lcd.sem_lcd); } } else { enterTimer = os_time_get(); enterTriFlag = false; } // //=========================================================== //== reset 按键 static uint32 resetTimer = 0; static bool pauseTriFlag = false; static bool resetTriFlag = false; if (gpio.digitalRead(LCD_RESET_PIN) == LOW) { if (((os_time_get() - resetTimer) > 200) && (pauseTriFlag == false)){ pauseTriFlag = lcd.pauseFlag = true; lcd.buzzerFlag = 4; } if (((os_time_get() - resetTimer) > 5000) && (resetTriFlag == false)){ resetTriFlag = lcd.resetFlag = true; lcd.buzzerFlag = 10; gcode.stop(); } } else { resetTimer = os_time_get(); pauseTriFlag = resetTriFlag = false; } // //=========================================================== // os_dly_wait(20); } }
void GUI_X_Unlock(void) { os_sem_send(GUI_Semaphore); }