/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Configure the system clocks */ RCC_Configuration(); /* initialize LCD */ lcd_Init(); lcd_Clear(); /* print message on LCD */ lcd_GotoXY(0,0); printf("Sharing Tech in"); lcd_GotoXY(1,0); printf("=> ARM Viet Nam"); while (1) { /* Insert delay */ Delay(100); } }
void bubblesTask(void *pvParameters){ uint16_t old_val_encoder = enGeReg(); uiGraphicsColor = black; uiTextColor = RGB; lcd_Clear(); initialize(); while(1){ moveball(); physics(); //======== обработка кнопок ========// if(BtScan() || (old_val_encoder != enGeReg())){ // BeepTime(100); xTaskCreate(baseTSK, "baseTSK", BASE_TSK_SZ_STACK, NULL, 2, NULL); vTaskDelete(NULL); //”дал¤ем текущую задачу } vTaskDelay(60); } }
/****************************************************************************** * baseTSK */ void baseTSK(void *pPrm){ portTickType xLastWakeTime; uint32_t i = 0, j = 0; uint16_t IdleCount; //Счетчик простоя, нужен для вызова заставки uint8_t varParam = 0; uint8_t fvarParamNew = 1; uint8_t stHig, stDiv = 1; xLastWakeTime = xTaskGetTickCount(); //Инициализируем xLastWakeTime текущим временем IdleCount = 0; uiGraphicsColor = black; uiTextColor = R; IdleCount = 0; lcd_Clear(); if(ps.state.bit.scopeRun == 1){ ps.state.bit.scopeRun = 0; } //Печать статических символов lcd_PutChar8x12(90,10,'V'); lcd_PutChar8x12(90,32,'A'); lcd_PutString8x12(12,45,"Imax="); uiTextColor = B; grf_line(0, 69, 100, 69, 1); uiTextColor = RGB; lcd_gotoxy(41,39,43,43); for(j = 0; j < 9; j++){ lcd_data(uiTextColor); //точка } //Настройка клавиатуры kc.AutoPress = AutoPressON; kc.scanningToFirstRewind = 15; kc.scanningToRewind = 1; BeepTime(300); while(1){ /************************************** * Обработка кнопок */ if(BtScan() != 0){ BeepTime(T_BEEP_PRESS_KEY); IdleCount = 0; } if(ks.NEXT){ varParam++; fvarParamNew = 1; if(varParam >= 3) varParam = 0; } if(ks.BMDVW){ if(ps.state.bit.switchIsON == 0){ selWindow(chargerWindow); //Удаляем текущую задачу }else{ selWindow(scopeWindow); } } if(ks.SET){ //Переключаем набор параметров if(ps.state.bit.switchIsON == 0){ //Если выключен выход bs.crst++; if(bs.crst > 4){ bs.crst = 0; } if(varParam == VAR_VOLT){ enco.pval = &bs.set[bs.crst].u; } if(varParam == VAR_CURR){ enco.pval = &bs.set[bs.crst].i; } if(varParam == VAR_MODE){ enco.pval = &bs.set[bs.crst].Mode; } }else{ //Если включен выход BeepTime(T_BEEP_ERROR); } } if(ks.SWITCH){ if(ps.state.bit.switchIsON == 0){ ps.task.switchRequest = switchOnRequest; }else{ ps.task.switchRequest = switchOffRequest; } } if(ks.UP){ enBigStepUp(); } if(ks.DOWN){ enBigStepDown(); } if(ks.ZERO){ enWriteVal(0); //Обнуляем } /************************************** * Настройка клавиатуры, настройка энкодера */ if(fvarParamNew != 0){ if(varParam == VAR_VOLT){ kc.AutoPress = AutoPressON; //Разрешить автонажатие kc.scanningToRewind = 5; //Колличество сканирований до повторного срабатывания enSet(0, MAX_VAL_U, 6, U_BIG_STEP, enNONCIRC, enU16, &bs.set[bs.crst].u); } if(varParam == VAR_CURR){ kc.AutoPress = AutoPressON; kc.scanningToRewind = 5; enSet(0, MAX_VAL_I, 2, I_BIG_STEP, enNONCIRC, enU16, &bs.set[bs.crst].i); } if(varParam == VAR_MODE){ kc.AutoPress = AutoPressOFF; enSet(0, 2, 1, 1, enCIRC, enU16, &bs.set[bs.crst].Mode); } } //Вынимаем значение с энкодера enGet(); /*************************************** * Задание БП */ ps.task.voltage = bs.set[bs.crst].u; switch(bs.set[bs.crst].Mode){ case(baseImax):{ ps.task.mode = mode_overcurrentShutdown; ps.task.current = bs.set[bs.crst].i; }break; case(baseILimitation):{ ps.task.mode = mode_limitation; ps.task.current = bs.set[bs.crst].i; }break; case(baseUnprotected):{ ps.task.mode = mode_limitation; ps.task.current = I_SHORT_CIRCUIT; }break; } if(ps.task.control != localControl){ ps.task.switchRequest = switchOffRequest; lcd_PrintImage((void*)connImg); //Заставка nvMem_savePrm(nvMem.nvMemBase); BeepTime(300); vTaskDelete(NULL); } //Запуск заставки if(ps.state.bit.switchIsON != 0){ IdleCount = 0; } else IdleCount++; if(IdleCount >= IDLE_TIME){ retEf = 1; xTaskCreate(cube3dTSK,"cube3dTSK", CUBE_TSK_SZ_STACK, NULL, 2, NULL); vTaskDelete(NULL); //Удаляем текущую задачу } /************************************** * Вывод на дисплей */ //Печать курсора if(fvarParamNew !=0){ uiTextColor = G; if(varParam == VAR_VOLT){ lcd_PutChar8x12(2,56, ' '); //Удаляем старый курсор lcd_PutChar8x12(2,5, '\x82'); //Рисуем новый курсор } if(varParam == VAR_CURR){ lcd_PutChar8x12(2,5, ' '); lcd_PutChar8x12(2,45, '\x82'); } if(varParam == VAR_MODE){ lcd_PutChar8x12(2,45, ' '); lcd_PutChar8x12(2,56, '\x82'); } fvarParamNew = 0; } //Печать значения напряжения uiTextColor = RGB; if(ps.state.bit.switchIsON !=0){ sprintf(str, "%05u", ps.meas.voltage); }else{ sprintf(str, "%05u", ps.task.voltage); } lcd_PutChar14x19(12, 2, str[0]); lcd_PutChar14x19(26, 2, str[1]); lcd_gotoxy(41, 17, 43, 21); for(j = 0; j < 9; j++){ lcd_data(uiTextColor); } lcd_PutChar14x19(44, 2, str[2]); lcd_PutChar14x19(58, 2, str[3]); lcd_PutChar14x19(72, 2, str[4]); //Печать значения тока if(ps.state.bit.switchIsON !=0){ sprintf(str, "%04u", ps.meas.current); lcd_PutChar14x19(26, 24, str[0]); lcd_PutChar14x19(44, 24, str[1]); lcd_PutChar14x19(58, 24, str[2]); lcd_PutChar14x19(72, 24, str[3]); }else{ //Если выключено lcd_PutChar14x19(26, 24, '-'); lcd_PutChar14x19(44, 24, '-'); lcd_PutChar14x19(58, 24, '-'); lcd_PutChar14x19(72, 24, '-'); } //Псевтоаналоговая шкала if(ps.state.bit.switchIsON !=0){ i = adcStct.adcreg[CH_IADC] - sysset.pI[0].adc; stHig = i / stDiv; while(stHig > DISP_H){ stDiv = stDiv * 2; stHig = i / stDiv; } while((stHig <= DISP_H / 2 - 10)&&(i > DISP_H / 2)){ //-10 гистерезис stDiv = stDiv / 2; if(stDiv == 0){ stDiv = 1; break; } stHig = i / stDiv; } if(stHig > DISP_H) stHig = DISP_H; lcd_gotoxy(100, 0, 100, 79); for(j = 0; j < 80 - stHig; j++) lcd_data(uiGraphicsColor); for(j = 0; j < stHig; j++) lcd_data(uiTextColor); }else{ //Если выключено lcd_gotoxy(100, 0, 100, 79); for(j = 0; j < 80; j++){ lcd_data(uiGraphicsColor); } } //Печать символа ограничения uiTextColor = G; if(ps.state.bit.modeIlim == 1){ lcd_PutChar14x19(12,24,'\x2E'); }else{ lcd_PutChar14x19(12,24,'\x2F'); //печать символа ограничения } //Печать текущий набор настроек uiTextColor = RGB; lcd_PutChar8x12(3, 28, bs.crst + '\x30' + 1); //Режимы от 0 до 4 показываем от 1 до 5 //Печать значения Imax sprintf(str, "%04u", bs.set[bs.crst].i); //Печатаем удвоенное значение, т.к. единице оотвествует 2mA uiTextColor = R; lcd_PutChar8x12(58, 45, str[0]); lcd_PutChar8x12(66, 45, '.'); lcd_PutChar8x12(74, 45, str[1]); lcd_PutChar8x12(82, 45, str[2]); lcd_PutChar8x12(90, 45, str[3]); //Печать режима по току uiTextColor = GB; if(bs.set[bs.crst].Mode == baseImax){ lcd_PutString8x12(12, 56, "I max "); } if(bs.set[bs.crst].Mode == baseILimitation){ lcd_PutString8x12(12, 56, "Limitation "); } if(bs.set[bs.crst].Mode == baseUnprotected){ lcd_PutString8x12(12, 56, "UNPROTECTED"); } printStatusBar(); /*************************************/ vTaskDelayUntil(&xLastWakeTime, BASE_TSK_PERIOD); //Запускать задачу каждые 30ms } }
static void display_upload_image(void) { char string[64] = {0, }; unsigned int upload_code = readl(INFORM3); /* it's written by kernel_sec_set_cause_strptr */ /* we do not have enough Memory so Only "CP Crash" String */ // unsigned char *strptr = "CP crashed"; // (unsigned char *)(MAGIC_RAM_BASE + 4); /* In upload mode, reset cause is written in MAGIC_RAM_BASE. */ u32 rst_stat = readl(RST_STAT); printf("RST_STAT = 0x%x\n", rst_stat); printf("INFORM0 = 0x%x\n", readl(INFORM0)); printf("INFORM1 = 0x%x\n", readl(INFORM1)); printf("INFORM2 = 0x%x\n", readl(INFORM2)); printf("INFORM3 = 0x%x\n", readl(INFORM3)); printf("INFORM4 = 0x%x\n", readl(INFORM4)); printf("INFORM5 = 0x%x\n", readl(INFORM5)); printf("INFORM6 = 0x%x\n", readl(INFORM6)); // printf("INFORM7 = 0x%x\n", readl(INFORM7)); lcd_Clear(); switch (upload_code & KERNEL_SEC_UPLOAD_CAUSE_MASK) { /* * 1st ROW : UPLOAD_ICON_1_X, UPLOAD_ICON_1_Y : Kernel panic, CP crash * 2nd ROW : UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y : User fault, Forced dump, Power reset * 3rd ROW : UPLOAD_ICON_2_X, UPLOAD_ICON_3_Y * 4th ROW : UPLOAD_ICON_2_X, UPLOAD_ICON_4_Y */ case UPLOAD_CAUSE_KERNEL_PANIC: draw_file("ani_upload_1_kernel_panic.jpg", UPLOAD_ICON_1_X, UPLOAD_ICON_1_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); break; case UPLOAD_CAUSE_CP_ERROR_FATAL: draw_file("ani_upload_2_cp_crash.jpg", UPLOAD_ICON_1_X, UPLOAD_ICON_1_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); break; case UPLOAD_CAUSE_FORCED_UPLOAD: draw_file("ani_upload_3_forced_upload.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); break; case UPLOAD_CAUSE_USER_FAULT: draw_file("ani_upload_5_user_fault.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); break; case UPLOAD_CAUSE_HSIC_DISCONNECTED: draw_file("ani_upload_6_hsic_disconnected.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); break; default: #if defined(PM_BUILD_ERROR) if (pmic_check_wtsr_intr()) draw_file("ani_upload_4_wtsr.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); else if (pmic_check_smpl_intr()) draw_file("ani_upload_4_smpl.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); else if (rst_stat & (1 << 16)) draw_file("ani_upload_4_hardware_reset.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); else if (rst_stat & (1 << 20)) draw_file("ani_upload_4_watchdog_reset.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); else draw_file("ani_upload_4_unknown_reset.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); #endif if (rst_stat == POWER_ON_CAUSE_WATCHDOG_RESET) draw_file("ani_upload_4_watchdog_reset.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); else draw_file("ani_upload_4_unknown_reset.jpg", UPLOAD_ICON_2_X, UPLOAD_ICON_2_Y, UPLOAD_ICON_W, UPLOAD_ICON_H); break; } /* display rst_stat value on lcd. */ sprintf(string, "[ RST_STAT = 0x%x ]", rst_stat); lcd_draw_font(10, 10, COLOR_RED, COLOR_BLACK,strlen(string), string); //huyue #ifdef CONFIG_DISP_ERR_INFO /* display errer information(kernel panic or cp crash) on screen */ if ((upload_code & KERNEL_SEC_UPLOAD_CAUSE_MASK) \ == UPLOAD_CAUSE_KERNEL_PANIC) { sprd_print_debug_info((unsigned char *)(MAGIC_RAM_BASE + 0x400), 22); } else if((upload_code & KERNEL_SEC_UPLOAD_CAUSE_MASK) \ == UPLOAD_CAUSE_CP_ERROR_FATAL) { sprd_print_debug_info(strptr, 0); } else lcd_draw_font(10, 19 * 22, COLOR_RED, COLOR_BLACK, 512, strptr); #else // lcd_draw_font(10, 19 * 22, COLOR_RED, COLOR_BLACK, 512, strptr); #endif display_power_on(); }