http://http://diytec.web.fc2.com/mark2r2/

Dependencies:   EthernetNetIf NTPClient_NetServices mbed ConfigFile

main.cpp

Committer:
mark2r2
Date:
2011-09-20
Revision:
0:08a4d61cd84c

File content as of revision 0:08a4d61cd84c:

/*************************************************************

 main.c

*************************************************************/
#include "geiger.h"

void calculate_sv(){
    cpm = 0;
    for(int i=0; i<=first_touch_index; i++){
        cpm += cpm_array[i];
    }
    cpm /= ((first_touch_index+1)*((float)CHUNK/60));
    
    uSv = cpm/carib + offset_usv;
    if (uSv <0) uSv = 0;
  
    //peak usv set
    if(peak_uSv<uSv){
        peak_uSv=uSv;
    }

    // for long term average
    long_cpm=0;
    unsigned long cpm_sum=0;
    for (int i=0; i<= long_first_touch_index; i++) {
        cpm_sum += long_cpm_array[i];
    }
    cpm_sum *= 60;
    long_cpm = (float)cpm_sum / ((long_first_touch_index)*60+count_second);
    long_uSv = long_cpm/carib + offset_usv;
    
#ifdef DEBUG
    pc.printf("cpm=%3d,usv=%.3f,longcpm=%ld,long_usv=%.3f\r\n",(int)cpm,uSv,(long)long_cpm,long_uSv);
#endif

}

void next_geiger_countup(){
 
    cnt = 0;
    if(++cpm_index>=cpm_array_max){
        cpm_index=0;
    }  
    //first touch index count up
    if(cpm_index>first_touch_index){
        first_touch_index=cpm_index;
    }
    cpm_array[cpm_index]=cnt;

    // for long term average
    if (++count_second >= 60) {
        if (++long_cpm_index >= long_cpm_array_max+1) {
            long_cpm_index = 0;
        }
        long_cpm_array[long_cpm_index] = 0;
        count_second = 0;

        if(long_cpm_index > long_first_touch_index){
            long_first_touch_index = long_cpm_index;
        }
    }

}


// Timer -- called every 1 min.
Ticker timer;

void attime(){

    next_geiger_countup();
    if(++updateintervalcount > updateinterval){
        updateflag=1;
        updateintervalcount=0;
    }
}


void geiger()
{
    if(mode==1){
        read_dma_data();
    }

    cnt++;
    cpm_array[cpm_index]=cnt;
    long_cpm_array[long_cpm_index]++;
    
    *outLED=1;
    if(sound==1) *buzzer=1;
    click.attach(&buzzer_off,0.03);
}

void whereami() {
     if(gps->sample()&& gps->longitude!=0 && gps->latitude!=0) {
         printf("GPS:%f/%f,", gps->longitude, gps->latitude);
     }
}


void console_output(){
    char msg[256];
    msg[0]='\0';
    if(++console_output_flag>2){
      printable_msg(msg);
      printf("%s",msg);
      console_output_flag=0;
    }
}

//NTP setup
void ntpget() {

    Host server(IpAddr(), 123, "jp.pool.ntp.org");
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("Get NTP.");
    ntpRet = ntp.setTime(server);

}

void pulldown() {
    DigitalIn dp05(p5);     dp05.mode(PullDown);
    DigitalIn dp06(p6);     dp06.mode(PullDown);
    DigitalIn dp07(p7);     dp07.mode(PullDown);
    DigitalIn dp08(p8);     dp08.mode(PullDown);
    DigitalIn dp09(p9);     dp09.mode(PullDown);
    DigitalIn dp10(p10);    dp10.mode(PullDown);
    DigitalIn dp11(p11);    dp11.mode(PullDown);
    DigitalIn dp12(p12);    dp12.mode(PullDown);
    DigitalIn dp13(p13);    dp13.mode(PullDown);
    DigitalIn dp14(p14);    dp14.mode(PullDown);
    DigitalIn dp15(p15);    dp15.mode(PullDown);
    DigitalIn dp16(p16);    dp16.mode(PullDown);
    DigitalIn dp17(p17);    dp17.mode(PullDown);
    //DigitalIn dp18(p18);    dp18.mode(PullDown);
    DigitalIn dp19(p19);    dp19.mode(PullDown);
    DigitalIn dp20(p20);    dp20.mode(PullDown);
    DigitalIn dp21(p21);    dp21.mode(PullDown);
    //DigitalIn dp22(p22);    dp22.mode(PullDown);
    //DigitalIn dp23(p23);    dp23.mode(PullDown);
    //DigitalIn dp24(p24);    dp24.mode(PullDown);
    DigitalIn dp25(p25);    dp25.mode(PullDown);
    //DigitalIn dp26(p26);    dp26.mode(PullDown);
    //DigitalIn dp27(p27);    dp27.mode(PullDown);
    //DigitalIn dp28(p28);    dp28.mode(PullDown);
    //DigitalIn dp29(p29);    dp29.mode(PullDown);
    //DigitalIn dp30(p30);    dp30.mode(PullDown);
}

/****************  main  ***************************/

