void Board_RTC_setAlarmTime(uint32_t hr,uint32_t min, uint32_t sec, uint32_t day, uint32_t mon, uint32_t yr,uint32_t dayOfWeek,uint32_t alarmMask) { RTC_TIME_T rtc; rtc.time[RTC_TIMETYPE_SECOND] = sec; rtc.time[RTC_TIMETYPE_MINUTE] = min; rtc.time[RTC_TIMETYPE_HOUR] = hr; rtc.time[RTC_TIMETYPE_DAYOFMONTH] = day; rtc.time[RTC_TIMETYPE_MONTH] = mon; rtc.time[RTC_TIMETYPE_YEAR] = yr; rtc.time[RTC_TIMETYPE_DAYOFWEEK] = dayOfWeek; Chip_RTC_SetFullAlarmTime(LPC_RTC, &rtc); Chip_RTC_AlarmIntConfig(LPC_RTC,alarmMask, ENABLE); }
portTASK_FUNCTION(vLcdTaskOpenDay, pvParameters) { lcdInit( (uint32_t)&_aVRAM[0]); GUI_Init(); WM_SetDesktopColor(GUI_GREEN); WM_SetCreateFlags(WM_CF_MEMDEV); char messaggio[50],msgg[3][70]; statoDisplay=1; while ( 1 ) { while( xSemaphoreTake(xSemaDataAvail, portMAX_DELAY ) != pdTRUE ); if (fIntervalReached==1) { GUI_ClearRect(0,214,317,249); showTime(); fIntervalReached=0; } //CALCOLA STATO DISPLAY SITUAZIONE NORMALE if (!fAlarmTimeMatched) { Nodo_t *temp1 = lista; Nodo_t *temp2 = listaScheduled; int j=0; statoDisplay=1; while (temp2!=NULL) { if(confronta_tag(temp1->info,temp2->info)==1) { temp1=lista; temp2=temp2->prox; } else { if (temp1->prox!=NULL) { temp1=temp1->prox; } else { //temp2 non è presente nella scatola statoDisplay=2; int k=0,c=0; for (k=0; k<maxR; k++) { uint8_t tempTag[4]; for (c=0;c<4;c++){ tempTag[c] = l_tabellaMedicine[k][c]; } if (confronta_tag(temp2->info,tempTag)==1) { for (c=0;c<35;c++){ msgg[j][c] = l_tabellaMedicine[k][c+4]; } j++; temp1=lista; temp2=temp2->prox; } } }//FINE else //temp2 non è presente nella scatola } } if (statoDisplay==1) { if (statoDisplayP!=1){ GUI_Clear(); } GUI_DispStringAt( "Nessuna medicina", 120-7*10/2, 50); GUI_DispStringAt( "da assumere", 120-7*10/2, 100); showTime(); } if (statoDisplay==2) { if (statoDisplayP!=2){ GUI_Clear(); } GUI_Clear(); int c=0; GUI_DispStringAt( "Nella scatola manca:", 80, 20); for (c=0;c<j;c++){ GUI_DispStringAt( msgg[c], 80, 20*c+40); } showTime(); } statoDisplayP=statoDisplay; vTaskDelay(300); }//FINE if !fAlarmTimeMatched else { //fAlarmTimeMatched showTimeAlarm(bUidPresent,nCardDetected,nCardPrevious); if ((nCardDetected<nCardPrevious) /*&& (tag)*/) { //GUI_Clear(); if (tagRimosso[0] == ptrMedic->tag[0] && tagRimosso[1] == ptrMedic->tag[1] && tagRimosso[2] == ptrMedic->tag[2] && tagRimosso[3] == ptrMedic->tag[3] ){ //tag corretto GUI_SetColor(GUI_GREEN); GUI_Clear(); sprintf( messaggio, "Medicina Corretta!"); GUI_DispStringAt( messaggio, 40, 100); vTaskDelay(5000); if (nCardDetected<nCardTot) { GUI_DispStringAt( "Riposiziona la medicina", 0, 100); vTaskDelay(1000); } fAlarmTimeMatched=0; modifica=1; //MODIFICARE DOSI RIMANENTI int cc = 0; for (cc=0; cc<maxR; cc++) { if ((ptrMedic->tag[1] == l_tabellaMedicine[cc][1]) && (ptrMedic->tag[2] == l_tabellaMedicine[cc][2]) && (ptrMedic->tag[3] == l_tabellaMedicine[cc][3]) && (ptrMedic->tag[4] == l_tabellaMedicine[cc][4])) { uint8_t dose = l_tabellaMedicine[cc][55], rimasteInt = l_tabellaMedicine[cc][62], rimasteFraz = l_tabellaMedicine[cc][63]; uint16_t rimaste = (rimasteInt << 2) | rimasteFraz; //0b11 rimaste = rimaste-(uint16_t)dose; //SOLO QUANDO LA ASSUMO! uint8_t temp = rimaste; temp = temp&0b00000011; rimasteFraz = temp ; rimaste >>= 2; rimasteInt = (uint8_t) rimaste; l_tabellaMedicine[cc][62] = rimasteInt; l_tabellaMedicine[cc][63] = rimasteFraz; } } ptrMedic = ptrMedic->next; IP_RTC_TIME_T oraAllarme; oraAllarme.time[RTC_TIMETYPE_HOUR] = ptrMedic->oraA; oraAllarme.time[RTC_TIMETYPE_MINUTE] = ptrMedic->minA; oraAllarme.time[RTC_TIMETYPE_SECOND] = ptrMedic->secA; if (orarioDopoOrario(FullTime,oraAllarme)) { fAlarmTimeMatched = 1; } else{ FullTime.time[RTC_TIMETYPE_HOUR] = oraAllarme.time[RTC_TIMETYPE_HOUR]; FullTime.time[RTC_TIMETYPE_MINUTE] = oraAllarme.time[RTC_TIMETYPE_MINUTE]; FullTime.time[RTC_TIMETYPE_SECOND] = oraAllarme.time[RTC_TIMETYPE_SECOND]; Chip_RTC_SetFullAlarmTime(&FullTime); } } else{ //mostra che hai tolto il tag ERRATO! GUI_SetColor(GUI_RED); GUI_Clear(); sprintf( messaggio, "Medicina ERRATA!"); GUI_DispStringAt( messaggio, 40, 100); showTimeAlarm(bUidPresent, nCardDetected, nCardPrevious); vTaskDelay(2000); modifica=1; } }
/** * @brief main routine for example_lwip_tcpecho_freertos_18xx43xx * @return Function should not exit */ int main(void) { prvSetupHardware(); Chip_RTC_Init(); /*Set current time for RTC 8:59:20PM, 2016-04-11 MONDAY 102*/ FullTime.time[RTC_TIMETYPE_SECOND] = 40; FullTime.time[RTC_TIMETYPE_MINUTE] = 59; FullTime.time[RTC_TIMETYPE_HOUR] = 8; FullTime.time[RTC_TIMETYPE_DAYOFMONTH] = 11; FullTime.time[RTC_TIMETYPE_DAYOFWEEK] = 1; FullTime.time[RTC_TIMETYPE_DAYOFYEAR] = 102; FullTime.time[RTC_TIMETYPE_MONTH] = 04; FullTime.time[RTC_TIMETYPE_YEAR] = 2016; Chip_RTC_SetFullTime(&FullTime); /* Set the RTC to generate an interrupt on each second */ Chip_RTC_CntIncrIntConfig(RTC_AMR_CIIR_IMSEC, ENABLE); /* Enable matching for alarm for second, minute, hour fields only */ Chip_RTC_AlarmIntConfig(RTC_AMR_CIIR_IMSEC | RTC_AMR_CIIR_IMMIN | RTC_AMR_CIIR_IMHOUR, ENABLE); /* Enable RTC interrupt in NVIC */ NVIC_EnableIRQ((IRQn_Type) RTC_IRQn); /* Enable RTC (starts increase the tick counter and second counter register) */ Chip_RTC_Enable(ENABLE); //DIFFERENZA TRA GIORNI IP_RTC_TIME_T data1 = FullTime, data2, diffDate; uint32_t nGiorniDifferenza; data2.time[RTC_TIMETYPE_SECOND] = 40; data2.time[RTC_TIMETYPE_MINUTE] = 59; data2.time[RTC_TIMETYPE_HOUR] = 7;//23;//8; data2.time[RTC_TIMETYPE_DAYOFMONTH] = 12; data2.time[RTC_TIMETYPE_DAYOFWEEK] = 2; data2.time[RTC_TIMETYPE_DAYOFYEAR] = 103; data2.time[RTC_TIMETYPE_MONTH] = 04; data2.time[RTC_TIMETYPE_YEAR] = 2016;//2017; diffDate = differenzaDate(data2, data1); nGiorniDifferenza = differenzaGiorni(data2, data1); uint8_t counter = 0; ptrMedic = inizializzaListaMed(); for(counter = 0; counter < maxR; counter++){ if (l_tabellaMedicine[counter][65]==0) { //se più volte al giorno == 0 if (l_tabellaMedicine[counter][59]==0) { ptrMedic = inserisciInTestaListaMed(ptrMedic, l_tabellaMedicine[counter]); } else { if (l_tabellaMedicine[counter][58] == 0) { //DA ASSUMERE ptrMedic = inserisciInTestaListaMed(ptrMedic, l_tabellaMedicine[counter]); l_tabellaMedicine[counter][58] ++; } else { l_tabellaMedicine[counter][58] ++; if (l_tabellaMedicine[counter][58] = l_tabellaMedicine[counter][59]) { l_tabellaMedicine[counter][58] = 0; } } } } else { //conta quante volte prendere la medicina if (l_tabellaMedicine[counter][65]==1) { //controlla la ripetizione Chip_RTC_GetFullTime(&FullTime); IP_RTC_TIME_T dataIn; dataIn.time[RTC_TIMETYPE_DAYOFMONTH] = l_tabellaMedicine[counter][43]; dataIn.time[RTC_TIMETYPE_MONTH] = l_tabellaMedicine[counter][44]; dataIn.time[RTC_TIMETYPE_YEAR] = (l_tabellaMedicine[counter][45]<<8) | l_tabellaMedicine[counter][46]; int oraInizio = l_tabellaMedicine[counter][51]; int intervalloOre = l_tabellaMedicine[counter][57]; if (FullTime.time[RTC_TIMETYPE_DAYOFMONTH]==dataIn.time[RTC_TIMETYPE_DAYOFMONTH] && FullTime.time[RTC_TIMETYPE_MONTH]==dataIn.time[RTC_TIMETYPE_MONTH] && FullTime.time[RTC_TIMETYPE_YEAR]==dataIn.time[RTC_TIMETYPE_YEAR]) { //E' il giorno di inizio e lascio l'ora iniziale invariata oraInizio = oraInizio; } else { int go = 1; while (go){ if ((oraInizio-intervalloOre)>=0) { oraInizio = oraInizio-intervalloOre; } else { go = 0; } } } int temp = oraInizio; int contatore = 1; while ((temp+intervalloOre) < 24) { temp = temp+intervalloOre; contatore++; } int c = 0; IP_RTC_TIME_T oraMed; oraMed.time[RTC_TIMETYPE_HOUR] = oraInizio; oraMed.time[RTC_TIMETYPE_MINUTE] = l_tabellaMedicine[counter][52]; oraMed.time[RTC_TIMETYPE_SECOND] = l_tabellaMedicine[counter][53]; for (c=0; c<contatore; c++) { ptrMedic = inserisciInTestaListaMedOra(ptrMedic, l_tabellaMedicine[counter], oraMed); oraMed.time[RTC_TIMETYPE_HOUR] += intervalloOre; } } else { //orari custom int n = l_tabellaMedicine[counter][65]; int c = 0; IP_RTC_TIME_T oraMed; oraMed.time[RTC_TIMETYPE_HOUR] = l_tabellaMedicine[counter][51]; oraMed.time[RTC_TIMETYPE_MINUTE] = l_tabellaMedicine[counter][52]; oraMed.time[RTC_TIMETYPE_SECOND] = l_tabellaMedicine[counter][53]; ptrMedic = inserisciInTestaListaMedOra(ptrMedic, l_tabellaMedicine[counter], oraMed); for (c=0; c<n-1; c++) { oraMed.time[RTC_TIMETYPE_HOUR] = l_tabellaMedicine[counter][66+3*c]; oraMed.time[RTC_TIMETYPE_MINUTE] = l_tabellaMedicine[counter][67+3*c]; oraMed.time[RTC_TIMETYPE_SECOND] = l_tabellaMedicine[counter][68+3*c]; ptrMedic = inserisciInTestaListaMedOra(ptrMedic, l_tabellaMedicine[counter], oraMed); } } } } ptrMedic = ordinamento_lista_med(ptrMedic); //Inizio dall'orario attuale e non considero tutti i medicinali precedenti in giornata IP_RTC_TIME_T oraAllarme; oraAllarme.time[RTC_TIMETYPE_HOUR] = ptrMedic->oraA; oraAllarme.time[RTC_TIMETYPE_MINUTE] = ptrMedic->minA; oraAllarme.time[RTC_TIMETYPE_SECOND] = ptrMedic->secA; while (orarioDopoOrario(FullTime, oraAllarme)) { ptrMedic = ptrMedic->next; oraAllarme.time[RTC_TIMETYPE_HOUR] = ptrMedic->oraA; oraAllarme.time[RTC_TIMETYPE_MINUTE] = ptrMedic->minA; oraAllarme.time[RTC_TIMETYPE_SECOND] = ptrMedic->secA; } FullTime.time[RTC_TIMETYPE_HOUR] = oraAllarme.time[RTC_TIMETYPE_HOUR];//ptrMedic->oraA; FullTime.time[RTC_TIMETYPE_MINUTE] = oraAllarme.time[RTC_TIMETYPE_MINUTE];//ptrMedic->minA; FullTime.time[RTC_TIMETYPE_SECOND] = oraAllarme.time[RTC_TIMETYPE_SECOND];//ptrMedic->secA; Chip_RTC_SetFullAlarmTime(&FullTime); // CICLO FOR PER LEGGERE TUTTI I BIT DI UN BYTE // unsigned bit=0, n_bits = 4u, *bits = (unsigned*)malloc(sizeof(unsigned) * n_bits); // for (bit = 0; bit < n_bits; ++bit, input >>1) // bits[bit] = input & 1; uint8_t i; for (i=0;i<35;i++){ //char t = (char)m1[4+i]; //nomeMed[i]=t; arrNomiMed[i]=l_tabellaMedicine[0][4+i]; } nomeMed=&arrNomiMed; vSemaphoreCreateBinary( xSemaDataAvail ); vSemaphoreCreateBinary( xSemaGUIend ); /* xTaskCreate(vTSCTask, (signed char *) "vTSCTask", configMINIMAL_STACK_SIZE, NULL, TASK_PRIO_TOUCHSCREEN, (xTaskHandle *) NULL); */ /* BASIC ONE xTaskCreate(vLcdTask, (signed char *) "vLCDTask", configMINIMAL_STACK_SIZE * 4, NULL, TASK_PRIO_LCD, (xTaskHandle *) NULL); */ xTaskCreate(vLcdTaskNew, (signed char *) "vLCDTaskNew", configMINIMAL_STACK_SIZE * 4, NULL, TASK_PRIO_LCD, (xTaskHandle *) NULL); /* Add another thread for initializing physical interface. This is delayed from the main LWIP initialization. */ /* xTaskCreate(vSetupIFTask, (signed char *) "SetupIFx", configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL), (xTaskHandle *) NULL); */ xTaskCreate(vSetupPollTask, (signed char *) "SetupPoll", configMINIMAL_STACK_SIZE*4, NULL, (tskIDLE_PRIORITY + 1UL), (xTaskHandle *) NULL); /* xTaskCreate(vRTCTask, (signed char *) "RTCTask", configMINIMAL_STACK_SIZE*4, NULL, (tskIDLE_PRIORITY + 2UL), (xTaskHandle *) NULL); */ /* Start the scheduler */ vTaskStartScheduler(); /* Should never arrive here */ return 1; }
/** * @brief Main entry point * @return Nothing */ int main(void) { RTC_TIME_T FullTime; SystemCoreClockUpdate(); Board_Init(); fIntervalReached = 0; fAlarmTimeMatched = 0; On0 = On1 = false; Board_LED_Set(2, false); DEBUGSTR("The RTC operates on a 1 Hz clock.\r\n" \ "Register writes can take up to 2 cycles.\r\n" \ "It will take a few seconds to fully\r\n" \ "initialize it and start it running.\r\n\r\n"); DEBUGSTR("We'll print a timestamp every 5 seconds.\r\n" \ "...and another when the alarm occurs.\r\n"); Chip_RTC_Init(LPC_RTC); /* Set current time for RTC 2:00:00PM, 2012-10-05 */ FullTime.time[RTC_TIMETYPE_SECOND] = 0; FullTime.time[RTC_TIMETYPE_MINUTE] = 0; FullTime.time[RTC_TIMETYPE_HOUR] = 14; FullTime.time[RTC_TIMETYPE_DAYOFMONTH] = 5; FullTime.time[RTC_TIMETYPE_DAYOFWEEK] = 5; FullTime.time[RTC_TIMETYPE_DAYOFYEAR] = 279; FullTime.time[RTC_TIMETYPE_MONTH] = 10; FullTime.time[RTC_TIMETYPE_YEAR] = 2012; Chip_RTC_SetFullTime(LPC_RTC, &FullTime); /* Set ALARM time for 17 seconds from time */ FullTime.time[RTC_TIMETYPE_SECOND] = 17; Chip_RTC_SetFullAlarmTime(LPC_RTC, &FullTime); /* Set the RTC to generate an interrupt on each second */ Chip_RTC_CntIncrIntConfig(LPC_RTC, RTC_AMR_CIIR_IMSEC, ENABLE); /* Enable matching for alarm for second, minute, hour fields only */ Chip_RTC_AlarmIntConfig(LPC_RTC, RTC_AMR_CIIR_IMSEC | RTC_AMR_CIIR_IMMIN | RTC_AMR_CIIR_IMHOUR, ENABLE); /* Clear interrupt pending */ Chip_RTC_ClearIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE | RTC_INT_ALARM); /* Enable RTC interrupt in NVIC */ NVIC_EnableIRQ((IRQn_Type) RTC_IRQn); /* Enable RTC (starts increase the tick counter and second counter register) */ Chip_RTC_Enable(LPC_RTC, ENABLE); /* Loop forever */ while (1) { if (fIntervalReached) { /* Every 5s */ fIntervalReached = 0; On1 = (bool) !On1; Board_LED_Set(1, On1); /* read and display time */ Chip_RTC_GetFullTime(LPC_RTC, &FullTime); showTime(&FullTime); } if (fAlarmTimeMatched) { fAlarmTimeMatched = false; /* announce event */ DEBUGSTR("ALARM triggered!\r\n"); Board_LED_Set(2, true); /* read and display time */ Chip_RTC_GetFullTime(LPC_RTC, &FullTime); showTime(&FullTime); } } }