ネットワークアップデート機能とか、Pachubeへの情報登録とかの処理を追加しています

Dependencies:   Terminal EthernetNetIf Pachube TextLCD mbed ConfigFile FirmwareUpdater

main.cpp

Committer:
abe00makoto
Date:
2011-05-17
Revision:
0:a62f36392b9b
Child:
1:1eb67d074bed

File content as of revision 0:a62f36392b9b:

#include "mbed.h"
#include "geigercounter_sbm_20.h"
#include "trans.h"
#include "TextLCD.h"


#include "mbed.h"
#include "PachubeV2CSV.h"
#include "EthernetNetIf.h"
#include "HTTPClient.h"
#include "appconf.h"
#include "FirmwareUpdater.h"



 extern "C" void mbed_reset();
 
/*
 * Definitions for a configuration file.
 */
#define CONFIG_FILENAME "/local/PACHUBE.CFG"
const int PACHUBE_CODE_OK = 200;

LocalFileSystem localfs("local");

EthernetNetIf netif;

FirmwareUpdater fwup("http://mbed.org/media/uploads/abe00makoto", "geiger", true);

TextLCD  output( p24, p26, p27, p28, p29, p30 ); // rs, e, d0-d3
Geigercounter_SBM_20 geiger(p18,p22);//Geiger pin,Spekaer pin
Trans trans(p21,0.16/1000.0,0.76); //Trans pin,period,duty

static appconf_t appconf;


/**
 * Convert double to char.
 *
 * @param val Value.
 * @param buf A pointer to a buffer.
 * @param bufsiz The buffer size.
 */
void convertDoubleToChar(double val, char *buf, size_t bufsiz) {
    snprintf(buf, bufsiz, "%f", val);
}

/**
 * Post to the feed on Pachube.
 *
 * @param web Pointer to a Pachube object.
 * @param feed_id Feed ID.
 * @param stream_no Stream number.
 * @param value value.
 *
 * @return Pachube code.
 */
int web_post(PachubeV2CSV *web, int feed_id, int stream_no, double value) {
    char value_text[16];
    convertDoubleToChar(value, value_text, sizeof(value_text));
    char stream_no_text[8];
    stream_no_text[0] = "0123456789"[stream_no];
    stream_no_text[1] = '\0';
    return web->updateDataStream(feed_id, stream_no_text, std::string(value_text));
}



//firm ware updater
void check_newfirm() {
    if (fwup.exist() == 0) {
        output.printf("Found a new firmware.\n");
        if (fwup.execute() == 0) {
            output.printf("Update succeed.\n");
            wait(10);
            output.printf("Resetting this system.\n");
            wait(10);
            fwup.reset();
        } else {
            output.printf("Update failed!\n");
            
        }
    }else{
       output.printf("not found update.\n");
    }
    wait(5);
}

void print_geigerdata()
{
    output.cls();
    output.printf("%.3fuSv/h\n",geiger.getusv());
    output.printf("%.3fCPM",geiger.getcpm());
}




int main() {
  
  bool etherconnect;
  output.cls();
  output.printf("Hello.");
  wait(1);
  
  
  /*
   * Initialize ethernet interface.
   */
  output.cls();
  output.locate(0, 0);
  output.printf("Initializing...");
  output.locate(0, 1);
  output.printf("Ethernet: ");
  
  EthernetErr ethErr = netif.setup();
  if (ethErr) {
      output.printf("[NG]");
      //error("Ethernet setup failed. Done with code %d.\n", ethErr);
      etherconnect=false;
  }
  else{
      etherconnect=true;
      output.printf("[OK]");
  }
  
  wait(2);
  if(etherconnect){    
    //firmware update
    output.cls();
    check_newfirm();
  } 
  
    /*
     * Read configuration variables from a file.
     */
  output.cls();
  output.locate(0, 0);
  output.printf("cfg file Reading...");
  output.locate(0, 1);
  output.printf("Setup: ");
  appconf_init(&appconf);
  if (appconf_read(CONFIG_FILENAME, &appconf) != 0) {
      output.printf("[NG]");
      error("Failure to read a configuration file.\n");
  }
  else{
    output.printf("[OK]");
    wait(3);
  }
    
  /*
   * Initialize objects.
   */
  PachubeV2CSV web(appconf.apikey);
  const int feed_id = atoi(appconf.feedid);
      
  
  
  //20 minitues loop
  for(int min=0;min<(20/5);min++){
    trans.on();
    wait(0.5);
    geiger.start();  
    //5 minitues geiger run
    for(int i=0;i<5*60;i++){
      print_geigerdata();
      wait(1); 
    }
    geiger.stop();
    trans.off();
    output.cls();
    print_geigerdata();
    wait(1);
    /*
     * Check the pachube feautures.
     */
    if(etherconnect){
  
        if (web_post(&web, feed_id, 0, geiger.getusv()) != PACHUBE_CODE_OK) {
          output.printf("Checking Pachube status:x");
          wait(10);
        }

        if (web_post(&web, feed_id, 1, geiger.getcpm()) != PACHUBE_CODE_OK){
          output.printf("Checking Pachube status:x");
          wait(10);
        }
    }
  }
  
  if(!etherconnect){
    output.cls();
    output.printf("please!!\n net connect\n");
    wait(10);
    output.printf("mbed reset!!\n");
    wait(10);
    mbed_reset();
  }
  
  
  //
  //  night running mode. 
  //
  output.cls();
  output.printf("sound off mode..");
  geiger.soundoff();
  
  int errcnt=0;
  while(1){
    
    for(int min=0;min<(20/5);min++){
      trans.on();
      wait(1);
      geiger.start();
      for(int i=0;i<5*60;i++){
        print_geigerdata();
        wait(1); 
      }
  
      geiger.stop();
      trans.off();
    
      /*
       * Post.
       */
      if(etherconnect){
        if (web_post(&web, feed_id, 0, geiger.getusv()) != PACHUBE_CODE_OK) {
          output.printf("Checking Pachube status:x");
          errcnt++;
          wait(10);
        }

        if (web_post(&web, feed_id, 1, geiger.getcpm()) != PACHUBE_CODE_OK){
          output.printf("Checking Pachube status:x");
          errcnt++;
          wait(10);
        }
      }//if(etherconncet)
    }//for
    
    //if firmware exist.reset. 
    if(etherconnect){
      if(fwup.exist()==0)mbed_reset();
    }
    
    //many error!! reset
    if(errcnt>20)mbed_reset();
  }//while
}