Пример #1
0
void playSong(void* pdata)
{
    
    fprintf(lcd, "%c%s", esc, LCD_CLR);
    fprintf(lcd, "%c%s%s\n", esc, TOP_LINE, "KEYBOARD MODE");
    fprintf(lcd, "%c%s%s\n", esc, BOTTOM_LINE, "KEYBOARD MODE");
    
    while (1)
    {
    INT8U err;
    OSSemPend(songSem,0,&err);
    fprintf(lcd, "%c%s", esc, LCD_CLR);
    fprintf(lcd, "%c%s%s\n", esc, TOP_LINE, "NOW PLAYING TETRIS THEME A");
    fprintf(lcd, "%c%s%s\n", esc, BOTTOM_LINE, "NOW PLAYING TETRIS THEME A");
    
    INT8U value = IORD_ALTERA_AVALON_PIO_DATA(SWITCHES_BASE);
    
    if (value & 1)
    {
    if (err==OS_ERR_PEVENT_NULL){
        printf("PEVENT NULL");
    }
    if (err==OS_ERR_EVENT_TYPE){
        printf("EVENT TYPE");
    }
    if (err) printf("%d, %d", err, OS_NO_ERR);
    int note0[] = { 71,-1,68,69,71,-1,69,67,
                    64,-1,64,69,72,-1,71,69,
                    68,-1,-1,69,71,-1,72,-1,
                    69,-1,64,-1,64,-1,-1,-1,
                    0,65,-1,69,72,-1,71,69,
                    67,-1,-1,64,67,-1,65,64,
                    68,-1,-1,69,71,-1,72,-1,
                    69,-1,64,-1,64,-1,0,0   };   
    int note1[] = { 76,-1,76,72,74,-1,72,71,
                    69,-1,69,72,76,-1,74,72,
                    71,-1,-1,72,74,-1,76,-1,
                    72,-1,69,-1,69,-1,-1,-1,
                    0,74,-1,77,81,-1,79,77,
                    76,-1,-1,72,76,-1,74,72,
                    71,-1,-1,72,74,-1,76,-1,
                    72,-1,69,-1,69,-1,0,0};  
    int i;
    for (i=0;i<64;i++){
        if (note0[i] == -1){
            //do nothing
        }else if (note0[i] == 0){
            *note_table[0] = 0;   
        }else{
            *note_table[0] = (120 << 12) | (INT8U) note0[i];
        }
        if (note1[i] == -1){
            //do nothing
        }else if (note1[i] == 0){
            *note_table[1] = 0;   
        }else{
            *note_table[1] = (120 << 12) | (INT8U) note1[i];
        }
        OSTimeDlyHMSM(0, 0, 0, 250);
    }
    for (i=0;i<64;i++){
        if (note0[i] == -1){
            //do nothing
        }else if (note0[i] == 0){
            *note_table[0] = 0;   
        }else{
            *note_table[0] = (120 << 12) | (INT8U) note0[i];
        }
        if (note1[i] == -1){
            //do nothing
        }else if (note1[i] == 0){
            *note_table[1] = 0;   
        }else{
            *note_table[1] = (120 << 12) | (INT8U) note1[i];
        }
        OSTimeDlyHMSM(0, 0, 0, 250);
    }
    }
    
    fprintf(lcd, "%c%s", esc, LCD_CLR);
    fprintf(lcd, "%c%s%s\n", esc, TOP_LINE, "KEYBOARD MODE");
    fprintf(lcd, "%c%s%s\n", esc, BOTTOM_LINE, "KEYBOARD MODE");
    
    OSSemPend(songSem,0,&err);
    fprintf(lcd, "%c%s%s\n", esc, TOP_LINE, "NOW PLAYING STAIRWAY TO HEAVEN");
    fprintf(lcd, "%c%s%s\n", esc, BOTTOM_LINE, "NOW PLAYING STAIRWAY TO HEAVEN");
    
    if (value & 1)
    {
    if (err==OS_ERR_PEVENT_NULL){
        printf("PEVENT NULL");
    }
    if (err==OS_ERR_EVENT_TYPE){
        printf("EVENT TYPE");
    }
    if (err) printf("%d, %d", err, OS_NO_ERR);
    int note0[] = {0,60,64,69,71,64,60,71,
                    72,64,60,72,66,62,57,66,
                    64,60,57,60,-1,64,60,57,
                    55,57,57,-1,-1,-1,0,0,
                    0,60,64,69,71,64,60,71,
                    72,64,60,72,66,62,57,66,
                    64,60,57,60,-1,64,60,57,
                    55,57,57,-1,-1,-1,0,0,
                    -1,52,55,64,66,62,57,65,
                    64,60,57,64,62,60,-1,-1,
                    60,55,52,60,67,59,55,67,
                    57,57,57,-1,-1,-1,0,0};   
    int note1[] = {57,-1,-1,-1,56,-1,-1,-1,
                    55,-1,-1,-1,54,-1,-1,-1,
                    53,-1,-1,-1,-1,-1,-1,-1,
                    47,45,45,-1,-1,45,53,52,
                    45,-1,-1,-1,56,-1,-1,-1,
                    55,-1,-1,-1,54,-1,-1,-1,
                    53,-1,-1,-1,-1,-1,-1,-1,
                    47,45,45,-1,-1,-1,45,47,
                    48,-1,-1,-1,50,-1,-1,-1,
                    53,-1,-1,-1,45,-1,45,47,
                    48,-1,-1,-1,43,-1,-1,-1,
                    50,50,50,-1,-1,-1,0,0};  
    int i;
    for (i=0;i<96;i++){
        if (note0[i] == -1){
            //do nothing
        }else if (note0[i] == 0){
            *note_table[0] = 0;   
        }else{
            *note_table[0] = (120 << 12) | (INT8U) note0[i];
        }
        if (note1[i] == -1){
            //do nothing
        }else if (note1[i] == 0){
            *note_table[1] = 0;   
        }else{
            *note_table[1] = (120 << 12) | (INT8U) note1[i];
        }
        OSTimeDlyHMSM(0, 0, 0, 600);
    }
    }
    fprintf(lcd, "%c%s", esc, LCD_CLR);
    fprintf(lcd, "%c%s%s\n", esc, TOP_LINE, "KEYBOARD MODE");
    fprintf(lcd, "%c%s%s\n", esc, BOTTOM_LINE, "KEYBOARD MODE");
    }
}
Пример #2
0
/* 按键按下,写入EEPROM */
void Task_USART1(void *p_arg)
{
	(void)p_arg;	//'p_arg'没有用到,防止编译器警告
	while(1)
	{	
		unsigned char errkey, err;
//		u16 i;
		
//		printf("等待A8");
		/* car1经过 */
		OSSemPend(key_SEM,0,&errkey);

		//将car1数据保存至buffer并串口输出
		weight = (char*)OSMboxPend(adc_MBOX,0,&err);		
		save_in_buffer(car1,*weight);
		
		/* 读写EEPROM */	
	  	//将I2c_Buf_Write中顺序递增的数据写入EERPOM中 
		I2C_EE_BufferWrite((u8 *)sendData, EEP_Firstpage, 256);
			 
		OSTimeDlyHMSM(0,0,0,500);


		/* car2经过 */
		OSSemPend(key_SEM,0,&errkey);

		//将car1数据保存至buffer并串口输出
		weight = (char*)OSMboxPend(adc_MBOX,0,&err);		
		save_in_buffer(car2,*weight);
		
		/* 读写EEPROM */	
	  	//将I2c_Buf_Write中顺序递增的数据写入EERPOM中 
		I2C_EE_BufferWrite((u8 *)sendData, EEP_Firstpage, 256);
			 
		OSTimeDlyHMSM(0,0,0,500);

		
		/* car3经过 */
		OSSemPend(key_SEM,0,&errkey);

		//将car1数据保存至buffer并串口输出
		weight = (char*)OSMboxPend(adc_MBOX,0,&err);		
		save_in_buffer(car3,*weight);
		
		/* 读写EEPROM */	
	  	//将I2c_Buf_Write中顺序递增的数据写入EERPOM中 
		I2C_EE_BufferWrite((u8 *)sendData, EEP_Firstpage, 256);
			 
		OSTimeDlyHMSM(0,0,0,500);

//	  	printf("\n\r读出eeprom的数据\n\r");
	  	//将EEPROM读出数据顺序保持到I2c_Buf_Read中 
//		I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 256); 
	
	  	//将I2c_Buf_Read中的数据通过串口打印
//		for (i=0; i<=50; i++)
//		{	
//		    printf("%c", I2c_Buf_Read[i]);
//	    }
//		OSTimeDlyHMSM(0,0,0,500);
	}
}
Пример #3
0
void GPSNET_FOTA_Task(void)
{
   // task setup
   LATITUDE     latitude;
   LONGITUDE    longitude;   
   INT32U       i = 0;
   INT32U       j = 0;      
   INT32U       endereco_bw;
   INT8U        type = 0;
   INT8U        confirma=0;  
   INT8U        error=0;
   INT8U        nerror=0;   
   INT8U        confirma_rede_error = 0;
   INT8U        *boot_end_status;
   static       INT16U linhas; 
   static       INT16U linhas2;

   
   if (OSSemCreate(0,&Confirma) != ALLOC_EVENT_OK)
   {
     while(1){};
   }; 

   if (OSSemCreate(0,&Bootloader_Event) != ALLOC_EVENT_OK)
   {
     while(1){};
   };      
   
   if (OSMboxCreate(&Bootloader_end,NULL) != ALLOC_EVENT_OK)
   {
      while(1){};      
   }   
   
   
   // task main loop
   for (;;)
   {
      // Wait event from APP layer, no timeout
      OSSemPend(Bootloader_Event,0);
      
      // Set target node address

      UserEnterCritical();
        latitude.x  = GPS_X_tmp.int32u;
        longitude.y = GPS_Y_tmp.int32u;
      UserExitCritical(); 
      
      
      linhas = 0;
      linhas2 = 0;
      endereco_bw = CODE_START;
    
      for(;;) 
      {
           /* loop to read a line of code  */
           for(i=0;i<VECTOR32_SIZE;i++)  
           {
              // return 32-bit words
              data_checksum[i]=Flash_Read(endereco_bw); 
              bootloader_datal[i] = data_checksum[i]; 
              endereco_bw+=4;
           }
            
           linhas++;          
           j=0;                   
          
           type = (INT8U)(bootloader_data[2]);  // get line type
           
           if(type==7) 
           {
              bootloader_data[15] = (INT8U)((CRC_CODIGO_16>>8) & 0xFF);
              bootloader_data[16] = (INT8U)((CRC_CODIGO_16) & 0xFF);
              bootloader_data[17] = (INT8U)((CRC_CODIGO_162>>8) & 0xFF);
              bootloader_data[18] = (INT8U)((CRC_CODIGO_162) & 0xFF);                
              endereco_bw = CODE_START;
           }
           
           error = 0;
           nerror = 0;
           confirma_rede_error = 0;
                    
       envia_de_novo:      
           UserEnterCritical();
             confirma_rede = 0;
             //mensagem = 0;
           UserExitCritical();
             
           // send a line of code         
           i = NetSimpledataXY(UP_ROUTE, &latitude, &longitude, &bootloader_data[0]); 
             
           if(i==OK) 
           {
                 error = 0;
                 // wait for send to complete - SIGNAL_TIMEOUT ms                
                 i = OSSemPend (Confirma, SIGNAL_TIMEOUT); 
                                    
                 if(confirma_rede == DATA_OK) 
                 {
                     confirma_rede_error = 0;
                     linhas2++;
                     if(type==7) 
                       {
                         type=0;                       
                         endereco_bw = CODE_START;
                         //UserEnterCritical();
                          //mensagem = confirma_rede;
                         //UserExitCritical();
                         boot_end_status = (INT8U*)'o';
                         (void)OSMboxPost(Bootloader_end,(void *)boot_end_status);
                         break;
                       }
                 }
                 else
                 {
                     if (confirma_rede == 0)
                     {
                        /* timeout of semaphore pend */
                        confirma_rede_error++;                        
                        // DelayTask(100);
                          
                        if(confirma_rede_error>6) 
                        {
                            confirma_rede_error = 0;
                            
                            //UserEnterCritical();
                            //  mensagem = confirma_rede;
                            //UserExitCritical();                            
                            
                            if(Bootloader_ForceStop == 1){ // desiste 
                              Bootloader_ForceStop = 0;
                              endereco_bw = CODE_START; 
                              boot_end_status = (INT8U*)'f';
                              (void)OSMboxPost(Bootloader_end,(void *)boot_end_status);
                              break;
                            }
                        } 
                        
                        goto envia_de_novo;
                     }
                     endereco_bw = CODE_START;                      
                     //UserEnterCritical();
                     // mensagem = confirma_rede;
                     //UserExitCritical();
                     boot_end_status = (INT8U*)'g';
                     (void)OSMboxPost(Bootloader_end,(void *)boot_end_status);                     
                     break; 
                 } 
           }
           else 
           {
              error++;
              DelayTask(SIGNAL_TIMEOUT);  
              if(error==3) 
              {
                  DelayTask(RadioWatchdogTimeout + SIGNAL_TIMEOUT);   /* wait for a radio reset */
              }
              if(error>6) 
              {
                  error = 0;
                  //UserEnterCritical();
                  //  mensagem = confirma_rede;
                  //UserExitCritical();
                  endereco_bw = CODE_START;
                  boot_end_status = (INT8U*)'f';
                  (void)OSMboxPost(Bootloader_end,(void *)boot_end_status);                  
                  break; 
              } 
              else
              {
                   goto envia_de_novo;  
              }
           }
      }
   }
Пример #4
0
/**
 * Alarm task that handles sounding the alarm and sending 
 * out the alerts
 */
void alarmTask(void *data) {
	// Error reference
	INT8U err;
	
	// Result variables
	char *result;
	auto char realResult;

	// Loop forever
	while(1) {
		//Read MSG Queue, wait forever for message
		result = (char *)OSQPend(msgQueuePtr, 0, &err);
		realResult = *result;

		// Debug
		printf("Alarm Task Run\n");

		// Check for zone 1
		if(realResult == '0') {
			printf("\nZone 1 Tripped!!!!\n");
			digOut(ID_BUZZER, ON);
			digOut(LED_0_ID, ON);

			// Update the current alarm state
			OSSemPend(alarmSem, 0, &err);
				zone0Alarm = ON;
				alarming = ON;
			OSSemPost(alarmSem);

			// Send the alert
			sendEmail(0);
		} else if(realResult == '1') {
			printf("\nZone 12Tripped!!!!\n");
			digOut(ID_BUZZER, ON);
			digOut(LED_1_ID, ON);

			// Update the current alarm state
			OSSemPend(alarmSem, 0, &err);
				zone1Alarm = ON;
				alarming = ON;
			OSSemPost(alarmSem);

			// Send the alert
			sendEmail(1);
		} else if(realResult == '2') {
			printf("\nZone 3 Tripped!!!!\n");
			digOut(ID_BUZZER, ON);
			digOut(LED_2_ID, ON);

			// Update the current alarm state
			OSSemPend(alarmSem, 0, &err);
				zone2Alarm = ON;
				alarming = ON;
			OSSemPost(alarmSem);

			// Send the alert
			sendEmail(2);
		} else if(realResult == '3') {
			printf("\nZone 4 Tripped!!!!\n");
			digOut(ID_BUZZER, ON);
			digOut(LED_3_ID, ON);

			// Update the current alarm state
			OSSemPend(alarmSem, 0, &err);
				zone3Alarm = ON;
				alarming = ON;
			OSSemPost(alarmSem);

			// Send the alert
			sendEmail(3);
		}
	}
}
Пример #5
0
/**
\brief Send a frame to the serial API of the SmartMesh IP manager.

A response is expected from the manager if rxPayload!=NULL. In this case, this
function retries transmitting if no response is received after
SERIAL_ACK_TIMEOUT ms. If no response is received after SERIAL_MAX_RETRIES
retries, the function returns RC_WRITE_FAIL.

\param[in]  packetType The payload type.
\param[in]  txPayload Payload to transmit to the manager.
\param[in]  txPayloadLen Number of bytes into the payload to transmit to the
   manager.
\param[out] rxPayload Pointer to a buffer to write the received payload into.
   manager.
\param[in]  rxPayloadMaxLen Maximum number of bytes which fit in the rxPayload
   buffer. If the manager responds with more bytes, this function returns
   RC_NO_RESOURCES, and no bytes are written to the rxPayload buffer.
\param[out] rxPayloadLen Expected number of bytes returned by the manager.

\return RC_OK if the operation succeeded successfully.
\return RC_NO_RESOURCES if the manager returned a number of bytes different
   from rxPayloadLen.
\return RC_WRITE_FAIL if no answer from the manager is received after
   SERIAL_MAX_RETRIES retries.
*/
INT8U serial_tx(
      INT8U  packetType,
      INT8U* txPayload,
      INT8U  txPayloadLen,
      INT8U* rxPayload,
      INT8U  rxPayloadMaxLen,
      INT8U* rxPayloadLen
      ) {
   INT8U           osErr;
   dn_error_t      dnErr;
   INT8U           i;
   INT8U           len;
   INT8U           functionReply;
   INT8U           retryCounter;
   INT32U          functionReplyLen;
   serial_ht*      tx_frame;
   INT8U           returnVal;
   
   // I'm busy sending a DATA packet over serial
   OSSemPend(bridge_app_v.serialTxDataAvailable,0,&osErr);
   ASSERT(osErr==RC_OK);
   
   // create packet
   tx_frame                  = (serial_ht*)bridge_app_v.uartTxBuffer;
   tx_frame->control         = 0x00;
   tx_frame->packetType      = packetType;
   tx_frame->seqNum          = bridge_app_v.seqNoTx++;
   tx_frame->payloadLen      = txPayloadLen;
   if (txPayload!=NULL) {
      memcpy(tx_frame->payload,txPayload,txPayloadLen);
   }
   len                       = sizeof(serial_ht)+txPayloadLen;
   
   // store packet details
   bridge_app_v.requestPacketType           = packetType;
   bridge_app_v.responsePayload             = rxPayload;
   bridge_app_v.responsePayloadMaxLen       = rxPayloadMaxLen;
   
   retryCounter                             = SERIAL_MAX_RETRIES;
   while (retryCounter>0) {
   
#ifdef PRINT_TRACE
      dnm_ucli_printf("---TX--> (%d bytes)",len);
      for (i=0;i<len;i++) {
         dnm_ucli_printf(" %02x",bridge_app_v.uartTxBuffer[i]);
      }
      dnm_ucli_printf("\r\n");
      dnm_ucli_printf("   packetType %d\r\n",tx_frame->packetType);
      dnm_ucli_printf("   seqNum     %d\r\n",tx_frame->seqNum);
#endif
      
      // send packet
      dnErr = dn_sendSyncMsgByType(
         bridge_app_v.uartTxBuffer,
         len,
         DN_MSG_TYPE_UART_TX_CTRL,
         (void*)&functionReply,
         sizeof(functionReply),
         &functionReplyLen
      );
      ASSERT(functionReplyLen==sizeof(INT8U));
      ASSERT(functionReply==DN_ERR_NONE);
      
      // wait for response, if appropriate
      if (rxPayload!=NULL) {
         
         // wait for response
         OSSemPend(
             bridge_app_v.waitForResponseSem,
             SERIAL_ACK_TIMEOUT,
             &osErr
         );
         
         // return appropriate value
         switch (osErr) {
             case OS_ERR_NONE:
                 *rxPayloadLen = bridge_app_v.responsePayloadLen;
                 if (bridge_app_v.responsePayloadLen<=bridge_app_v.responsePayloadMaxLen) {
                    returnVal = RC_OK;
                 } else {
                    returnVal = RC_NO_RESOURCES;
                 }
                 retryCounter = 0;
                 break;
             case OS_ERR_TIMEOUT:
               dnm_ucli_printf("WARNING: serial API timeout.\r\n");
                 retryCounter--;
                 break;
             default:
                 ASSERT(0);
         }
      } else {
         retryCounter = 0;
      }
   }
   
   // reset packet details
   bridge_app_v.requestPacketType             = 0x00;
   
   // I'm NOT busy sending a DATA packet over serial
   OSSemPost(bridge_app_v.serialTxDataAvailable);
   
   return returnVal;
}
Пример #6
0
static void DINGOO_LockAudio(_THIS)
{
	Uint8 tempError;
    OSSemPend(audio_sem, 1000, &tempError);
}
Пример #7
0
/*
*********************************************************************************************************
*                                             App_TaskMEMS()
*
* Description : This task monitors the state of the push buttons and passes messages to AppTaskUserIF()
*
* Argument(s) : p_arg   is the argument passed to 'App_TaskMEMS()' by 'OSTaskCreateExt()'.
*
* Return(s)   : none.
*
* Caller(s)   : This is a task.
*
* Note(s)     : none.
*********************************************************************************************************
*/
void  App_TaskMEMS (void *p_arg)
{
    INT8U err, FRH, FRM, FRL;
    INT16U i;


    (void)p_arg;

    while (DEF_TRUE) {
        while(OSSemAccept(g_sem_mems));

        mems_read_instant_flow();

        OSSemPend(g_sem_mems, OS_TICKS_PER_SEC, &err);

        if(OS_ERR_NONE == err)
        {
            LED_MEMS_ON();

            if(MEMS_FRAME_OK == MEMS_AnalysisFrame((INT8U *)&mems_frame_recv, &mems_frame_stat))
            {
                switch(mems_frame_stat.cmd)
                {
                case MEMS_READ_INSTANT_FLOW_CMD:
                    FRH = mems_frame_recv.data[0];
                    FRM = mems_frame_recv.data[1];
                    FRL = mems_frame_recv.data[2];

                    g_mems_para.instant_flow = (INT32U)FRH * 65536 + (INT32U)FRM * 256 + (INT32U)FRL;

                    g_mems_para.buf[g_mems_para.index++] = g_mems_para.instant_flow;

                    if(MAX_FLOW_NUM == g_mems_para.index)
                    {
                        g_mems_para.index = 0;

                        g_mems_para.sum = 0;

                        for(i = 0; i < MAX_FLOW_NUM; i++)
                        {
                            g_mems_para.sum += g_mems_para.buf[i];
                        }

                        g_mems_para.average_flow = g_mems_para.sum / MAX_FLOW_NUM;

                        g_mems_para.cal_flow = g_mems_para.average_flow; //Á÷Á¿Ð£×¼

                        if((0 != g_mems_para.cal_flow) && (abs((int)g_mems_para.cal_flow - (int)g_mems_para.target_flow) < g_mem_para.mems_debounce_threshold))
                        {
                            g_mems_para.inside_count++;

                            if(g_mems_para.inside_count >= 2)
                            {
                                g_mems_para.inside_count = 0;
                                g_mems_para.outside_count = 5;

                                g_mems_para.disp_flow = g_mems_para.target_flow;
                                g_mems_para.disp_flow_int_part = g_mems_para.disp_flow / 1000;
                                g_mems_para.disp_flow_dec_part = (g_mems_para.disp_flow - (g_mems_para.disp_flow_int_part * 1000)) / 100;
                            }

                            break;
                        }
                        else
                        {
                            g_mems_para.inside_count = 0;
                        }

                        if(g_mems_para.outside_count)
                        {
                            g_mems_para.outside_count--;
                        }
                        else
                        {
                            g_mems_para.disp_flow = g_mems_para.cal_flow + 50;
                            g_mems_para.disp_flow_int_part = g_mems_para.disp_flow / 1000;
                            g_mems_para.disp_flow_dec_part = (g_mems_para.disp_flow - (g_mems_para.disp_flow_int_part * 1000)) / 100;
                        }
                    }
                    break;

                default:
                    break;
                }
            }
        }
        else
        {
            LED_MEMS_OFF();
        }
    }
}
Пример #8
0
//为了提高任务效率,改用事件驱动方式
//
void  app_task_obd (void *p_arg)
{
	u8 var_uchar;
	//Request Supported PIDs from Vehicle, check sae j1979 2002.pdf page 26
	u8 determine_pid[]="\x02\x01\x00\x00\x00\x00\x00\x00";

	u16 can_id_idx = 0;
	u32 can_id ;
	CanRxMsg can_rx_msg;
	
	CPU_INT08U	os_err;

	(void)p_arg;

//can_enquire_determine_pid( );

	OSSemPend(sem_obd_task, 0, &os_err);//Wait task manger ask to start

	//BKP_DR2, OBD Flag:	15~12:KWP_TYPEDEF
	//						11~8:CAN2_TYPEDEF
	//						7~4: CAN1_TYPEDEF
	//						3~0: OBD_TYPEDEF 
	
	//BKP_DR3, can_snd_id index, check app_obd.c
		
	switch ( obd_read_type ) {
	case OBD_TYPE_CAN1 ://CAN1
		debug_obd("OBD is CAN1 ");
		can_id_idx = obd_read_canid_idx ;
		if ( !can_id_idx ) {//no CAN send id index
			obd_auto_detect( );
			can_id_idx = obd_read_canid_idx ;
		}
		
		switch ( obd_can1_type ) {
		case CAN1_TYPE_STD_250 ://CAN1_TYPE_STD_250
			debug_obd("STD 250\r\n");
			break;
			
		case CAN1_TYPE_EXT_250 ://CAN1_TYPE_EXT_250
			debug_obd("EXT 250\r\n");
			break;

		case CAN1_TYPE_STD_500 ://CAN1_TYPE_STD_500
			debug_obd("STD 500\r\n");
			break;
			
		case CAN1_TYPE_EXT_500 ://CAN1_TYPE_EXT_500
			debug_obd("EXT 500\r\n");
			break;

		case CAN1_TYPE_NO_DEFINE ://CAN1 no define
		default://maybe error, treat as no define
			debug_obd("but type ERR!\r\n");
			BKP_WriteBackupRegister(BKP_DR2, 0);//clean all flag, prevent err
			BKP_WriteBackupRegister(BKP_DR3, 0);//clean all flag, prevent err
			obd_auto_detect( );
			can_id_idx = obd_read_canid_idx ;
			break;
		}
		break;

	case OBD_TYPE_CAN2 ://CAN2
		debug_obd("OBD is CAN2 bus\r\n");
		if ( !obd_read_canid_idx ) {//no CAN send id index
			obd_auto_detect( );
			can_id_idx = obd_read_canid_idx ;
		}

		break;

	case OBD_TYPE_NO_DFN ://no define
	default://maybe error, treat as no define
		debug_obd("No OBD type\r\n");
		BKP_WriteBackupRegister(BKP_DR2, 0);//clean all flag, prevent err
		BKP_WriteBackupRegister(BKP_DR3, 0);//clean all flag, prevent err
		obd_auto_detect( );
		can_id_idx = obd_read_canid_idx ;
		
		break;
	}


	while ( !can_id_idx ) { //no CAN ID index, err

		debug_obd("BK2: %04X BK3: %04X\r\n",BKP_ReadBackupRegister(BKP_DR2),BKP_ReadBackupRegister(BKP_DR3));
		debug_obd("can_id_idx = %d\r\n", can_id_idx);
		OSSemPend(sem_obd_task, 0, &os_err);

		debug_obd("CAN ID index ERR\r\n");
		//Report err to server
		for ( var_uchar = 0 ; var_uchar < MAX_WARN_MSG ; var_uchar++) {
			if ( !my_icar.warn[var_uchar].msg ) { //empty msg	
				//unsigned int msg;//file name(1 Byte), msg(1 Byte), line(2 B)
				my_icar.warn[var_uchar].msg = (F_APP_OBD) << 24 ;
				my_icar.warn[var_uchar].msg |= ERR_CAN_ID_IDX << 16 ;//Error CAN ID index
				my_icar.warn[var_uchar].msg |= __LINE__ ;
				var_uchar = MAX_WARN_MSG ;//end the loop
			}
		}

		obd_auto_detect( );
		can_id_idx = obd_read_canid_idx ;
	}
	
	//uart3_init( ); //to OBD, K-BUS

	while ( !can_enquire_support_pid( ) ) { //update support table ERR

		debug_obd("Get CAN PID ERR\r\n");
		//Report err to server
		for ( var_uchar = 0 ; var_uchar < MAX_WARN_MSG ; var_uchar++) {
			if ( !my_icar.warn[var_uchar].msg ) { //empty msg	
				//unsigned int msg;//file name(1 Byte), msg(1 Byte), line(2 B)
				my_icar.warn[var_uchar].msg = (F_APP_OBD) << 24 ;
				my_icar.warn[var_uchar].msg |= ERR_CAN_SUP_PID << 16 ;//Error get CAN  support PID
				my_icar.warn[var_uchar].msg |= __LINE__ ;
				var_uchar = MAX_WARN_MSG ;//end the loop
			}
		}
		OSTimeDlyHMSM(0, 0,	30, 0);//wait 30s
	}

	for ( var_uchar = 0 ; var_uchar <= OBD_MAX_PID ; var_uchar++) {
		if ( can_read_pid(var_uchar) ) {//read PID error
			debug_obd("Read PID:%d ERR\r\n",var_uchar);
		}
		else {
			debug_obd("Read PID:%d OK\r\n",var_uchar);
		}
	}
	
	/* Enable Interrupt for receive FIFO 0 and FIFO overflow */
	CAN_ITConfig(CAN1,CAN_IT_FMP0 | CAN_IT_FOV0, ENABLE);

	/* Enable Interrupt for receive FIFO 1 and FIFO overflow */
	CAN_ITConfig(CAN1,CAN_IT_FMP1 | CAN_IT_FOV1, ENABLE);

	while ( 1 ) {
		//debug_obd("OBD task Pend...\r\n");
		OSSemPend(sem_obd_task, 0, &os_err);
		if ( !os_err ) {

			//CAN TX flag, for test only
			if ( my_icar.obd.can_tx_cnt ) { 

				//send CAD ID: 0x18DB33F1
				can_send( can_snd_id[can_id_idx], DAT_FRAME, 8, determine_pid );

				//CAN_Transmit(CAN1, &TxMessage);
				my_icar.obd.can_tx_cnt--;
			}

			//execute CMD from app_taskmanager
			switch ( my_icar.obd.cmd ) {

			case READ_PID ://update support table

				debug_obd("CMD is Read ECU pid:%d\r\n",my_icar.obd.pid);
				my_icar.obd.cmd = NO_CMD ;
				var_uchar = can_read_pid( my_icar.obd.pid );//result in my_icar.obd.rx_buf
				if ( var_uchar ) {//read PID error
					debug_obd("Read PID err: %d\r\n", var_uchar);
				}
				else {//get ECU data
					//debug_obd("Read PID OK: %d\r\n", var_uchar);
					switch ( my_icar.obd.pid ) {

					case OBD_PID_ENGINE_RPM:
						debug_obd("Read RPM OK.\r\n");
						//debug_obd("Rec %d:",rec_len);
						//for ( var_uchar = 0 ; var_uchar < rec_len ; var_uchar++ ) {
							//printf(" %02X",my_icar.obd.rx_buf[var_uchar]);
						//}
						printf(", from ID:%08X\r\n", can_id);

						break;

					default://maybe error
						debug_obd("PID err:%d\r\n",my_icar.obd.pid);
						break;
					}
				}
				break;

			case SPEED ://engine speed

				debug_obd("CMD is get engine speed\r\n");
				my_icar.obd.cmd = NO_CMD ;
				can_send( can_snd_id[can_id_idx], DAT_FRAME, 8, determine_pid );
		
				break;
				
			case NO_CMD ://no define
			default://maybe error, treat as NO_CMD
				;//debug_obd("No OBD CMD\r\n");
				break;
			}
			
			//FIFO0 has data, max.: 3 datas
			if ( (CAN1->RF0R)&0x03 ) {

				CAN_Receive(CAN1,CAN_FIFO0, &can_rx_msg);

				if (can_rx_msg.IDE == CAN_ID_STD) {
					debug_obd("CAN FIFO_0 rec %d ID: %X\r\n", (CAN1->RF0R)&0x03,can_rx_msg.StdId);
					debug_obd("DLC %d :", can_rx_msg.DLC);
					//show the data
					for ( var_uchar = 0 ; var_uchar < can_rx_msg.DLC ; var_uchar++ ) {
						printf(" %02X",can_rx_msg.Data[var_uchar]);
					}
					printf("\r\n");

				}
				else {
					debug_obd("CAN FIFO_0 rec %d ID: %X %s,%d\r\n", (CAN1->RF0R)&0x03,can_rx_msg.ExtId,\
						__FILE__,__LINE__);
					debug_obd("DLC %d :", can_rx_msg.DLC);
					//show the data
					for ( var_uchar = 0 ; var_uchar < can_rx_msg.DLC ; var_uchar++ ) {
						printf(" %02X",can_rx_msg.Data[var_uchar]);
					}
					printf("\r\n");
					
				}
				
  				
				if ( (CAN1->RF0R)&0x03==0 ) { //no data
					CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//enable FIFO0 FMP int
				}
				else { //still has data
					OSSemPost( sem_obd_task );//2012/9/26 14:55:33 verify
				}
			}

			//FIFO1 receive unknow CAN ID, then report to server
			//FIFO0 has data, max.: 3 datas
			if ( (CAN1->RF1R)&0x03 ) {

				CAN_Receive(CAN1,CAN_FIFO1, &can_rx_msg);
				
				if (can_rx_msg.IDE == CAN_ID_STD) { //unknow CAN STD ID, report to server
					can_id = can_rx_msg.StdId ;
				}
				else { //unknow CAN EXT ID, report to server
					can_id = can_rx_msg.ExtId ;
				}
				obd_report_unknow_canid( can_id );
				debug_obd("Unknow CAN ID: %X FIFO:%d\r\n",can_id,(CAN1->RF1R)&0x03);
					  				
				if ( (CAN1->RF1R)&0x03==0 ) { //no data
					CAN_ITConfig(CAN1,CAN_IT_FMP1, ENABLE);//enable FIFO1 FMP int
				}
				else { //still has data
					OSSemPost( sem_obd_task );//no verify
				}
			}			
		}
	}
}
/*
 * The task 'VehicleTask' updates the current velocity of the vehicle
 */
void VehicleTask(void* pdata)
{ 
  INT8U err, err_tmr_1, err_tmr_start, err_sem;  
  void* msg;
  INT8U* throttle; 
  INT8S acceleration;  /* Value between 40 and -20 (4.0 m/s^2 and -2.0 m/s^2) */
  INT8S retardation;   /* Value between 20 and -10 (2.0 m/s^2 and -1.0 m/s^2) */
  INT16U position = 0; /* Value between 0 and 20000 (0.0 m and 2000.0 m)  */
  INT16S wind_factor;   /* Value between -10 and 20 (2.0 m/s^2 and -1.0 m/s^2) */

  Sem_VehicleTask = OSSemCreate(0);
  //OSSemPend(Sem_VehicleTask,0,&err_sem);

  printf("Vehicle task created!\n");
   
  
    SWTimer_VehicleTask = OSTmrCreate(0, VEHICLE_PERIOD, OS_TMR_OPT_PERIODIC, Tmr_Callback_Vehicle_Task, (void *)0,"S/W Timer 2",&err_tmr_1);
    if(err_tmr_1 == OS_ERR_NONE){
        if(DEBUG)
        printf("Timer for VECHICLE TASK is created\n"); 
        
        OSTmrStart(SWTimer_VehicleTask, &err_tmr_start);
        
        if(err_tmr_start == OS_ERR_NONE){
            if(DEBUG)
            printf("Timer started in VEHICLE TASK \n");
        }
        else {
            printf("Problem starting timer in VEHICLE TASK \n");
        }       
      }
      else {
      printf("Error while creating Vehicle task timer \n");     
     
      if(err_tmr_1 == OS_ERR_TMR_INVALID_DLY)
      printf(" Delay INVALID : VEHICLE TASK\n");
      
      }

  while(1)
    {
        // Wait for user inputs
        OSSemPend(Sem_SwitchIO_IP , 0, &err_sem);
        OSSemPend(Sem_ButtonIO_IP, 0, &err_sem);
        
        if((brake_pedal == on) && (CUR_VELOCITY > 0)){
            CUR_VELOCITY = CUR_VELOCITY - 10;
            
           // if(CUR_VELOCITY < -200)         // Max value for velocity
            //CUR_VELOCITY = -200; 
            
            if(DEBUG_IO)
            printf("********** Brake brake_pedal : %d ********** \n", CUR_VELOCITY);
        }
        
      err = OSMboxPost(Mbox_Velocity, (void *) &CUR_VELOCITY);
      
      if(DEBUG)
      printf("Vehicle task Posted MBoxPost_Velocity \n");

        if(DEBUG)
        printf("SEM ACCESS VEHICLE TASK\n\n");
        
        OSSemPend(Sem_VehicleTask,0,&err_sem);
        
      /* Non-blocking read of mailbox: 
       - message in mailbox: update throttle
       - no message:         use old throttle
      */
      if(DEBUG)
      printf("Vehicle task waiting for MBoxPost_Throttle for 1 unit time \n");
      
      msg = OSMboxPend(Mbox_Throttle, 1, &err); 
      if (err == OS_NO_ERR) 
         throttle = (INT8U*) msg;

      if(DEBUG)
      printf("Vehicle task GOT MBoxPost_Throttle \n");
      
      /* Retardation : Factor of Terrain and Wind Resistance */
      if (CUR_VELOCITY > 0)
         wind_factor = CUR_VELOCITY * CUR_VELOCITY / 10000 + 1;
      else 
         wind_factor = (-1) * CUR_VELOCITY * CUR_VELOCITY / 10000 + 1;
         
      if (position < 4000) 
         retardation = wind_factor; // even ground
      else if (position < 8000)
          retardation = wind_factor + 15; // traveling uphill
        else if (position < 12000)
            retardation = wind_factor + 25; // traveling steep uphill
          else if (position < 16000)
              retardation = wind_factor; // even ground
            else if (position < 20000)
                retardation = wind_factor - 10; //traveling downhill
              else
                  retardation = wind_factor - 5 ; // traveling steep downhill
                  
      acceleration = *throttle / 2 - retardation;     
      position = adjust_position(position, CUR_VELOCITY, acceleration, 300); 
      CUR_VELOCITY = adjust_velocity(CUR_VELOCITY, acceleration, brake_pedal, 300); 
      printf("Position: %dm\n", position / 10);
      printf("Velocity: %4.1fm/s\n", CUR_VELOCITY /10.0);
      printf("Throttle: %dV Time : %d \n\n", *throttle / 10, (int) (alt_timestamp() / (alt_timestamp_freq()/1000)));
      alt_timestamp_start();
     /* 
      INT32U stk_size;
  err = OSTaskStkChk(16, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used OverLoadDetection : %d \n", stk_size);
      
      err = OSTaskStkChk(14, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used DYNAMIV_UTI : %d \n", stk_size);
      
      err = OSTaskStkChk(12, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used CONTROLTASK: %d \n", stk_size);
      
      err = OSTaskStkChk(10, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used VehicleTask: %d \n", stk_size);
      
      err = OSTaskStkChk(8, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used SwitchIO: %d \n", stk_size);
      
      err = OSTaskStkChk(7, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used ButtonIO: %d \n", stk_size);
      
      err = OSTaskStkChk(6, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used WatchDog: %d \n", stk_size);
      
      err = OSTaskStkChk(5, &stk_data);
      stk_size = stk_data.OSUsed;
      printf("Stack Used Start Task: %d \n", stk_size);
*/
      show_velocity_on_sevenseg((INT8S) (CUR_VELOCITY / 10));
      show_active_signals();
      show_position(position);
      
     // OSSemPend(Sem_VehicleTask,0,&err_sem);
    }
} 
Пример #10
0
void Input_Task(void *parg)
{
	u8 err;
	u8 OK=0;
	u8 buffer[4]={0};
	u8 LEN=0;
	u8 flag=0;
	u16 e=0;
	OS_CPU_SR cpu_sr;
	(void)parg;
	for(;;)
	{
		OSSemPend(PENIRQ,0,&err);
		Exti_Set(0);
		OS_ENTER_CRITICAL();
		touch.FLAG=Read_XY_2(&touch.AD_X,&touch.AD_Y);
		OS_EXIT_CRITICAL();
		if(touch.FLAG)
		{
			Led_On(1);
			touch.FLAG=0;
			touch.LCD_X=CalcXY(touch.AD_X,0);
			touch.LCD_Y=CalcXY(touch.AD_Y,1);
			touch.KEY=Get_Key(touch.PID,touch.LCD_X,touch.LCD_Y);
			if(touch.KEY<=10)
			{
				OS_ENTER_CRITICAL();
				Set_Color(WHITE,BLACK);
				if(touch.KEY==10)
					Show_Char('.',cursor.x,cursor.y);
				else
				{
					Show_Dec(touch.KEY,1,cursor.x,cursor.y);
					if(LEN<4)
					{
						buffer[LEN]=touch.KEY;
						LEN++;
					}
				}
				if(cursor.x<224)
				{
					cursor.x+=8;
					if(cursor.x>=224)
						cursor.x=224;
				}
				OS_EXIT_CRITICAL();
			}
		
			else if(touch.KEY==11)
			{
				OK++;
				if(OK==1)
				{
					VALUE1=CalcDec(buffer,LEN);
					Set_Color(BLACK,GREEN);
					Show_String(">>VALUE1:",2,22);
					Show_Dec(VALUE1,LEN,82,22);
					OS_ENTER_CRITICAL();
					LCD_Clear(4,121,232,38,WHITE);
					cursor.x=8;
					cursor.y=132;
					OS_EXIT_CRITICAL();
					buffer[0]=0;
					buffer[1]=0;
					buffer[2]=0;
					buffer[3]=0;
					LEN=0;
				}
				else if(OK==2)
				{
					VALUE2=CalcDec(buffer,LEN);
					Set_Color(BLACK,GREEN);
					Show_String(">>VALUE2:",2,38);
					Show_Dec(VALUE2,LEN,82,38);
					OS_ENTER_CRITICAL();
					LCD_Clear(4,121,232,38,WHITE);
					cursor.x=8;
					cursor.y=132;
					OS_EXIT_CRITICAL();
					buffer[0]=0;
					buffer[1]=0;
					buffer[2]=0;
					buffer[3]=0;
					LEN=0;
				}
				else if(OK==3)
				{
					VALUE3=CalcDec(buffer,LEN);
					Set_Color(BLACK,GREEN);
					Show_String(">>VALUE3:",2,54);
					Show_Dec(VALUE3,LEN,82,54);
					OS_ENTER_CRITICAL();
					LCD_Clear(4,121,232,38,WHITE);
					cursor.x=8;
					cursor.y=132;
					OS_EXIT_CRITICAL();
					buffer[0]=0;
					buffer[1]=0;
					buffer[2]=0;
					buffer[3]=0;
					LEN=0;
				}
			
				else if(OK==4)
				{
					if(VALUE2>0&&VALUE2<=5000)
					{
						if(VALUE1<VALUE2&&VALUE1>0)
						{
							if(VALUE3>0&&VALUE3<10000)
							{
								e=0;
								Set_Color(BLACK,GREEN);
								Show_String(">>OK!",2,70);
							}
							else
							{
								e=1;
							}
						}
						else
						{
							e=1;
						}
					}
					else
					{
						e=1;
					}

					if(e)	
					{
						Set_Color(BLACK,GREEN);
						Show_String(">>ERROR!",2,70);
					}
				}
				else if(OK==5)
				{
					if(!e)
					{
						OK=0;
						OSTaskSuspend(CURSOR_TASK_PRIO);
						Show_Main(VALUE1,VALUE2,VALUE3,1);
					}
					else
					{
						OK=0;
						e=0;
						LCD_Clear(2,20,236,100,BLACK);
						LCD_DrawEdit(input);
						Set_Cursor(8,132);
					}
					VALUE1=0;
					VALUE2=0;
					VALUE3=0;
				}
				else;
			}
		
			else if(touch.KEY==12)
			{
				OS_ENTER_CRITICAL();
			
				if(LEN>0)
				{
					LEN--;
				}
						
				if(cursor.x>=8) 
				{	
					LCD_Clear(cursor.x,cursor.y,8,16,WHITE);
					cursor.x-=8;
					if(cursor.x<8)
					{
						cursor.x=8;
					}
				}	
				OS_EXIT_CRITICAL();
			}
		
			else if(touch.KEY==13)
			{
				if(flag==0)
				{
					flag=1;
					button1.str="stop";
					button1.len=4;
					button1.line_color=GREEN;
					LCD_DrawButton(button1);
					OSTaskResume(TIMER_TASK_PRIO);
				}
				else
				{
					flag=0;
					button1.str="start";
					button1.len=5;
					button1.line_color=BLACK;
					LCD_DrawButton(button1);
					OSTaskSuspend(TIMER_TASK_PRIO);
				}
			}
		
			else if(touch.KEY==14)
			{
				OSTaskSuspend(TIMER_TASK_PRIO);
				Show_KeyMap();
				OSTaskResume(CURSOR_TASK_PRIO);
			}
			
			else if(touch.KEY==99)//無效輸入
			{}
			else;
			OSTimeDlyHMSM(0,0,0,50);
			Led_Off(1);
		}
		Exti_Set(1);
	}
}
Пример #11
0
void MainTask(void *arg) {
  ADI_AFE_DEV_HANDLE hDevice;
  int16_t dft_results[DFT_RESULTS_COUNT];
  q15_t dft_results_q15[DFT_RESULTS_COUNT];
  q31_t dft_results_q31[DFT_RESULTS_COUNT];
  q31_t magnitude[DFT_RESULTS_COUNT / 2];
  q15_t phase[DFT_RESULTS_COUNT / 2];
  fixed32_t magnitude_result[DFT_RESULTS_COUNT / 2 - 1];
  fixed32_t phase_result[DFT_RESULTS_COUNT / 2 - 1];
  char msg[MSG_MAXLEN];
  uint8_t err;
  done = 0;
  uint16_t pressure_analog;
  uint32_t pressure;
  nummeasurements = 0;
  uint32_t rtcCount;
  ADI_I2C_RESULT_TYPE i2cResult;

  // Initialize driver.
  rtc_Init();

  // Calibrate.
  rtc_Calibrate();

  // Initialize UART.
  if (uart_Init()) {
    FAIL("ADI_UART_SUCCESS");
  }

  // Initialize I2C.
  i2c_Init(&i2cDevice);
  
  // Initialize flags.
  bRtcAlarmFlag = bRtcInterrupt = bWdtInterrupt = false;

  // Get the current count.
  if (adi_RTC_GetCount(hRTC, &rtcCount)) {
    FAIL("adi_RTC_GetCount failed");
  }

  // Initialize the AFE API.
  if (adi_AFE_Init(&hDevice)) {
    FAIL("adi_AFE_Init");
  }

  // AFE power up.
  if (adi_AFE_PowerUp(hDevice)) {
    FAIL("adi_AFE_PowerUp");
  }

  // Excitation Channel Power-up.
  if (adi_AFE_ExciteChanPowerUp(hDevice)) {
    FAIL("adi_AFE_ExciteChanPowerUp");
  }

  // TIA Channel Calibration.
  if (adi_AFE_TiaChanCal(hDevice)) {
    FAIL("adi_AFE_TiaChanCal");
  }

  // Excitation Channel Calibration (Attenuation Enabled).
  if (adi_AFE_ExciteChanCalAtten(hDevice)) {
    FAIL("adi_AFE_ExciteChanCalAtten");
  }

  // Update FCW in the sequence.
  seq_afe_acmeas2wire[3] = SEQ_MMR_WRITE(REG_AFE_AFE_WG_FCW, FCW);
  // Update sine amplitude in the sequence.
  seq_afe_acmeas2wire[4] =
      SEQ_MMR_WRITE(REG_AFE_AFE_WG_AMPLITUDE, SINE_AMPLITUDE);

  // Recalculate CRC in software for the AC measurement, because we changed.
  // FCW and sine amplitude settings.
  adi_AFE_EnableSoftwareCRC(hDevice, true);

  // Perform the impedance measurement.
  if (adi_AFE_RunSequence(hDevice, seq_afe_acmeas2wire, (uint16_t *)dft_results,
                          DFT_RESULTS_COUNT)) {
    FAIL("Impedance Measurement");
  }

  // Set RTC alarm.
  printf("rtcCount: %d\r\n", rtcCount);
  if (ADI_RTC_SUCCESS != adi_RTC_SetAlarm(hRTC, rtcCount + 120)) {
    FAIL("adi_RTC_SetAlarm failed");
  }

  // Enable RTC alarm.
  if (ADI_RTC_SUCCESS != adi_RTC_EnableAlarm(hRTC, true)) {
    FAIL("adi_RTC_EnableAlarm failed");
  }

  // Read the initial impedance.
  q31_t magnitudecal;
  q15_t phasecal;

  convert_dft_results(dft_results, dft_results_q15, dft_results_q31);
  arm_cmplx_mag_q31(dft_results_q31, &magnitudecal, 2);

  phasecal = arctan(dft_results[1], dft_results[0]);

  printf("raw rcal data: %d, %d\r\n", dft_results[1], dft_results[0]);
  printf("rcal (magnitude, phase) = (%d, %d)\r\n", magnitudecal, phasecal);

  // Create the message queue for communicating between the ISR and this task.
  dft_queue = OSQCreate(&dft_queue_msg[0], DFT_QUEUE_SIZE);

  // Hook into the DFT interrupt.
  if (ADI_AFE_SUCCESS !=
      adi_AFE_RegisterAfeCallback(
          hDevice, ADI_AFE_INT_GROUP_CAPTURE, AFE_DFT_Callback,
          BITM_AFE_AFE_ANALOG_CAPTURE_IEN_DFT_RESULT_READY_IEN)) {
    FAIL("adi_AFE_RegisterAfeCallback");
  }
  if (ADI_AFE_SUCCESS !=
      adi_AFE_ClearInterruptSource(
          hDevice, ADI_AFE_INT_GROUP_CAPTURE,
          BITM_AFE_AFE_ANALOG_CAPTURE_IEN_DFT_RESULT_READY_IEN)) {
    FAIL("adi_AFE_ClearInterruptSource (1)");
  }

  packed32_t q_result;
  void *q_result_void;
  OS_Q_DATA q_data;
  uint16_t q_size;
  bool inflated = false;
  while (true) {
    // Wait for the user to press the button.
    printf("MainTask: waiting for button.\n");
    OSSemPend(ux_button_semaphore, 0, &err);
    if (err != OS_ERR_NONE) {
      FAIL("OSSemPend: MainTask");
    }
    
    // TODO: fix bug when pressing button multiple times.
    // Have the pump task inflate the cuff.
    printf("MainTask: button detected. Resuming pump task.\n");
    err = OSTaskResume(TASK_PUMP_PRIO);
    if (err != OS_ERR_NONE) {
      FAIL("OSTaskResume: MainTask (1)");
    }
    
    // Wait a bit.
    printf("MainTask: waiting a bit.\n");
    err = OSTimeDlyHMSM(0, 0, 1, 0);
    if (err != OS_ERR_NONE) {
      FAIL("OSTimeDlyHMSM: MainTask (3)");
    }
    
    // Enable the DFT interrupt.
    printf("MainTask: enabling DFT interrupt.\n");
    if (ADI_AFE_SUCCESS !=
        adi_AFE_EnableInterruptSource(
            hDevice, ADI_AFE_INT_GROUP_CAPTURE,
            BITM_AFE_AFE_ANALOG_CAPTURE_IEN_DFT_RESULT_READY_IEN, true)) {
      FAIL("adi_AFE_EnableInterruptSource");
    }
    
    PRINT("START\r\n");
    printf("START\r\n");

    while (true) {
      // Wait on the queue to get DFT data from the ISR (~76 Hz).
      //printf("MainTask: pending on DFT queue.\n");
      q_result_void = OSQPend(dft_queue, 0, &err);
      q_result.pointer = q_result_void;
      if (err != OS_ERR_NONE) {
        FAIL("OSQPend: dft_queue");
      }
      OSQQuery(dft_queue, &q_data);
      q_size = q_data.OSNMsgs;
    
      // Right after we get this data, get the transducer's value from the
      // Arduino.
      //printf("MainTask: getting transducer value via I2C.\n");
      i2cResult = adi_I2C_MasterReceive(i2cDevice, I2C_PUMP_SLAVE_ADDRESS, 0x0,
                                        ADI_I2C_8_BIT_DATA_ADDRESS_WIDTH,
                                        i2c_rx, 3, false);
      if (i2cResult != ADI_I2C_SUCCESS) {
        FAIL("adi_I2C_MasterReceive: get pressure from Arduino");
      }

      // Get the analog pressure value from the Arduino.
      if (i2c_rx[0] == ARDUINO_PRESSURE_AVAILABLE
          || i2c_rx[0] == ARDUINO_STILL_INFLATING) {
        pressure_analog = i2c_rx[1] | (i2c_rx[2] << 8);
      } else {
        FAIL("Corrupted or unexpected data from Arduino.");
      }
      
      // Convert the analog value to mmHg.
      pressure = transducer_to_mmhg(pressure_analog);
      //printf("MainTask: got pressure value: %d mmHg.\n", pressure);
      
      // If the pressure is below the threshold, we're done; break the loop.
      if (inflated && pressure < LOWEST_PRESSURE_THRESHOLD_MMHG) {
        PRINT("END\r\n");
        printf("END\r\n");
        inflated = false;
        break;
      } else if (pressure > LOWEST_PRESSURE_THRESHOLD_MMHG * 1.1) {
        inflated = true;
      }

      // Convert DFT results to 1.15 and 1.31 formats.
      dft_results[0] = q_result.parts.magnitude;
      dft_results[1] = q_result.parts.phase;
      convert_dft_results(dft_results, dft_results_q15, dft_results_q31);

      // Compute the magnitude using CMSIS.
      arm_cmplx_mag_q31(dft_results_q31, magnitude, DFT_RESULTS_COUNT / 2);

      // Calculate final magnitude values, calibrated with RCAL.
      fixed32_t magnituderesult;
      magnituderesult = calculate_magnitude(magnitudecal, magnitude[0]);
      q15_t phaseresult;
      phaseresult = arctan(dft_results[1], dft_results[0]);
      fixed32_t phasecalibrated;

      // Calibrate with phase from rcal.
      phasecalibrated = calculate_phase(phasecal, phaseresult);
      
      // TODO: dispatch to another thread?
      //printf("MainTask: sending data via UART.\n");;
      print_PressureMagnitudePhase("", pressure, magnituderesult, phasecalibrated,
                                   q_size);
      nummeasurements++;
    }

    
    // We're done measuring, for now. Disable the DFT interrupts.
    printf("MainTask: disabling DFT interrupts.\n");
    if (ADI_AFE_SUCCESS !=
        adi_AFE_EnableInterruptSource(
            hDevice, ADI_AFE_INT_GROUP_CAPTURE,
            BITM_AFE_AFE_ANALOG_CAPTURE_IEN_DFT_RESULT_READY_IEN, false)) {
      FAIL("adi_AFE_EnableInterruptSource (false)");
    }
    
    // Tell the pump task to deflate the cuff.
    printf("MainTask: resuming pump task to deflate the cuff.\n");
    err = OSTaskResume(TASK_PUMP_PRIO);
    if (err != OS_ERR_NONE) {
      FAIL("OSTaskResume: MainTask (2)");
    }

    // Suspend until the pump finishes deflating. We can then go back to
    // listening for the user input.
    printf("MainTask: suspending to wait for pump task.\n");
    err = OSTaskSuspend(OS_PRIO_SELF);
    if (err != OS_ERR_NONE) {
      FAIL("OSTaskSuspend: MainTask (3)");
    }

    // Tell the UX that we're done for now.
    UX_Disengage();
  }
}
Пример #12
0
int udpRead(u_int ud, void* buf, long len)
{
    unsigned char* d;
    int rtn;
    NBuf* b;
    UDP_QUEUE* q;
    struct in_addr fromAddr;
    UBYTE err;

//    TRACE("udpRead(%d,%p,%ld)\n",ud,buf,len);

    if (!(udps[ud].flags & FUDP_OPEN)) return -1;
    d = (unsigned char*)buf;
    rtn = 0;
    OSSemPend(udps[ud].sem, 0, &err);
    if (udps[ud].head == NULL) {
        return -1;
    }
    fromAddr = udps[ud].theirAddr = udps[ud].head->srcAddr;
    udps[ud].theirPort = udps[ud].head->srcPort;

    UDPDEBUG(("fromAddr.s_addr = %08X,   udps[ud].head->srcAddr.s_addr = %08X\n", fromAddr.s_addr, udps[ud].head->srcAddr.s_addr));

    while ((udps[ud].head) && (len) && (fromAddr.s_addr == udps[ud].head->srcAddr.s_addr)) {
        // Get next nBuf
        b = udps[ud].head->nBuf;
        // While we have more buffer to copy out to AND
        // We have a queued nBuf
        while ((len) && (b)) {
        // While we have more buffer space to copy to AND
        // nBuf is not empty
//            while ((len) && (b->data != &b->body[b->len])) {
            while ( (len) && (b->len) )	{
		// Copy one byte
                *d++ = *b->data++;
                b->len--; 
                len--;
                rtn++;
            }
	    // If nBuf is empty
//            if (b->data == &b->body[b->len]) {
            if (!b->len) {
                OS_ENTER_CRITICAL();
                b = udps[ud].head->nBuf = nFree(b);
                OS_EXIT_CRITICAL();
            }
        }
        // If nBuf was freed (we need another one if any)
        if (b == NULL) {
            // Get next nBuf in queue
            q = udps[ud].head;
            OS_ENTER_CRITICAL();
            udps[ud].head = q->next;
            OS_EXIT_CRITICAL();
            free_udp_q(q);
            #if ONETASK_SUPPORT > 0
            #else
            if (udps[ud].head)
                OSSemPend(udps[ud].sem, 0, &err);
            #endif
        } else {
            #if ONETASK_SUPPORT > 0
            // nBuf was not freed but we have filled our buffer (buf) 
            return rtn;
            #else
            OSSemPost(udps[ud].sem);
            #endif
        }
    }
    if (udps[ud].head == NULL)
        udps[ud].tail = NULL;
    return rtn;
}
Пример #13
0
void GUI_X_Lock(void) {
  INT8U err;
  OSSemPend(DispSem, 0, &err);
}
Пример #14
0
void sw_uart_lock(INT8U uart_num)
{
	INT8U err;

	OSSemPend(sw_uart_sem[uart_num], 0, &err);
}
Пример #15
0
void ProcessCommand( char c )
{
    WavPlayer::wavError ret;
    int loopCount;
    char key;
    switch ( c ) {
        case '1':
            iprintf("Playing Audio...");
            testPlayer.OpenBuffer( nbwav_44k );
            testPlayer.Play( &playbackSem );
            OSSemPend( &playbackSem, 0 );
            iprintf(" Done\r\n");
            break;
        case '2':
            iprintf("Playing Audio...");
            testPlayer.OpenBuffer( nbwav_8k );
            testPlayer.Play( &playbackSem );
            OSSemPend( &playbackSem, 0 );
            iprintf(" Done\r\n");
            break;
        case '3':
            iprintf("Playing Audio...");
            testPlayer.OpenBuffer( sinewav_440 );
            testPlayer.Play( &playbackSem );
            OSSemPend( &playbackSem, 0 );
            iprintf(" Done\r\n");
            break;
        case '4':
            iprintf("Looping Audio...\r\nPress P to pause, R to resume, any other key to stop...");
            testPlayer.OpenBuffer( sinewav_440 );
            testPlayer.Loop( 0, &playbackSem );
            while (testPlayer.GetState() != WavPlayer::STATE_FINISHED) {
                key = getchar();
                switch (key) {
                    case 'P':
                    case 'p':
                        testPlayer.Pause();
                        break;
                    case 'R':
                    case 'r':
                        testPlayer.Resume();
                        break;
                    default:
                        testPlayer.Stop();
                        break;
                }
            }
            iprintf(" Done\r\n");
            break;
#ifdef WAV_PLAYER_FILESYSTEM
        case '5':
            if (!extFlashOpened) {
                setUpFlash();
            }
            ListDir();
            break;
        case '6':
            if (!extFlashOpened) {
                setUpFlash();
            }
            iprintf("Enter directory name: ");
            gets( inputBuf );
            iprintf("\r\n");
            f_chdir( inputBuf );
            ListDir();
            break;
        case '7':
            if (!extFlashOpened) {
                setUpFlash();
            }
            iprintf("Enter file name: ");
            gets( inputBuf );
            iprintf("\r\n");
            ret = testPlayer.OpenFile( inputBuf, wavBuffer, WAV_BUFFER_SIZE );
            if ( ret == WavPlayer::ERROR_FILE_SIZE ) {
                iprintf("Wav file too big. Increase WAV_BUFFER_SIZE or use smaller file.\r\n");
                break;
            }
            iprintf("Playing Audio...");
            testPlayer.Play( &playbackSem );
            OSSemPend( &playbackSem, 0 );
            iprintf(" Done\r\n");
            break;
        case '8':
            if (!extFlashOpened) {
                setUpFlash();
            }
            iprintf("Enter file name: ");
            gets( inputBuf );
            iprintf("\r\n");
            ret = testPlayer.OpenFile( inputBuf, wavBuffer, WAV_BUFFER_SIZE );
            if ( ret == WavPlayer::ERROR_FILE_SIZE ) {
                iprintf("Wav file too big. Increase WAV_BUFFER_SIZE or use smaller file.\r\n");
                break;
            }
            iprintf("Enter loop count (0 is infinite): ");
            gets( inputBuf );
            loopCount = atoi( inputBuf );
            iprintf("\r\nLooping Audio...");
            if (loopCount) {
                testPlayer.Loop( loopCount, &playbackSem );
                OSSemPend( &playbackSem, 0 );
            }
            else {
                iprintf("\r\nPress P to pause, R to resume, any other key to stop...");
                testPlayer.Loop( loopCount );
                while (testPlayer.GetState() != WavPlayer::STATE_FINISHED) {
                    key = getchar();
                    switch (key) {
                        case 'P':
                        case 'p':
                            testPlayer.Pause();
                            break;
                        case 'R':
                        case 'r':
                            testPlayer.Resume();
                            break;
                        default:
                            testPlayer.Stop();
                            break;
                    }
                }
            }
            iprintf(" Done\r\n");
            break;
#endif /* #ifdef WAV_PLAYER_FILESYSTEM */
        case 'p':
        case 'P':
            if (testPlayer.GetState() == WavPlayer::STATE_FINISHED) {
                iprintf("Playing Audio...");
                testPlayer.Play( &playbackSem );
                OSSemPend( &playbackSem, 0 );
                iprintf(" Done\r\n");
            }
            break;
        default:
            break;
    }
}
void ControlTask(void* pdata)
{
  INT8U err, err_tmr_2, err_tmr_start, err_sem;
  INT8U throttle = 0; /* Value between 0 and 80, which is interpreted as between 0.0V and 8.0V */
  void* msg;
  INT16S* current_velocity, diff_velocity;
  Sem_ControlTask = OSSemCreate(0);
  printf("Control Task created!\n");
  
  SWTimer_ControlTask = OSTmrCreate(0, CONTROL_PERIOD, OS_TMR_OPT_PERIODIC , Tmr_Callback_Control_Task, (void *)0,"S/W Timer 1",&err_tmr_2);   
   
    if(err_tmr_2 == OS_ERR_NONE){
        if(DEBUG)
        printf("Timer for CONTROL TASK is created and Started\n"); 
        
        OSTmrStart(SWTimer_ControlTask, &err_tmr_start);     
          
      }
      else {
      printf("Error while creating control task timer \n");     
     
      if(err_tmr_2 == OS_ERR_TMR_NON_AVAIL)
      printf(" OS_ERR_TMR_NON_AVAIL : CONTROL TASK \n");
      
      }

  while(1)
    {
      if(DEBUG)
      printf("Control task waiting for MBoxPost_Velocity \n\n");
      
      msg = OSMboxPend(Mbox_Velocity, 0, &err);
      current_velocity = (INT16S*) msg;
      
      // Set throttle value if gas pedal is pressed
      if((gas_pedal == on) && (engine == on)){
        throttle = throttle + 10;
        
        if(throttle > 80)
        throttle = 80;  // Max value of throttle 0 - 80
        
        if(DEBUG_IO)
        printf("********** Acclerate Gas_Pedal : %d **********\n", throttle);
      }
      else {
        throttle = 0;
      }
      
      if(engine == off){
        throttle = 0;
      }
      
      
      // Check for cruise control
      if((cruise_control == on) && (engine == on)){
        
        if(REF_VELOCITY == 0)
        REF_VELOCITY = *current_velocity;
        
        if(DEBUG_IO)
        printf("********** Cruise control Active ********** REF : %d \n",REF_VELOCITY);
        
        show_target_velocity((INT8U) (REF_VELOCITY/10));
        
       
        if(*current_velocity > REF_VELOCITY){    // Decrease throttle value
             diff_velocity = *current_velocity - REF_VELOCITY;
             
            if(diff_velocity > 15){
                throttle = 0;
            }
            else if(diff_velocity > 10){
                throttle = throttle - 30;
            }
            else {
                throttle = throttle - 10;
            }
            
            if(throttle <= 0) // Throttle  0-80
            throttle = 0;
            
            if(DEBUG_IO)
            printf("DEC throttle : %d \n", throttle);
        }
        else {
            diff_velocity = REF_VELOCITY - *current_velocity;
            
            if(diff_velocity > 15){
                throttle = 80;
            }
            else if (diff_velocity > 10){
                throttle = throttle + 30;
            }
            else {
               throttle = throttle + 10; 
            }
            
            if(throttle >= 80)
            throttle = 80;
            
            if(DEBUG_IO)
            printf("INC throttle : %d \n", throttle);
        }
      }
      else {
        //cruise_control = off;
        REF_VELOCITY = 0;
        IOWR_ALTERA_AVALON_PIO_DATA(DE2_PIO_HEX_HIGH28_BASE,0x0000);
      }
      
      err = OSMboxPost(Mbox_Throttle, (void *) &throttle);
      
      
      if(DEBUG)
      printf("MBoxPost_Throttle done by CONTROL TASK \n");

        if(DEBUG)
        printf("SEM ACCESS CONTROL TASK\n\n");
        
        OSSemPend(Sem_ControlTask, 0, &err_sem);
         
        if(DEBUG)
        printf("Control Task in Loop\n");
         
    }
}
Пример #17
0
//audio task
void AudioTask()
{
    OS_STATUS     os_status;
    UBYTE         os_err;
    AUDIO_STATUS  audio;
    USHORT        actualflagmask;
    GBOOL         audioStatus = GFALSE;
    U8            tsInput;
    U32           rx,wx;
    U32           offset;

    OSSemPend(driver_sync_sem, 0, &os_err);
    /* Do initialisation that requires the OS to be running or interrupts enabled*/
    /* None of the Core/Verifier or Application tasks are running */
    OSSemPost(driver_sync_sem);

    tsInput = GH_BM_getm_ReadEnable_HW_BUF_SEL();
    if(tsInput == GD_TSD_2)
        offset = GH_BM2_get_BufferSize(GD_TSD_AUDIO_PES);
    else
        offset = GH_BM1_get_BufferSize(GD_TSD_AUDIO_PES);

    while(1)
    {
        os_status = OSFlagPend(eventflagmask, eventflagtype, 0, &actualflagmask);

        //SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask ",actualflagmask,0,0);

        if((actualflagmask&AUDIO_FILE_PLAYED) == AUDIO_FILE_PLAYED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);

            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask1 ",actualflagmask,0,0);
            while(dataIndex < memDataSize)
            {
                OSTimeDly(50);
                GD_TSD_GetBufferPointer(GD_TSD_AUDIO_PES, tsInput, &rx, &wx);
                GHA_ResumeFeedData(memDataAddr, memDataSize, &dataIndex, &lastDataIndex, &pesLen, wx, rx-1);
                if(rx == 0)
                    wx =offset;
                else
                    wx =rx-1;
                if(tsInput == GD_TSD_2 )
                    GH_BM2_set_BufferWritePointer(GD_TSD_AUDIO_PES, wx);
                else
                    GH_BM1_set_BufferWritePointer(GD_TSD_AUDIO_PES, wx);
            }

            if(soundFileFlag == AUDIO_PLAYED)
            {
                //OSQPostToCore(HDI_PL_AUDIO_FILE_COMPLETED_XT, (void*)&loadcompleted, sizeof(HDI_PL_AUDIO_FILE_COMPLETED_XT));
                SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     loadcompleted.event_qualifier: ",loadcompleted.event_qualifier,0,0);
            }
            soundFileFlag = AUDIO_COMPLETED;

            GD_AUD_Stop();
            GD_AUD_Close();
            if(audioStatus == GTRUE)
            {
                HDIStartAudio();
                SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"  start audio",0,0,0);
            }
        }
        else if((actualflagmask&AUDIO_FILE_STOPPED) == AUDIO_FILE_STOPPED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask2 ",actualflagmask,0,0);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     loadcompleted.event_qualifier: ",loadcompleted.event_qualifier,0,0);
        }
        else if((actualflagmask&AUDIO_STATUS_STARTED) == AUDIO_STATUS_STARTED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask3 ",actualflagmask,0,0);

            if(audioStatus == GFALSE)
            {
                audioStatus = GTRUE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_RUNNING;

                audio.standard_id = MPEG;
                audio.parameters.mpeg_status.layer = aoparameter.audio_state.parameters.mpeg_status.layer;
                audio.parameters.mpeg_status.bitrate_index  = aoparameter.audio_state.parameters.mpeg_status.bitrate_index;
                audio.parameters.mpeg_status.sampling_frequency = aoparameter.audio_state.parameters.mpeg_status.sampling_frequency;
                audio.parameters.mpeg_status.mode = aoparameter.audio_state.parameters.mpeg_status.mode;
                audio.parameters.mpeg_status.emphasis = aoparameter.audio_state.parameters.mpeg_status.emphasis;

                OSTimeDly(30);
                HDIGetAudioStatus(&audio);

                SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     aoparameter.change_mask ",aoparameter.change_mask,0,0);

                if((aoparameter.audio_state.parameters.mpeg_status.layer!=audio.parameters.mpeg_status.layer)||
                    (aoparameter.audio_state.parameters.mpeg_status.bitrate_index!=audio.parameters.mpeg_status.bitrate_index)||
                    (aoparameter.audio_state.parameters.mpeg_status.sampling_frequency!=audio.parameters.mpeg_status.sampling_frequency)||
                    (aoparameter.audio_state.parameters.mpeg_status.mode!=audio.parameters.mpeg_status.mode)||
                    (aoparameter.audio_state.parameters.mpeg_status.emphasis!=audio.parameters.mpeg_status.emphasis))
                {
                    aoparameter.change_mask |= 0x04;
                    aoparameter.audio_state.parameters.mpeg_status.layer = audio.parameters.mpeg_status.layer;
                    aoparameter.audio_state.parameters.mpeg_status.bitrate_index = audio.parameters.mpeg_status.bitrate_index;
                    aoparameter.audio_state.parameters.mpeg_status.sampling_frequency = audio.parameters.mpeg_status.sampling_frequency;
                    aoparameter.audio_state.parameters.mpeg_status.mode = audio.parameters.mpeg_status.mode;
                    aoparameter.audio_state.parameters.mpeg_status.emphasis = audio.parameters.mpeg_status.emphasis;
                }

                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }
            aoparameter.change_mask = 0;
        }
        else if((actualflagmask&AUDIO_STATUS_STOPPED) == AUDIO_STATUS_STOPPED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask4 ",actualflagmask,0,0);

            if(audioStatus == GTRUE)
            {
                audioStatus = GFALSE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_STOPPED;
                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }

            aoparameter.change_mask = 0;
        }
        else if((actualflagmask&AUDIO_TUNER_RECONNECTED) == AUDIO_TUNER_RECONNECTED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask5 ",actualflagmask,0,0);
            if(audioStatus == GTRUE)
            {
                audioStatus = GFALSE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_STOPPED;
                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }
        }
        else if((actualflagmask&AUDIO_TUNER_REMOVED) == AUDIO_TUNER_REMOVED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask6 ",actualflagmask,0,0);

            if(audioStatus == GFALSE)
            {
                audioStatus = GTRUE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_RUNNING;
                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }
        }
    }
}
void ButtonIO(void* pdata)
{
  INT8U  err_tmr, err_tmr_start, err_sem;
  int button_status;
  Sem_ButtonIO = OSSemCreate(0);
  Sem_ButtonIO_IP = OSSemCreate(0); // For getting user Input
  
  printf("ButtonIO Task created!\n");
  
  SWTimer_ButtonIO = OSTmrCreate(0, ButtonIO_PERIOD, OS_TMR_OPT_PERIODIC , Tmr_Callback_ButtonIO_Task, (void *)0,"ButtonIO",&err_tmr);   
   
    if(err_tmr == OS_ERR_NONE){
        if(DEBUG)
        printf("Timer for ButtonIO is created\n");
        
         OSTmrStart(SWTimer_ButtonIO, &err_tmr_start);  
       
       if(err_tmr_start == OS_ERR_NONE){        
           if(DEBUG)
           printf("Timer Started in ButtonIO \n");
        }
        else {
            printf("Problem starting timer in ButtonIO TASK \n");
        }        
      }
      else {
      printf("Error while creating ButtonIO task timer \n");     
     
      if(err_tmr == OS_ERR_TMR_INVALID_OPT)
      printf(" OS_ERR_TMR_INVALID_OPT : ButtonIO TASK \n");
      
      }

  while(1)
    {
      if(DEBUG)
      printf("ButtonIO task \n");
      
      button_status = buttons_pressed();
      
      if(DEBUG)
      printf("Button Status : %d, %x \n",button_status, button_status & 15);
      
      button_status = button_status & 15;
      
      if(button_status & 4) // Brake Pedal pressed
      {
        
        brake_pedal = on;
        cruise_control = off;       
      }
      else {
            brake_pedal = off;
        } 
      
      if((button_status & 1) && (engine == on)) // Gas Pedal pressed
      {
        gas_pedal = on;
        cruise_control = off;
      }
      else {
          gas_pedal = off; 
      }   
      
      // Cruse Contol pressed
      if((button_status & 2) && (top_gear == on) && (CUR_VELOCITY >= Threshold_Velocity_CC) && (gas_pedal == off) && (brake_pedal == off)) 
      {
        if(DEBUG_IO)
        printf("Cruise control detected -----");
        
        cruise_control = on;
      }   

      OSSemPost(Sem_ButtonIO_IP);   
       
        if(DEBUG)
        printf("SEM ACCESS ButtonIO TASK\n\n");
            
        OSSemPend(Sem_ButtonIO, 0, &err_sem);
        
        if(DEBUG)
        printf("ButtonIO Task in Loop\n");        
    }
}
Пример #19
0
/*
*********************************************************************************************************
* Output PWM
*********************************************************************************************************
*
*********************************************************************************************************
*/
void OutputTask(void *p_arg)
{
  CPU_TS ts;
  OS_ERR  err;
  
  CPU_INT16U Commande;
  CPU_INT16U value;
  CPU_INT16U last_value;
  
  float angle_value;
  float angle_Commande;
  
  float PID;
  
  //Flush the first conversion, the data is sometime wrong
  OSSemPend(&semADC_Complete,0,OS_OPT_PEND_BLOCKING,&ts,&err);
  //Reset the ticks for calculation of the frequency of the PID
  OSTimeSet(0,&err);
  
  while (1)
  {
    
    //Pend on data ready from the ADC interrupt
    OSSemPend(&semADC_Complete,0,OS_OPT_PEND_BLOCKING,&ts,&err);
    
    //Get the ADC value
    OSMutexPend(&mutADC,0,OS_OPT_PEND_BLOCKING,&ts,&err);
    value = strSemADC.uValue;
    OSMutexPost(&mutADC,OS_OPT_POST_NONE,&err);
    
    //Get the Command value from Timer3
    OSMutexPend(&mutTMR3,0,OS_OPT_PEND_BLOCKING,&ts,&err);
    Commande = Command;
    OSMutexPost(&mutTMR3,OS_OPT_POST_NONE,&err);
    
    
    //Regression Linéaire
    angle_value = (value-290.45)/19.12;
    angle_Commande = (Commande-600)/10;
    
    
    //Timestamp Print shows that
    //a delay of 50ms is usualy precise on a long period of time so
    // there is no need to calculate it software like
    //float PIDcal(float setpoint,float actual_position,(TIMESTAMP-LASTTIMESTAMP)*Tick_Period)
    //instead we will use a defined value in PID.h for the deltaT
    //To see the veracity of this affirmation, simply enable this printf
    // printf("TS = %d\n\r", GetTimeStamp());
    //According to the usage of the CPU, the delay between calls to this function can change
    //Make sure there is enough process to calculate an efficient PID or use the TIMESTAMP-LASTTIMESTAMP
    //in PID to make sure deltaT is correct
    
    //Calcul du PID
    PID=PIDcal(angle_Commande,angle_value);
    
    //Protection du moteur
    //Arret du moteur si on approxime la commande
    if(abs(angle_Commande - angle_value) < .8)
      TIM1->CCR1=0;
    //Réduction de la vitesse si on approxime la commande
    else if(abs(angle_Commande - angle_value) < 5)
      TIM1->CCR1=(int)(400+150*abs((int)PID));
    //Vérification des limites physique du moteur
    else if(value-last_value > 0)
    {
      if(value-(last_value - value) < 500) //Limite atteinte
        TIM1->CCR1=500;
      else
        TIM1->CCR1=(int)(500+700*abs((int)PID)); //Fonctionnement normal
    }
    else
    {
      if(2*value-last_value > 3500)         //Limite atteinte
        TIM1->CCR1=500;
      else
        TIM1->CCR1=(int)(500+700*abs((int)PID)); //Fonctionnement normal
    }
    
    //Determine le sens du moteur
    if (PID>0)
      TIM1->CCER=0x01;
    else
      TIM1->CCER=0x04;
    
  }
  
}
void SwitchIO(void* pdata)
{
  INT8U err_tmr, err_tmr_start, err_sem, switch_status;

  Sem_SwitchIO = OSSemCreate(0);
  Sem_SwitchIO_IP = OSSemCreate(0); // For getting user input
  
  printf("SwitchIO Task created!\n");
  
  SWTimer_SwitchIO = OSTmrCreate(0, SwitchIO_PERIOD, OS_TMR_OPT_PERIODIC , Tmr_Callback_SwitchIO_Task, (void *)0,"SwitchIO",&err_tmr);   
   
    if(err_tmr == OS_ERR_NONE){
        OSTmrStart(SWTimer_SwitchIO, &err_tmr_start);
        
        if(DEBUG)
        printf("Timer for SwitchIO is created and Started \n");        
      }
      else {
      printf("Error while creating SwitchIO task timer \n");     
     
      if(err_tmr == OS_ERR_TMR_NAME_TOO_LONG)
      printf(" OS_ERR_TMR_NAME_TOO_LONG : SwitchIO TASK \n");
          
      }

  while(1)
    {
      if(DEBUG)
      printf("SwitchIO task \n");
      
       switch_status = switches_pressed();
       
       if(DEBUG)
       printf("Switch Status : %d \n", switch_status);
       
       if(switch_status & 1) // Engine pressed
       {
            engine = on;
       }
       else if(CUR_VELOCITY == 0){
            engine = off;
       }
       
       if(switch_status & 2) // Top Gear pressed
       {
            top_gear = on;
       }
       else {
            top_gear = off;
            cruise_control = off;
       }
       
       OSSemPost(Sem_SwitchIO_IP);
       
        if(DEBUG)
        printf("SEM ACCESS SwitchIO TASK\n\n");
        
        OSSemPend(Sem_SwitchIO, 0, &err_sem);        
         
        if(DEBUG)
        printf("SwitchIO Task in Loop\n");       
    }
}
Пример #21
0
/**
 * This task polls the switches and then 
 * posts a message to the message queue 
 * if an alarm needs to be activated
 */
