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); } } }
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 ); } }
// 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,¶metro,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++; } } }