/** * MCU: Atmega328 * Fuses: Oscilador interno a 8 Mhz (sin dividir por 8) * -U lfuse:w:0xe2:m -U hfuse:w:0xd1:m -U efuse:w:0x07:m */ int main(void) { adc_init(); timer0_init(timer0_callback); i2c_init(); rtc_init(rtc); rtc_sqw_rate(rtc, 1); rtc_sqw_enable(rtc); rtc_clock_start(rtc); eMBInit(MB_RTU, 0x03, 0, 9600, MB_PAR_NONE); eMBSetSlaveID(0x3, TRUE, (UCHAR*) "demeter", 8); eMBEnable(); blinkenlight(5, 100); parameters_init(); ports_init(); f_mount(&fs, "", 0); update_log_filename(); while (1) { eMBPoll(); update_state(); _delay_ms(100); } return (0); }
void gx_main(int port, apr_int64_t signature) { /* set up our log files */ if (opt.log_dir) { mkdir(opt.log_dir, S_IRWXU | S_IRWXG); if (0 != chdir(opt.log_dir)) { /* Invalid dir for log file, try home dir */ char *home_dir = NULL; if (0 == apr_env_get(&home_dir, "HOME", gx.pool)) { if (home_dir) chdir(home_dir); } } } update_log_filename(); freopen(log_filename, "w", stdout); setlinebuf(stdout); if (!get_and_allocate_hostname()) gpsmon_fatalx(FLINE, 0, "failed to allocate memory for hostname"); TR0(("HOSTNAME = '%s'\n", gx.hostname)); // first chace to write to log file TR2(("signature = %" FMT64 "\n", signature)); TR1(("detected %d cpu cores\n", number_cpu_cores)); setup_gx(port, signature); setup_sigar(); setup_udp(); setup_tcp(); gx.tick = 0; for (;;) { struct timeval tv; apr_hash_index_t* hi; /* serve events every 2 second */ gx.tick++; gx.now = time(NULL); tv.tv_sec = 2; tv.tv_usec = 0; /* event dispatch blocks for a certain time based on the seconds given * to event_loopexit */ if (-1 == event_loopexit(&tv)) { gpmon_warningx(FLINE, APR_FROM_OS_ERROR(errno), "event_loopexit failed"); } if (-1 == event_dispatch()) { gpsmon_fatalx(FLINE, APR_FROM_OS_ERROR(errno), "event_dispatch failed"); } /* get pid metrics */ for (hi = apr_hash_first(0, gx.qexectab); hi; hi = apr_hash_next(hi)) { void* vptr; gpmon_qexec_t* rec; apr_hash_this(hi, 0, 0, &vptr); rec = vptr; get_pid_metrics(rec->key.hash_key.pid, rec->key.tmid, rec->key.ssid, rec->key.ccnt); } /* check log size */ if (gx.tick % 60 == 0) { apr_finfo_t finfo; if (0 == apr_stat(&finfo, log_filename, APR_FINFO_SIZE, gx.pool)) { if (opt.max_log_size != 0 && finfo.size > opt.max_log_size) { update_log_filename(); freopen(log_filename, "w", stdout); setlinebuf(stdout); } } } } }
static inline void update_state(void) { DHT22_DATA_t sensor_values; rtc_datetime_24h_t current_dt; readDHT22(&sensor_values); rtc_read(rtc, ¤t_dt); event_t* events = get_events(); long start_secs; long current_secs; uint8_t i = 0; uint8_t flag = 0; state.temperature = sensor_values.raw_temperature; state.humidity = sensor_values.raw_humidity; state.light = adc_read(PHOTORESISTOR); datetime = (datetime_t ) { .year = current_dt.year, .month = current_dt.month, .date = current_dt.date, .hour = current_dt.hour, .minute = current_dt.minute, .second = current_dt.second }; current_secs = get_seconds((instant_t ) { datetime.hour, datetime.minute, datetime.second }); // recorro eventos para ver si tengo que activar relays for (i = 0; i < MAX_EVENTS; i++) { if (events[i].enabled) { start_secs = get_seconds(events[i].start); if (start_secs < current_secs && (start_secs + events[i].duration) > current_secs) { flag |= (1 << events[i].target); /* activar el evento */ } } } // si activaron coil, estamos dentro de un evento o presionaron pulsador for (uint8_t i = 0; i < NUMBER_OF_COILS; i++) { if (relays & (1 << i) || (flag & (1 << i)) || is_pushed()) { enable_relay(i); } else { disable_relay(i); } } if (ticks >= get_log_interval()) { update_log_filename(); /* si cambio el dia y hay que hacer roll del archivo */ //yyyyMMddhhmmss light humidity temperature f_printf(&log_file, "%04d%02d%02d%02d%02d%02d\t%d\t%d\t%d\t%d\t%d\n", datetime.year, datetime.month, datetime.date, datetime.hour, datetime.minute, datetime.second, state.light, state.humidity, state.temperature, is_relay_enabled(0), is_relay_enabled(1)); f_sync(&log_file); ticks = 0; } } void timer0_callback() { ticks++; LED_PORT ^= _BV(LED); }