예제 #1
0
파일: main.c 프로젝트: Mambix/MX12005
main()
{
	ADCON0 = 0b00001000; // Channel AN2
	ADCON1 = 0b10110011; // Right jutified; fRC clock
#if refVOLTAGE == 4
	FVRCON = 0b10000011; // Fixed voltage set to 4.096
#elif refVOLTAGE == 2
	FVRCON = 0b10000010; // Fixed voltage set to 2.048
#elif refVOLTAGE == 1
	FVRCON = 0b10000001; // Fixed voltage set to 1.024
#else
	FVRCON = 0b00000000; // Fixed voltage OFF; set to supply voltage
#endif
	ADON = 1;
	ANSELA = ANSELB = ANSELC = 0;

	// Internal 32MHz XTAL
	OSCCON = 0b11110000;

	//WDT setup
	WDTCON = 0;

	TRISA = ANSELA = 0b00000100; //RA2 analog input
	PORTA = 0;

	trisKEY1 = 1;
	KEY1 = 0;
	trisKEY2 = 1;
	KEY2 = 0;
	pullKEY1 = 1;
	pullKEY2 = 1;	

	muxLED = 0;
	refreshLED = 0;

	ShowMode = eeprom_read(0x00);

	initDisplay();
	divMesure = 0;
	ShowModeCountdown = 0;

	for (avgPos = 0; avgPos<8; avgPos++)
		avgMesure[avgPos].Val = 0;
	avgPos = 0;

	// capacitive sensing
	CPSON = 0;
	T0XCS = 0;

	// initialize timer 0;
	TMR0=0;
	OPTION_REG = 0b00111000;	// no prescale	
	TMR0IE = 1;
	//TMR0CS = 0;
	
	// intialize timer 1
	T1CON = 0b01000000; // enable timer interrupt  F/1
	
	// 16 bit
	TMR1 = 0;
	TMR1ON=1;
   	TMR1IF=0;
   	TMR1IE=1;
	PEIE=1;

/* PIN INTERUPTS */
	INTF = 0;
	INTE = 0;
	IOCIF = 0;
	IOCIE = 0;
	IOCAP = 0b00000000;
	IOCAN = 0b00000000;
/**/
	__delay_ms(500);

	GIE = 1;			// enable global interrupts

	while(1)
	{
		CLRWDT();
		
		if ( refreshLED == 1 )
		{
			refreshLED = 0;

			if (refreshMesurement == 1)
			{
				refreshMesurement = 0xffffffff;

				GIE = 0;
				
				// Start ADC conversion
				ADON = 1;
				ADGO = 1;
				while ((ADGO==1) && (refreshMesurement>4) ) 
				{
					refreshMesurement--;
				}
				ADGO = 0;
				ADON = 0;
				
				// Conversion done
				// Get results
				mesurement.Val = 0;
				mesurement.byte.HB = ADRESH;
				mesurement.byte.LB = ADRESL;
				
				GIE=1;
				refreshMesurement = 0;
			}

			refreshSegment();

			if (blink==1)
				muxLED = (++muxLED % 0x80);
			else
				muxLED = (++muxLED % 4);
		}
/**/
		if (KEY1 == 0)
		{
			__delay_ms(50);
			if (KEY1 == 0)
			{
				while (KEY1 == 0) {}
				ShowMode++;
				ShowMode &= 0x77;
				ShowModeCountdown = ShowModeDelay;
				eeprom_write(0x00, ShowMode);
			}
		}
		
		if (KEY2 == 0)
		{
			__delay_ms(50);
			if (KEY2 == 0)
			{
				while (KEY2 == 0) {}
				ShowMode += 0x10;
				ShowMode &= 0x77;
				ShowModeCountdown = ShowModeDelay;
				eeprom_write(0x00, ShowMode);
			}
		}
/**/
		
	}
}
예제 #2
0
void
ListEditView::paintEvent(QPaintEvent* e)
{
//    QMainWindow::paintEvent(e); return;//&&& //!!! for experimental purposes

    // It is possible for this function to be called re-entrantly,
    // because a re-layout procedure may deliberately ask the event
    // loop to process some more events so as to keep the GUI looking
    // responsive.  If that happens, we remember the events that came
    // in in the middle of one paintEvent call and process their union
    // again at the end of the call.
    /*
        if (m_inPaintEvent) {
    	NOTATION_DEBUG << "ListEditView::paintEvent: in paint event already" << endl;
    	if (e) {
    	    if (m_havePendingPaintEvent) {
    		if (m_pendingPaintEvent) {
    		    QRect r = m_pendingPaintEvent->rect().unite(e->rect());
    		    *m_pendingPaintEvent = QPaintEvent(r);
    		} else {
    		    m_pendingPaintEvent = new QPaintEvent(*e);
    		}
    	    } else {
    		m_pendingPaintEvent = new QPaintEvent(*e);
    	    }
    	}
    	m_havePendingPaintEvent = true;
    	return;
        }
    */ 
    //!!!    m_inPaintEvent = true;

    RG_DEBUG << "ListEditView::paintEvent" << endl;

    if (isCompositionModified()) {

        // Check if one of the segments we display has been removed
        // from the composition.
        //
        // For the moment we'll have to close the view if any of the
        // segments we handle has been deleted.

        for (unsigned int i = 0; i < m_segments.size(); ++i) {

            if (!m_segments[i]->getComposition()) {
                // oops, I think we've been deleted
                close();
                return ;
            }
        }
    }


    m_needUpdate = false;

    // Scan all segments and check if they've been modified.
    //
    // If we have more than one segment modified, we need to update
    // them all at once with the same time range, otherwise we can run
    // into problems when the layout of one depends on the others.  So
    // we use updateStart/End to calculate a bounding range for all
    // modifications.

    timeT updateStart = 0, updateEnd = 0;
    int segmentsToUpdate = 0;
    Segment *singleSegment = 0;

    for (unsigned int i = 0; i < m_segments.size(); ++i) {

        Segment* segment = m_segments[i];
        unsigned int refreshStatusId = m_segmentsRefreshStatusIds[i];
        SegmentRefreshStatus &refreshStatus =
            segment->getRefreshStatus(refreshStatusId);

        if (refreshStatus.needsRefresh() && isCompositionModified()) {

            // if composition is also modified, relayout everything
            refreshSegment(0);
            segmentsToUpdate = 0;
            break;

        } else if (m_timeSigNotifier->hasTimeSigChanged()) {

            // not exactly optimal!
            refreshSegment(0);
            segmentsToUpdate = 0;
            m_timeSigNotifier->reset();
            break;

        } else if (refreshStatus.needsRefresh()) {

            timeT startTime = refreshStatus.from(),
                              endTime = refreshStatus.to();

            if (segmentsToUpdate == 0 || startTime < updateStart) {
                updateStart = startTime;
            }
            if (segmentsToUpdate == 0 || endTime > updateEnd) {
                updateEnd = endTime;
            }
            singleSegment = segment;
            ++segmentsToUpdate;

            refreshStatus.setNeedsRefresh(false);
            m_needUpdate = true;
        }
    }

    if (segmentsToUpdate > 1) {
        refreshSegment(0, updateStart, updateEnd);
    } else if (segmentsToUpdate > 0) {
        refreshSegment(singleSegment, updateStart, updateEnd);
    }

    if (e) QMainWindow::paintEvent(e);

    // moved this to the end of the method so that things called
    // from this method can still test whether the composition had
    // been modified (it's sometimes useful to know whether e.g.
    // any time signatures have changed)
    setCompositionModified(false);

    //!!!    m_inPaintEvent = false;
    /*
        if (m_havePendingPaintEvent) {
    	e = m_pendingPaintEvent;
    	m_havePendingPaintEvent = false;
    	m_pendingPaintEvent = 0;
    	paintEvent(e);
    	delete e;
        }
    */
}