示例#1
0
/**
 * 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);
}
示例#2
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);
				}
			}
		}
	}
}
示例#3
0
static inline void update_state(void) {
	DHT22_DATA_t sensor_values;
	rtc_datetime_24h_t current_dt;
	readDHT22(&sensor_values);
	rtc_read(rtc, &current_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);
}