Пример #1
0
static portTASK_FUNCTION(TimeTask,pvParameters)
{
	unsigned char frame[MAX_FRAME_SIZE];
	int num_datos;
	int tiempoSim;
	uint32_t hora;

	while(1)
	{
		vTaskDelay(configTICK_RATE_HZ); //cada segundo

		tiempoSim=getTiempoSim(); //Obtenemos la equivalencia de 1 segundo Real son tiempoSim minutos en el simulado
		hora = getHora(); //Obtenemos la hora

		hora+=tiempoSim; //aumentamos hora tiempoSim (Minutos)
		if(hora>1440){ //si llegamos a las 24:00 (1440 minutos) ponemos las 00:00
			hora=0;
		}

		//Modificamos y enviamos la hora
		setHora(hora);

		num_datos=create_frame(frame, COMANDO_TIME, &hora, sizeof(hora), MAX_FRAME_SIZE);
		if (num_datos>=0){
			send_frame(frame, num_datos);
		}else{

			logError(num_datos);

		}

	}
}
Пример #2
0
void main( void )
{
    unsigned long int duracaoAlarme = 0;
    setup_adc_ports( NO_ANALOGS );
    set_tris_b( 0b01110000 );
    set_tris_c( 0x00 );
    set_tris_d( 0x00 );
    portc = 0;
    portd = 0;
    //Habilito os displays
    output_high( PIN_B3 );
    output_high( PIN_B2 );
    //Faço o setup do timer1 para clock interno e com prescaler de 8. A base de tempo é de 1/( 20MHz/4/8 )= 1.6uS
    setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 );
    //Carrego o timer com 34285 de forma que ele conte ( 65535 - 34285 ) = 31250*1.6uS = 50ms.
    set_timer1( 34285 );
    //Habilito as interrupções do timer1 e da porta b
    enable_interrupts( global );
    enable_interrupts( int_timer1 );
    enable_interrupts( int_rb );

    while( 1 )
    {
        switch( Clock.flgs.mode )
        {
        case 0:
            //Modo 0: Atualizo a hora no display e verifico a ocorrência do alarme. Caso esteja na hora de alarme,
            //faço o led de alarme piscar a cada 1 segundo durante 1 minuto.
            output_high( PIN_B2 );
            output_high( PIN_B3 );
            driverDisplay( &Clock.time );

            if( Clock.time.hora == Clock.alarmTime.hora )
            {
                if( Clock.time.minuto == Clock.alarmTime.minuto )
                {
                    Clock.flgs.alarme = 1;
                }
            }

            if( Clock.flgs.alarme )
            {
                duracaoAlarme++;

                if( !( duracaoAlarme%100 ) )
                {
                    portb^=0x02;
                }
                else if( duracaoAlarme > 6000 )
                {
                    duracaoAlarme = 0;
                    Clock.flgs.alarme = 0;
                    output_high( PIN_B1 );
                }
            }

            break;

            //Modo 1: Setando hora
        case 1:
            setHora( &Clock.time );
            break;

            //Modo 2: Setando minuto
        case 2:
            setMinuto( &Clock.time );
            break;

            //Modo 3: Setando hora do alarme
        case 3:
            setHora( &Clock.alarmTime );
            break;

            //Modo 4: Setando minuto do alarme
        case 4:
            setMinuto( &Clock.alarmTime );
            break;
        }

        //meu loop terá 10ms
        delay_ms( 10 );
    }
}
Пример #3
0
// Codigo para procesar los comandos recibidos a traves del canal USB
static portTASK_FUNCTION( CommandProcessingTask, pvParameters ){



	unsigned char frame[MAX_FRAME_SIZE];	//Ojo, esto hace que esta tarea necesite bastante pila
	int numdatos;
	unsigned int errors=0;
	unsigned char command;
	EventBits_t bits;



	/* The parameters are not used. */
	( void ) pvParameters;


	for(;;)
	{
		numdatos=receive_frame(frame,MAX_FRAME_SIZE);
		if (numdatos>0)
		{	//Si no hay error, proceso la trama que ha llegado.
			numdatos=destuff_and_check_checksum(frame,numdatos);
			if (numdatos<0)
			{
				//Error de checksum (PROT_ERROR_BAD_CHECKSUM), ignorar el paquete
				errors++;
				// Procesamiento del error (TODO)
			}
			else
			{
				//El paquete esta bien, luego procedo a tratarlo.
				command=decode_command_type(frame,0);
				bits=xEventGroupGetBits(xEventGroup);
				switch(command)
				{
				case COMANDO_PING :

					if(bits & TrazaBit == TrazaBit){
						UARTprintf("Comando PING\n ");
					}

					//A un comando de ping se responde con el propio comando
					numdatos=create_frame(frame,command,0,0,MAX_FRAME_SIZE);
					if (numdatos>=0)
					{
						send_frame(frame,numdatos);
					}else{
						//Error de creacion de trama: determinar el error y abortar operacion
						errors++;
						logError(numdatos);

					}
					break;
				case COMANDO_START:         // Comando de ejemplo: eliminar en la aplicacion final
				{

					if(bits & TrazaBit == TrazaBit){
						UARTprintf("Comando START\n ");
					}


					if(sensorTaskHandle == NULL){

						inicializarVariables();

						if((xTaskCreate(ConsumoTask, (signed portCHAR *)"Consumo", LED1TASKSTACKSIZE,NULL,tskIDLE_PRIORITY + 1, &consumoTaskHandle)!= pdTRUE))
						{
							while(1);
						}

						if((xTaskCreate(SensorTask, (signed portCHAR *)"Sensor", LED1TASKSTACKSIZE,NULL,tskIDLE_PRIORITY + 1, &sensorTaskHandle) != pdTRUE))
						{
							while(1);
						}
						if((xTaskCreate(HighTask, (signed portCHAR *)"Altitud", LED1TASKSTACKSIZE,NULL,tskIDLE_PRIORITY + 1, &altitudTaskHandle) != pdTRUE))
						{
							while(1);
						}

						if((xTaskCreate(turbulenciasTask, (signed portCHAR *)"Turbulencias", LED1TASKSTACKSIZE,NULL,tskIDLE_PRIORITY + 1, &turbulenciasTaskHandle) != pdTRUE))
						{
							while(1);
						}
					}

				}
				break;
				case COMANDO_STOP:
				{
					if(bits & TrazaBit == TrazaBit){
						UARTprintf("Comando STOP\n ");
					}
					if(combustible>0){ //Eliminamos las tareas en el STOP
						vTaskDelete(sensorTaskHandle);
						vTaskDelete( consumoTaskHandle );
						vTaskDelete(altitudTaskHandle);
						vTaskDelete( turbulenciasTaskHandle );

					}

				}
				break;
				case COMANDO_SPEED:
				{

					if(bits & TrazaBit == TrazaBit){
						UARTprintf("Comando SPEED\n ");
					}
					float  velocidad;

					//Recibimos y enviamos por la cola la velocidad
					extract_packet_command_param(frame,sizeof(velocidad),&velocidad);
					xQueueSend( velocidadQueue,&velocidad,portMAX_DELAY);

				}
				break;
				case COMANDO_TIME:
				{

					if(bits & TrazaBit == TrazaBit){
						UARTprintf("Comando TIME\n ");
					}

					uint32_t hora;
					extract_packet_command_param(frame,sizeof(hora),&hora);
					//recibimos y actualizamos el valor de Hora
					setHora(hora);
					//Creamos la tarea Time
					if(xTaskCreate(TimeTask, (portCHAR *)"Time",LED1TASKSTACKSIZE, NULL, tskIDLE_PRIORITY + 1, NULL) != pdTRUE)
					{
						while(1);
					}

				}
				break;
				default:
				{
					PARAM_COMANDO_NO_IMPLEMENTADO parametro;
					parametro.command=command;
					//El comando esta bien pero no esta implementado
					numdatos=create_frame(frame,COMANDO_NO_IMPLEMENTADO,&parametro,sizeof(parametro),MAX_FRAME_SIZE);
					if (numdatos>=0)
					{
						send_frame(frame,numdatos);
					}
					break;
				}
				}
			}
		}else{ // if (numdatos >0)
			//Error de recepcion de trama(PROT_ERROR_RX_FRAME_TOO_LONG), ignorar el paquete
			errors++;

		}
	}
}