void switchTask(void *data) {
	// Error Referene
	INT8U err;

	// Local zone status
	auto int localZone0;
	auto int localZone1;
	auto int localZone2;
	auto int localZone3;
	// Local switch state
	auto int sw0State;
	auto int sw1State;
	auto int sw2State;
	auto int sw3State;
	// Result for message queue
	static char result;

	// Initialize zones
	localZone0 = ON;
	localZone1 = ON;
	localZone2 = ON;
	localZone3 = ON;
	// Initialize switch state
	sw0State = OFF;
	sw1State = OFF;
	sw2State = OFF;
	sw3State = OFF;

	// Loop forever
	while(1) {
		// Check switches
		sw0State = digIn(ID_SWITCH_1);
		sw1State = digIn(ID_SWITCH_2);
		sw2State = digIn(ID_SWITCH_3);
		sw3State = digIn(ID_SWITCH_4);

		// Check to see if we have any switches
		if(!sw0State || !sw1State || !sw2State || !sw3State ) {

			// Take a semaphore and get the current zone states
			OSSemPend(zoneSem, 0, &err);
				localZone0 = zone0State;
				localZone1 = zone1State;
				localZone2 = zone2State;
				localZone3 = zone3State;
			OSSemPost(zoneSem);

			// Check to see which zones (if any) have been triggered
			if(!sw0State && localZone0 == ON) {
				// Msg Queue Zone 0
				result = '0';
			}
			else if(!sw1State && localZone1 == ON) {
				// Msg Queue Zone 1
				result = '1';
			}
			else if(!sw2State && localZone2 == ON) {
				// Msg Queue Zone 2
				result = '2';
			}
			else if(!sw3State && localZone3 == ON) {
				// Msg Queue Zone 3
				result = '3';
			}
			else {
				//Nope
				result = 'A';
			}

			// Post the message
			printf("Posting alarm message \n");
			OSQPost(msgQueuePtr, (void *)&result);

		}

		// Update Alarm State (in case web bypassed/disarmed)
		OSSemPend(alarmSem, 0, &err);

			if(alarming == OFF) {
				digOut(ID_BUZZER, OFF);
				digOut(LED_0_ID, OFF);
				digOut(LED_1_ID, OFF);
				digOut(LED_2_ID, OFF);
				digOut(LED_3_ID, OFF);
			}
		OSSemPost(alarmSem);

		//Done
		OSSemPost(switchToHTTP);
		// Try to take a semaphore, this will block us
 		OSSemPend(httpToSwitch, 0, &err);
	}
}
Пример #22
0
/*********************************************************************************************************
** Function name:           taskStart	   
** Descriptions:            Start task	
** input parameters:        *parg
** output parameters:       ?      
** Returned value:          ? 
*********************************************************************************************************/
static void TaskStart (void  *parg)
{

		INT8U err;
		UserRS485Send ussend;
	
    (void)parg;


	
    #if OS_TASK_STAT_EN > 0
    OSStatInit();                                                       /*  Enable statistics           */
    #endif
	
		/* Init the file system */
	
	optionSaveStruct.masterIP[1]=0xaa;
	
	EEPROM_WriteStruct(optionSaveStruct);
	
    yaffs_start_up();	
		File_Init();
		
		KeyInit();
   	KeyQueueHead=OSQCreate(KeyMsg,KEYQSIZE);		//创建按键消息队列 在优先级较高的任务中执行
		
		ConfigQueueHead = OSQCreate( ConfigMsg, CONFIGQSIZE );
		UploadQueueHead = OSQCreate( UploadMsg, UPLOADQSIZE );
	
		EquipmentTaskSem = OSSemCreate(0);
		UartRcvTaskSem   = OSSemCreate(1);
		sem_tcp_init_done = OSSemCreate(0);
		UartSendTaskSem = OSSemCreate(1);
		
		tcpip_init(tcpip_init_done, NULL);
    OSSemPend(sem_tcp_init_done, 0, &err);

    eth_netif_init(ipConfig);
		
		TCPTest();
 
    err = OSTaskCreate((void (*)(void *)) Equipment_Task,				
                          (void          * ) 0,							
                          (OS_STK        * )&TaskEquipmentStk[TASK_KEY_STK_SIZE - 1],		
                          (INT8U           ) TASK_EQUIPMENT_PRIO  );  				/*	Create Equipment Task */
		
		//printf("Equipment_Task: err = %d\n", err );
	
		err = OSTaskCreate((void (*)(void *)) UartRcv_Task,				
                          (void          * ) 0,							
                          (OS_STK        * )&TaskUartRcvStk[TASK_KEY_STK_SIZE - 1],		
                          (INT8U           ) TASK_UART_RCV_PRIO  );  				  /*	Create Equipment Task */
													
		//printf("UartRcv_Task: err = %d\n", err );
													
		err = OSTaskCreate((void (*)(void *)) FileReceive_Task,				
                          (void          * ) 0,							
                          (OS_STK        * )&TaskFileRcvStk[TASK_FILERCV_STK_SIZE - 1],		
                          (INT8U           ) TASK_FILE_RCV_PRIO  );  			  	/*	Create FileReceive Task */
		
		//printf("FileReceive_Task: err = %d\n", err );
				
		err = OSTaskCreate((void (*)(void *)) hvsftpd_main,				
                          (void          * ) 0,							
                          (OS_STK        * )&TaskFtpStk[TASK_FTP_STK_SIZE - 1],		
                          (INT8U           ) TASK_FTP_PRIO  );  			  	/*	Create FileReceive Task */
		
		printf(" hvsftpd_Task: err = %d\n", err );
													
	
		err = OSTaskCreate ((void (*)(void	*))Menu_Task, 
						   (void 	*)0,   
						   (OS_STK	*)&Gstk2[MENU_TASK_STK_SIZE-1],
						   (INT8U	 )MENU_TASK_PRIO  	);                           /*  Create Menu Task     */ 	
							 
/*		err = OSTaskCreate ((void (*)(void	*))Test_Key, 
						   (void 	*)0,   
						   (OS_STK	*)&TestStk[511],
						   (INT8U	 )44  	);                           /  Create Menu Task     */ 	
			
		App_KeyTaskCreate();						  /* Create Task Key */

#if	FRMB_DEBUG
		ussend.address=0x00;
		ussend.ctrl=0x01;
		ussend.data[0]=0xaa;
		ussend .len=1;
		ussend.CRCH=0x00;
		ussend.CRCL=0x11;
#else

//		err=OSTaskCreate((void (*)(void *))FMB_Task,
//											(void *)0,
//											(OS_STK *)&FMBStk[FMB_TASK_STK_SIZE-1],
//											(INT8U )FMB_TASK_PRIO	);
//											
//		err=OSTaskCreate((void (*)(void *))FMB_Poll_Task,
//											(void *)0,
//											(OS_STK *)&FMBPollStk[FMB_TASK_STK_SIZE-1],
//											(INT8U )FMB_POLL_TASK_PRIO	);									
											
		
		
	
#endif

		while (1) 
		{
#if	FRMB_DEBUG
			RS485Send_Struct(RS485_UART0,&ussend);
			RS485Send_Struct(RS485_UART2,&ussend);
			RS485Send_Struct(RS485_UART3,&ussend);
			RS485Send_Struct(RS485_UART4,&ussend);
#else			
 			
			
			
#endif
			//OSTimeDly(500);		
			OSTaskSuspend(OS_PRIO_SELF);                                    /*  The start task can be pended*/
                                                                        /*  here. ??????????  */			
		}
}
Пример #23
0
/**
  Function Name	: Wave_Start_Playing
  Engineer      : Gustavo Denardin
  Date          : 16/06/2011
  
  Parameters	: Nothing
  Returns       : Nothing
  Notes         : 
*/
void Wave_Start_Playing(void)
{
	WAVE_BUFFER *WaveInfo;
	INT8U		*Buff8;
	INT16S		*Buff16;
	INT16U		size = 0;
	INT8U		first = 0;
	
	//_DAC1_Enable();
	//Sound_AudioAmplifierTurnOn();	//Turn On the Audio Amplifier
	
	OSSemPost(OpenWave);	
	
	for(;;)
	{
    	(void)OSMboxPend(SendWaveBuffer,(void **)&WaveInfo,0);
  	
    	
	#if (_VOLUME_CONTROL == 1)
    	if(SetVolumeLevel == 0)	//Mute
    	{
    		//Sound_AudioAmplifierStandby();				//Standby the Audio Amplifier
    	}
    	else
    	{
    		//Sound_AudioAmplifierTurnOn();				//Turn On the Audio Amplifier
    		//Sound_VolumeControl((INT8U)SetVolumeLevel);	//Set Volume level
    	}
	#endif
    	
    	
    	if (first == 0)
    	{
    		first = 1;
    		
    		//Set sample rate: (8kHz, 11.025kHz, 44.1kHz or 48khz)
    		Wave_SetSampleRate(WaveInfo->SampleRate);

    		//Enable timer
    		Timer2Start();
    	}
    	
    	if ((WaveInfo->Size) == 0)
    	{
    		break;
    	}
    	size = WaveInfo->Size;

    	
    	if (WaveInfo->BitRate == 16)
    	{
    		Buff16 = (INT16S*)WaveInfo->Buff;
    	}
    	
    	else if (WaveInfo->BitRate == 8)
		{
			Buff8 = (INT8U*)WaveInfo->Buff;
		} 
    	   		
    	do
    	{
			OSSemPend(Audio,0);

			if (WaveInfo->BitRate == 16)
			{
				if (vol > 0)
				{
					DAConvert(((ByteSwap(*Buff16)) >> (4 + (10 - vol))) + 2048);
				}else
				{
					DAConvert(0);
				}
				Buff16++;
				if((WaveInfo->NumChannels) == 2)
				{
					Buff16++;	//Pula o  pacote do outro canal
					size--;
				}
			}
			
			else if (WaveInfo->BitRate == 8)
Пример #24
0
/*
*********************************************************************************************************
*                                            APPLICATION TASK DEFINITIONS
*********************************************************************************************************
*/
static void appTaskCommand(void *pdata) {
      
  uint8_t osStatus;
	char command[72];
	uint32_t commandLen;
	uint32_t i;
	uint32_t j;

  /* Start the OS ticker -- must be done in the highest priority task */
  SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC);
  
  while ( true ) {
      OSSemPend(packetSem, 0, &osStatus);
		  commandLen = xbee.xbeeNetstring(packetBuf, command);
      switch (command[0]) {
        case '1': {
          led1Flashing = !led1Flashing;
          break;
        }
        case '2': {
          led2Flashing = !led2Flashing;
          break;
        }
        case '3': {
          led3Flashing = !led3Flashing;
          break;
        }
        case '4': {
          led4Flashing = !led4Flashing;
          break;
			  }
        case '5': {
          break;
			  }
        case '6': {
          memset(testMessage, ' ', 60);
					testMessage[60] = '\0';
					for (i = 1, j = 0; j < commandLen - 1; i += 1, j += 1) {
						testMessage[j] = command[i];
					}
				  d->setCursor(2,22);
				  d->printf("%s", testMessage);
          break;
        }
				case 'R': {
					d->fillScreen(RED);
					break;
				}
				case 'G': {
					d->fillScreen(GREEN);
					break;
				}
				case 'B': {
					d->fillScreen(BLUE);
					break;
				}
				case 'W': {
					d->fillScreen(WHITE);
					break;
				}
        default: {
          break;
        }
			}
  }
}      
Пример #25
0
static void timerTask(void *data)
{	
	Timer *thisTimer;
	void (* timerHandler)(void *);
	void *timerArg;
    UBYTE err;

	for (;;) {
		/* If no ready timers, wait for one.  Note that the mutex is just
		 * to protect the timer queue.  Somebody needs to wake us up when
		 * a timer expires. */
#ifdef OS_DEPENDENT
		OSSemPend(mutex, 0, &err);
#endif
		thisTimer = timerHead.timerNext;
		if ((long)(thisTimer->expiryTime - OSTimeGet()) > 0) {
#ifdef OS_DEPENDENT
			OSSemPost(mutex);
			(void) OSTaskSuspend(OS_PRIO_SELF);
#endif
#if ONETASK_SUPPORT > 0
      // In non multitasking environment - return
      // We don't want to loop for ever!
      return;
#endif
		}
		else {
			/* If the timer is the sentinal, reset the expiry time to the
			 * maximum delay.  This way the timer interrupt handler doesn't
			 * need to do a separate test for the timer queue being empty.
			 */
			if (thisTimer == &timerHead) {
				timerHead.expiryTime = OSTimeGet() + MAXJIFFYDELAY;
			}
			else {
				/* Remove the timer from the queue and if it's marked
				 * as temporary, put it back on the free list. */
				thisTimer = timerHead.timerNext;
				(timerHead.timerNext = thisTimer->timerNext)->timerPrev = &timerHead;
				thisTimer->timerPrev = NULL;
				if (thisTimer->timerFlags & TIMERFLAG_TEMP) {
					thisTimer->timerNext = timerFree;
					timerFree = thisTimer;
				}
			}
			
			/* Update timer counter - used as activity counter for
			 * development purposes. */
			thisTimer->timerCount++;
			
			/* Get the handler parameters which could change when
			 * we post the mutex. */
			timerHandler = thisTimer->timerHandler;
			timerArg = thisTimer->timerArg;
			
			/* Invoke the timer handler.  Make sure that we post the mutex 
			 * first so that we don't deadlock if the handler tries to reset
			 * the timer. */
#ifdef OS_DEPENDENT
			OSSemPost(mutex);
#endif
			timerHandler(timerArg);
		}
	}
}
Пример #26
0
/*
 * Main Task
 */
void MainTask(void* pdata) {
//	int frameDone = 0; // RC required
	printf("Starting Main task...\n");

	int16_t avgSensorData[9] = { 0 }; //Order: ACC- GYR - COMP
	uint32_t averagedDataDeltaT = 0;
	float filteredSensorData[9] = { 0 }; //Order: ACC- GYR - COMP

	int16_t rcValues[8];

	INT8U os_err = OS_ERR_NONE;
	uint8_t data_err = NO_ERR;

	struct logData* loggData = malloc(sizeof(struct logData));

	while (1) {
		//Semaphore for periodic task
		OSSemPend(mainTaskSem, 0, &os_err);


		//Sensor Test
		if (SDM_NEW_DATA_AVAILABLE == 1) {
			os_err = getSensorData(avgSensorData, &averagedDataDeltaT);
			data_err = filterSensorData(avgSensorData, filteredSensorData, averagedDataDeltaT); //only filter new data
		}

		if (RC_RECEIVER_NEW_DATA_AVAILABLE == 1 ){
			getRCvalues(rcValues); //new rc commands will be copied in local array
			printf("THROTTLE: %d\tROLL: %d\tYAW: %d\tPITCH: %d\n", rcValues[RC_THROTTLE_INDEX], rcValues[RC_ROLL_INDEX], rcValues[RC_YAW_INDEX], rcValues[RC_PITCH_INDEX]);
		}

		//assuming X axis from Filter is PITCH
		float pidPITCHMidVal = PIDPitchCalculation(rcValues[RC_PITCH_INDEX], (float) filteredSensorData[EULER_PITCH_INDEX]);

		//assuming X axis from Filter is ROLL
		float pidROLLMidVal = PIDRollCalculation(rcValues[RC_ROLL_INDEX], (float) filteredSensorData[EULER_ROLL_INDEX]);

		//assuming X axis from Filter is YAW
		float pidYAWMidVal = PIDYawCalculation(rcValues[RC_YAW_INDEX], (float) filteredSensorData[EULER_YAW_INDEX]);

//			printf("PITCH: %f\tROLL: %f\tYAW: %f\n", pidPITCHMidVal, pidROLLMidVal, pidYAWMidVal); //debug print

		mapToMotors(rcValues[RC_THROTTLE_INDEX], pidROLLMidVal, pidPITCHMidVal, pidYAWMidVal);



		//TODO Copy new Data to Struct for logging
//		int i;
//		for (i = 0; i < 9; ++i) { //copy logging data to txStruct
//			loggData->raw[i] = avgSensorData[i];
//			loggData->filter[i] = filteredSensorData[i];
//		}
//
//		loggData->pid[0] = pidPITCHMidVal;
//		loggData->pid[1] = pidROLLMidVal;
//		loggData->pid[2] = pidYAWMidVal;
//
//		int j;
//		for (j = 0; j < 8; ++j) {
//			loggData->rawRadio[i] = rcValues[i];
//		}
//		OSQPost(loggerQsem, (void*) loggData);
	}
}
Пример #27
0
/**
\brief A demo task to show the use of the SPI.
*/
static void spiTask(void* unused) {
   INT8U                     i;
   dn_error_t                dnErr;
   INT8U                     osErr;
   dn_spi_open_args_t        spiOpenArgs;
   INT8U                     sendStatus;
   INT8U                     pkBuf[sizeof(loc_sendtoNW_t) + APP_DATA_BUF_SIZE];
   loc_sendtoNW_t*           pkToSend;
   dn_ioctl_spi_transfer_t   spiTransfer;
   
   //===== initialize the configuration file
   initConfigFile();
   
   //===== initialize packet variables
   pkToSend = (loc_sendtoNW_t*)pkBuf;
   
   //===== initialize SPI
   // open the SPI device
   spiOpenArgs.maxTransactionLenForCPHA_1 = 0;
   dnErr = dn_open(
      DN_SPI_DEV_ID,
      &spiOpenArgs,
      sizeof(spiOpenArgs)
   );
   if ((dnErr < DN_ERR_NONE) && (dnErr != DN_ERR_STATE)) {
      dnm_cli_printf("unable to open SPI device, error %d\n\r",dnErr);
   }
   
   // initialize spi communication parameters
   spiTransfer.txData             = spiNetApp_vars.spiTxBuffer;
   spiTransfer.rxData             = spiNetApp_vars.spiRxBuffer;
   spiTransfer.transactionLen     = sizeof(spiNetApp_vars.spiTxBuffer);
   spiTransfer.numSamples         = 1;
   spiTransfer.startDelay         = 0;
   spiTransfer.clockPolarity      = DN_SPI_CPOL_0;
   spiTransfer.clockPhase         = DN_SPI_CPHA_0;
   spiTransfer.bitOrder           = DN_SPI_MSB_FIRST;
   spiTransfer.slaveSelect        = DN_SPI_SSn0;
   spiTransfer.clockDivider       = DN_SPI_CLKDIV_16;
   
   //===== wait for the mote to have joined
   OSSemPend(spiNetApp_vars.joinedSem,0,&osErr);
   ASSERT(osErr == OS_ERR_NONE);
   
   while(1) { // this is a task, it executes forever
      
      //===== step 1. write over SPI
      
      // set bytes to send
      for (i=0;i<sizeof(spiNetApp_vars.spiTxBuffer);i++) {
         spiNetApp_vars.spiTxBuffer[i] = i;
      }
      
      // send bytes
      dnErr = dn_ioctl(
         DN_SPI_DEV_ID,
         DN_IOCTL_SPI_TRANSFER,
         &spiTransfer,
         sizeof(spiTransfer)
      );
      if (dnErr < DN_ERR_NONE) {
         dnm_cli_printf("Unable to communicate over SPI, err=%d\r\n",dnErr);
      }
      
      //===== step 2. print over CLI
      
      dnm_cli_printf("SPI sent:    ");
      for (i=0;i<sizeof(spiNetApp_vars.spiTxBuffer);i++) {
         dnm_cli_printf(" %02x",spiNetApp_vars.spiTxBuffer[i]);
      }
      dnm_cli_printf("\r\n");
      
      dnm_cli_printf("SPI received:");
      for (i=0;i<sizeof(spiNetApp_vars.spiRxBuffer);i++) {
         dnm_cli_printf(" %02x",spiNetApp_vars.spiRxBuffer[i]);
      }
      dnm_cli_printf("\r\n");
      
      //===== step 3. send data to manager
      
      // fill in packet "header"
      // Note: sendto->header is filled in dnm_loc_sendtoCmd
      pkToSend->locSendTo.socketId          = loc_getSocketId();
      pkToSend->locSendTo.destAddr          = DN_MGR_IPV6_MULTICAST_ADDR; // IPv6 address
      pkToSend->locSendTo.destPort          = WKP_SPI_NET;
      pkToSend->locSendTo.serviceType       = DN_API_SERVICE_TYPE_BW;   
      pkToSend->locSendTo.priority          = DN_API_PRIORITY_MED;   
      pkToSend->locSendTo.packetId          = 0xFFFF;
      
      // fill in the packet payload
      memcpy(&pkToSend->locSendTo.payload[0],&spiNetApp_vars.spiRxBuffer[0],APP_DATA_BUF_SIZE);
      
      // send the packet
      dnErr = dnm_loc_sendtoCmd(pkToSend, APP_DATA_BUF_SIZE, &sendStatus);
      ASSERT (dnErr == DN_ERR_NONE);
      
      //===== step 4. pause until next iteration
      
      // this call blocks the task until the specified timeout expires (in ms)
      OSTimeDly(spiNetApp_vars.period);
   }
}
Пример #28
0
void etherLock(void)
{
    UBYTE err;
    OSSemPend(mutex, 0, &err);
}
Пример #29
0
/**************************************************
*Clocktask - counts the number of clock cycles like a 12 hour clock
* uses a secflag in order to count a 1 second cycle
Initialize: TimeOfDay
*******************************************************/
static void ClockTask(void *p_arg)
{
    INT8U error;
    INT8U key;
    INT8U keypress;
    INT8U err;
    (void)p_arg;                               
    FOREVER()
    {
        DBUG_PORT &= ~PP3;
        OSSemPend(SecFlag, 0 ,&err);
        DBUG_PORT |= PP3;
        TimeOfDay.sec = TimeOfDay.sec + 1;
      
        if(TimeOfDay.sec > 0x3B && TimeOfDay.min < 0x3B && TimeOfDay.hr < 0x0D)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min++;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x0C)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x01;
        }
        
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x01)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x02;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x02)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x03;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x03)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x04;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x04)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x05;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x05)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x06;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x06)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x07;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x07)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x08;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x08)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x09;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x09)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x0A;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x0A)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x0B;
        }
        else if (TimeOfDay.sec > 0x3B && TimeOfDay.min == 0x3B 
                 && TimeOfDay.hr == 0x0B)
        {
            TimeOfDay.sec = 0x00;
            TimeOfDay.min = 0x00;
            TimeOfDay.hr = 0x0C;
        }

        else
        {
        }
               
    }
}
Пример #30
0
void PCInterfaceTask(void *data)
{
    IO_MSG msg;
    OSMsg *pci_msg;
    UBYTE err;
    ULONG task_event;
    USHORT timeout = FAST_PEND_TIMEOUT;
    
#if defined(QCBUILD_HDI) || defined(QCBUILD_NDC)
	/* not required by API version as engine.c does this */
    /* do not set this task running until after the drivers are away */
    OSSemPend(driver_sync_sem, 0, &err);
    OSSemPost(driver_sync_sem);
#endif
    
    /*
     * Loop forever handling sequence manager requests and attempting
     * to read data from RS232 port (PC interface).
     */
    for(;;)
    {
        pci_msg = OSQPend(PCI_EV_QUEUE, timeout, &err);
        
        if (err == OS_TIMEOUT)
        {
            /* ensure msg is NULL to prevent accidental freeing */
            pci_msg    = NULL;
            task_event = STB_EV_PCI_TIMED_OUT;
        }
        else 
        {
            task_event = pci_msg->msg_ev;
        }
        
        switch (task_event)
        {
            case SEQ_EV_ESTBLSH_COMMS_LINK:
                /* open connection to PC */
                OpenConnection();
#ifdef _INC_HELLOWORLD
                if (is_link_open)
                {
                    strcpy((char*)msg.byte, "hello world");
                    msg.size = strlen((char*)msg.byte);
                    WriteConnection(&msg);
                }
#endif
                timeout = FAST_PEND_TIMEOUT;
                break;

            case SEQ_EV_DROP_COMMS_LINK:
                /* drop connection to PC (if any) */
                CloseConnection();
                timeout = SLOW_PEND_TIMEOUT;
                break;

            case STB_EV_PCI_TIMED_OUT:                
            default:
                /* read data from connection (if open) */
                if (is_link_open)
                {
                    if (ReadConnection(&msg))
                    {
                        if (msg.size > 0)
                        {
                            /* have something */
                            if (IsEstablishLinkData(&msg))
                            {
                                ActionEstablishLinkCommand(&msg);
                            }
                            else if (IsUploadData(&msg))
                            {
                                ActionUploadData(&msg);
                            }
                            else if (IsDownloadData(&msg))
                            {
                                ActionDownloadData(&msg);
                            } /* else invalid message read */
                        } /* else nothing read */
                    } /* else read failure occurred */
                } /* else no link established */
                break;
        }

        /* free the buffer obtained with OSSemPend */
        if (pci_msg != NULL) /* don't free a NULL buffer */
        {
#ifndef CLAYMORE        
            OSFreeMsgBuffer(pci_msg);
#else
			OSFreeMsgBuffer(PCI_EV_QUEUE,pci_msg);
#endif            
        }               
    }
    TOUCH(data); /* remove compilation warning */
}