Files @ e26676bc539c
Branch filter:

Location: seniordesign-firmware/master/master/master.c

kripperger@CL-SEC241-09.cedarville.edu
Optimization (temp sense)
/*
 * Master Firmware
 *
 * Wireless Observational Modular Aerial Network
 * 
 * Ethan Zonca
 * Matthew Kanning
 * Kyle Ripperger
 * Matthew Kroening
 *
 */


#include "config.h"

#include <avr/io.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdbool.h>

#include "lib/serial.h"
#include "lib/aprs.h"
#include "lib/afsk.h"
#include "lib/led.h"
#include "lib/logger.h"
#include "lib/watchdog.h"
#include "lib/sd/sd_raw_config.h"
#include "lib/looptime.h"
#include "lib/slavesensors.h"

void micro_setup() {

}

int main(void)
{
    
	// Initialize libraries
	time_setup();
	micro_setup();
	watchdog_setup();
	led_setup();
	serial0_setup();
	serial1_setup();
	slavesensors_setup();
	logger_setup();
	afsk_setup();

	serial0_sendString("\r\n\r\n---------------------------------\r\nHAB Controller 1.0 - Initialized!\r\n---------------------------------\r\n\r\n");
	
	led_on(POWER);
		
	// Buffer for string operations
	char logbuf[32];
	const char* logBufPtr = logbuf;
	
	// Software timers	
	uint32_t lastAprsBroadcast = 0;
	uint32_t lastLog = 0;
	
	// If we are currently processing sensor data
	bool isProcessing = false;
	
	// Write CSV header to SD card
	logger_log("ProgramTime,LastAprsBroadcast,LastLog\n");
	
	while(1)
    {
		
		// Periodic: Logging
		if(time_millis() - lastLog > LOGGER_RATE) {
			
			// TODO: Acquire data from daughterboards
			//       This will be complicated because we need timeouts / unreliable transmission, etc
			//
			// For each daughterboard...
			//   1. Send request to daughterboard for sensor data
			//   2. Wait for response from daughterboard (timeout!)
			//   3. Put data into local variables for transmission / logging
			
			led_on(STAT);
			snprintf(logbuf, 32, "%lu,%lu,%lu,\r\n", time_millis(), lastAprsBroadcast,lastLog);
			logger_log(logbuf);
			serial0_sendString("SD Logger: ");
			serial0_sendString(logBufPtr);
			led_off(STAT);
			lastLog = time_millis();
		}		
		
		// Periodic: APRS transmission
		if(time_millis() - lastAprsBroadcast > APRS_TRANSMIT_PERIOD) {
			while(afsk_busy());
			aprs_send(); // non-blocking
			serial0_sendString("Initiating APRS transmission...\r\n");
			
			// Start getting values for next transmission
			isProcessing = true;
			
			lastAprsBroadcast = time_millis();
		}			
		
		// keep calling processSensors until it is finished
		if(isProcessing) 
		{
			isProcessing = slavesensors_process();
		}
		wdt_reset();
    }
}