/******************************************************************** * @创建人:揭成 * @功能 : 设置蜂鸣报警,向蜂鸣任务发送信号量 * * @输入 :NONE * *@输出 :NONE ********************************************************************/ void app_global_buz_alarm( Bsize_t stop_jiffies, Bsize_t alarm_jiffies, Bsize_t cycle_times ) { if ( m_buz_task_pro == INVALID_PRO ) return ; os_lock( m_buz_lock ); m_buz_ctl_buf.alarm_time = alarm_jiffies; m_buz_ctl_buf.ctl_times = cycle_times; m_buz_ctl_buf.stop_time = stop_jiffies; os_unlock( m_buz_lock ); os_sem_post( m_buz_sem ); return; }
/******************************************************************** * @创建人:揭成 * @功能 : 设置蜂鸣响应,向蜂鸣任务发送信号量 * * @输入 :NONE * *@输出 :NONE ********************************************************************/ void app_global_buz_response( Bsize_t response_jiffies ) { if ( m_buz_task_pro == INVALID_PRO ) return ; os_lock( m_buz_lock ); m_buz_ctl_buf.alarm_time = response_jiffies; m_buz_ctl_buf.ctl_times = 1; m_buz_ctl_buf.stop_time = 0; os_unlock( m_buz_lock ); os_sem_post( m_buz_sem ); return; }
osal_result os_event_reset( os_event_t* p_event ) { OS_ASSERT( p_event ); /* Make sure that the event was started */ OS_ASSERT( p_event->state == OSAL_INITIALIZED ); os_lock( p_event->lock ); p_event->signaled = false; os_unlock( p_event->lock ); return( OSAL_SUCCESS ); }
osal_result os_event_set( os_event_t* p_event ) { OS_ASSERT( p_event ); /* Make sure that the event was started */ OS_ASSERT( p_event->state == OSAL_INITIALIZED ); os_lock( p_event->lock ); p_event->signaled = true; /* Wake up one */ pthread_cond_signal( &p_event->condvar ); os_unlock( p_event->lock ); return( OSAL_SUCCESS ); }
/******************************************************************** * @创建人:揭成 * @功能 : 蜂鸣任务主体,等待蜂鸣实践的到来 * * @输入 :p_arg 任务参数 * *@输出 :NONE ********************************************************************/ static void app_global_buz_task( void *p_arg ) { msleep( TYPE_DELAY ); while ( 1 ) { if ( os_task_delete_req( SELF_PRO ) == OS_TASK_DEL_REQ )/*判断是否有删除请求*/ { os_task_delete( SELF_PRO ); /*收到删除请求,删除自身任务*/ } if ( os_sem_pend( m_buz_sem, 0) == OS_NO_ERR ) /*等待信号*/ { os_lock( m_buz_lock ); while ( m_buz_ctl_buf.ctl_times > 0 ) /*判断响应次数*/ { BUZ_ON(); msleep( m_buz_ctl_buf.alarm_time ); /*等待响应节拍*/ BUZ_OFF(); msleep( m_buz_ctl_buf.stop_time ); /*等待关时间节拍*/ m_buz_ctl_buf.ctl_times--; /*响应次数减*/ } os_unlock( m_buz_lock ); } } }
void GUI_touch_correct( void ) { app_touch_t shadow; hwin_t*hp; hwin_t*formhwin[5] = {0, }; Bsize_t offset; Bsize_t recnt = 0; touch_coord_t *pmem = ( touch_coord_t* )GUI_MALLOC( 200 ); if ( !pmem ) return; GUI_set_Bgcolor( C_GUI_HIGH_BLUE ); GUI_clean_screen(); hp = GUI_window_creat( 5, 5, LCD_WIDE - 8, LCD_HIGH - 20, WIN_PAINT ); if ( !hp ) { GUI_FREE( pmem ); return; } f_unlink( CORRECT_FILE ); GUI_touch_scale_loade(); os_lock( m_touch_read_lock ); GUI_window_hwin_req( hp ); GUI_set_Bgcolor( C_GUI_BlACK ); GUI_set_Fgcolor( C_GUI_WHITE ); formhwin[0] = GUI_form_creat( 0, 0, 2, 2, 20, 20, hp ); formhwin[1] = GUI_form_creat( GET_XBORDER( hp ) - 45, 0, 2, 2, 20, 20, hp ); formhwin[2] = GUI_form_creat( 0, GET_YBORDER( hp ) - 45, 2, 2, 20, 20, hp ); formhwin[3] = GUI_form_creat( GET_XBORDER( hp ) - 45, GET_YBORDER( hp ) - 45, 2, 2, 20, 20, hp ); formhwin[4] = GUI_form_creat( hp->win_wide / 2 - 20, hp->win_high / 2 - 20, 2, 2, 20, 20, hp ); while ( 1 ) { offset = 0; while ( offset < 5 ) { GUI_touch_wait_data( &shadow ); pmem[offset].touchx = shadow.x; pmem[offset].touchy = shadow.y; if ( !GUI_touch_error_match( &shadow, formhwin[offset] ) ) { // GUI_string_display_At( 100, 50, "误差太大" ); if ( ++recnt < 8 ) continue; else { GUI_window_hwin_release( hp ); GUI_window_destory( hp ); GUI_FREE( pmem ); os_unlock( m_touch_read_lock ); return; } } recnt = 0; pmem[offset].lcdx = formhwin[offset]->win_x + 20; pmem[offset].lcdy = formhwin[offset]->win_y + 20; GUI_window_hwin_req( formhwin[offset] ); GUI_set_Fgcolor( C_GUI_RED ); GUI_WINDIS_HLINE( 0, formhwin[offset]->win_wide, formhwin[offset]->win_high / 2 ); GUI_WINDIS_VLINE( formhwin[offset]->win_wide / 2, 0, formhwin[offset]->win_high ); GUI_window_hwin_release( formhwin[offset] ); offset++; } if ( !GUI_touch_scale_count( pmem ) ) { for ( offset = 0;offset < 5;offset++ ) { GUI_window_hwin_req( formhwin[offset] ); GUI_set_Fgcolor( C_GUI_WHITE ); GUI_WINDIS_HLINE( 0, formhwin[offset]->win_wide, formhwin[offset]->win_high / 2 ); GUI_WINDIS_VLINE( formhwin[offset]->win_wide / 2, 0, formhwin[offset]->win_high ); GUI_window_hwin_release( formhwin[offset] ); } continue; } break; } GUI_set_Fgcolor( C_GUI_WHITE ); GUI_set_Bgcolor( C_GUI_HIGH_BLUE ); GUI_string_display_At( 100, 100, "修正完成" ); GUI_window_hwin_release( hp ); GUI_window_destory( hp ); GUI_FREE( pmem ); os_unlock( m_touch_read_lock ); return; }
osal_result os_event_wait( os_event_t* p_event, unsigned long wait_ms) //in milliseconds { osal_result status; int wait_ret; struct timespec timeout; struct timeval curtime; OS_ASSERT( p_event ); /* Make sure that the event was Started */ OS_ASSERT( p_event->state == OSAL_INITIALIZED ); os_lock( p_event->lock ); /* Return immediately if the event is signalled. */ if( p_event->signaled ) { if( !p_event->manual_reset ) { p_event->signaled = false; } os_unlock( p_event->lock ); return( OSAL_SUCCESS ); } /* If just testing the state, return OSAL_TIMEOUT. */ if( wait_ms == 0 ) { os_unlock( p_event->lock ); return( OSAL_TIMEOUT ); } if( wait_ms == EVENT_NO_TIMEOUT ) { /* Wait for condition variable to be signaled or broadcast. */ /* WARNING! Layering violation. Assumes os_lock_t is a (pthread_mutex_t *) */ if( (wait_ret = pthread_cond_wait( &p_event->condvar, p_event->lock ))){ status = OSAL_NOT_DONE; } else { status = OSAL_SUCCESS; } } else { /* Get the current time */ if( gettimeofday( &curtime, NULL ) != 0 ) { status = OSAL_ERROR; } else { timeout.tv_sec = curtime.tv_sec + (wait_ms / 1000); timeout.tv_nsec = (curtime.tv_usec + (wait_ms % 1000)*1000) * 1000; // check that tv_nsec is less than a second. Don't // let it overflow or you'll be sorry if(timeout.tv_nsec >= 1000000000){ timeout.tv_sec++; timeout.tv_nsec -= 1000000000; } /* WARNING! Layering violation. Assumes os_lock_t is a (pthread_mutex_t *) */ wait_ret = pthread_cond_timedwait( &p_event->condvar, p_event->lock, &timeout ); if( wait_ret == 0 ) { status = OSAL_SUCCESS; } else if( wait_ret == ETIMEDOUT ) { status = OSAL_TIMEOUT; } else { status = OSAL_NOT_DONE; } } } if( !p_event->manual_reset ) { p_event->signaled = false; } os_unlock( p_event->lock ); return( status ); }
void EXTIOLOCK(void) { os_lock(EXTIO_lock); return; }