Пример #1
0
/**
  * @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);	
	}
}
Пример #2
0
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);
    }
}
Пример #3
0
/******************************************************************************
* 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();
}