int main() {
    pulldown();

    AnalogOut tri(p18);
    tri = 0.0;

    //cpu_setting();

    // See http://mbed.org/users/no2chem/notebook/mbed-clock-control--benchmarks/
    setSystemFrequency(0x3, 0x1, cpu_speed, 1); // Set clock freq 96MHz (full speed) 
    SystemCoreClockUpdate();
    pc.baud(460800);

    EthernetErr ethErr;

    environment_setting(fwserver);

    // malloc for long average  
    long_cpm_array = (unsigned int *)malloc((long_cpm_array_max+1) * sizeof(unsigned int) );
    if (long_cpm_array == NULL) {
        lcd.cls();
        lcd.printf("Can't malloc for long_cpm_array");
        pc.printf("Can't malloc for long_cpm_array");
        abort();
    }
    
    if (mode != -1) {
        switch(updatetype){
        case 0:
            break;
        case 1:
            twitter_setup();
            break;
        case 2:
            pachube_setup(&appconf);
            break;
        default:
            lcd.cls();lcd.locate(0,0);
            lcd.printf("No update to the internet\n");
            break;
        }
        wait(0.5);
    }
    
  // ******  Initializing objects ********
    PachubeV2CSV web(appconf.apikey);
    
    if (mode==1) {
        AnalogIn Sense15_(pin_assign(AnalogInput_pin_number));
        Sense15=&Sense15_;
    }

    InterruptIn Geiger_signal(pin_assign(GMInterrupt_pin_number)); // Geiger signal

    DigitalOut buzzer_(pin_assign(Buzzer_pin_number));
    buzzer=&buzzer_;

    DigitalOut outLED_(pin_assign(LED_pin_number));
    outLED=&outLED_;

    GPS gps_(pin_assign(GPStx_pin_number), pin_assign(GPSrx_pin_number));
    gps=&gps_;
   
    if (mode != -1) {
        printf("Version: %s\n",VERSION);
        lcd.cls();
        lcd.printf("Ver %s\n",VERSION);
        wait(2);
        
        char msg[256] = "";
        fullcalendarHyoji(msg);
        printf("Self Clock: %s\n",msg);
        
        // Ethernet setup
        fwup = new FirmwareUpdater(fwserver, BINNAME, &commonClient,true);
    
        if (eth0.link()) {
            lcd.locate(0,0);lcd.cls();lcd.printf("Setting up the Internet(DHCP)\n");
            ethErr = eth.setup();
            lcd.cls(); lcd.locate(0,0);
            if(ethErr){
                lcd.printf("Please plug into the Internet.");
                printf("Error %d in setup.\n", ethErr);
            }else{
                noInternet=0;
                IpAddr ipadr = eth.getIp();
                lcd.printf("IP=%d.%d.%d.%d\n",
                    ipadr[0],ipadr[1],ipadr[2],ipadr[3]);
                wait(2);
                if(firmware_update_interval > 0) {
                    check_newfirm();
                }
                ntpget();
    
                memset((char *)msg, '\0', 256);
                fullcalendarHyoji(msg);
                printf("NTP Clock:  %s\n",msg);
            }
        }
    } // end if (mode != -1)

    if (mode == 1) {
        setup_adcdma(); 
    }

    // Geiger setup
    float stepvolt;
    const int step=40;
    for (stepvolt=0; stepvolt<volt; ) {
        lcd.cls();
        lcd.printf("volt=%.0f\n", stepvolt);
        tri = stepvolt/voltagedivider/3.3;
        wait(0.5);
        stepvolt+=step;
    }
    lcd.cls();
    lcd.printf("volt=%.0f\n", volt);
    tri = volt/voltagedivider/3.3;
    wait(0.5);
    
    for(int i=10; i>0; i--) {
        lcd.cls();
        lcd.printf("Wait %2dsec for stabilize voltage",i);
        wait(1);
    }

    Geiger_signal.rise(&geiger);
    Geiger_signal.mode(PullDown);

    // timer interrupt
    timer.attach(&attime, CHUNK);

    int firmware_update_term = firmware_update_interval * 60 / (updateinterval/60);
    int firmware_update_counter=0;
    
    if (mode != -1) {
        for(int i=init_stabilize_time; i>0; i--) {
            lcd.cls();
            lcd.printf("Wait %2dsec for stabilize cpm",i);
            wait(1);
        }
    }

    //************* Main Loop ******************//
    while(1){

        if (mode == -1) {
            LCD_cpm_output();
        } else if (mode != 3) {
            LCD_time_and_output();
        }
//      console_output();

        wait(1.0);
        if(mode==2){
            whereami();
        }
        if(mode != -1 && updateflag){
            updateflag=0;
            if (noInternet==1 && eth0.link()==1){
                ethErr = eth.setup();
                if(ethErr) {
                } else {
                    noInternet=0;
                    ntpget();
                }
            }

            if (!noInternet) {
                switch(updatetype){
                case 0:
                    break;
                case 1:          
                    twitter_output();
                    break;
                case 2:
                    printf("pachube\r\n");
                    pachube_output(&web, &commonClient);
                    printf("data uploaded to pachube\n");
                    break;
                default:
                    break;
                }
        
                if(firmware_update_interval > 0 &&
                   firmware_update_counter++ >= firmware_update_term){
                    if(fwup->exist()==0) {
                        mbed_reset();
                    } else {
                        firmware_update_counter = 0;
                    }
                    ntpget();
                }          
            }// !noInternet
        }//if update flag
    }//while
}//main