CHANGELOG:

PCB Information:
	HiFiLOGIX has progressed to a point where the development of a least a prototype PCB is possible.
	I am currently playing around with KiCAD and when I'm happy with a design, will send it out to be
	made and will begin doing any additional needed development on that board. 

Version 0.2.0:

	Software:
		EEPROM Support out of beta. Added hardware interrupt routine for it.
			Using the EEPROM is now the default action for the software, meaning the beta version
			has gone away. This sketch absolutely makes use of the EEPROM as part of it's boot
			routine. It will overwrite data on first boot and loads the "default" input every
			boot. The update is done via an interrupt. More on that will be explained later as
			it will require some power-supply hacking I'll have to design. 

Version 0.1.9:

	Software:
		PROGMEM now stores the input name table.
			I moved the input table to program space. This saves some ram I might need later.
			
		EEPROM Code Commented Out In Non-Beta
			The EEPROM beta code now exists in the non-beta; but it comes commented out. This
			is done for the lazy people that don't like/want/know-how to edit code.
			
	Hardware:
		Power-On Reset circuit on 595 removed.
			The POR circuit originally held the shift-register reset low long for a brief second
			to clear the random start-up state. This was because the old method of controlling the
			outputs on the chip resulted in the outputs turning on during the ATMega's initalization.
			(They go from high-impedance to low before the code takes over.) But with the new blanking
			circuit that's not a problem; it keeps both the 2003 and 595's outputs off untill it goes
			logic high in the software. The three components from the POR are now gone, the pull-up on
			the 595's enable line changed to a 1k, and the transistor and additional resistor added for
			the switch/inverter. It basically reduces overall count by just one component; but it makes
			the thing behave better than I expected.
			
			I'm sure in a lot of situtations this is a bad idea; but since the 595 doesn't seem to care
			if it has the reset circuit and the rest of our circuit doesn't care what or if the 595 boots
			in a scrambled state...why have it? Since we clock data in to it before pulling blanking high
			it won't output incorrect data.

Version 0.1.8: 

	Software:
		No longer clear the shift register.
			Originally I did this to make sure the register was cleared...because I honestly wasn't 100% sure what was
			going on. I looked at some examples...did some things...and got excited when it worked. In complete total 
			hindsight....I actually didn't need to do this. Originally I did it "just to be sure" it got cleared...and 
			for a while since I wasn't exactly sure what the shift-register functions fully did; I just left it. The 
			change I made in 0.1.6 of adding arguments to DontCrossTheStreams seemed to make a lot of things fall in to
			place...and it turns out that when I finally got to the point of deciding to try adding EEPROM support..that
			change made the entire thing easier to implement. 0.1.7 practically rewrote the whole loop, which lead to me
			doing it to the rest of the code. 
			
		Three functions removed.
			clearShiftRegister was removed to already mentioned redundancy. updateShiftRegister had it's few lines of
			code moved to DontCrossTheStreams. logo() had it's code moved from it's own function to just directly into
			the setup function. With this change, DontCrossTheStreams has morphed from it's original function of just
			setting the shift register to all 0, in to being the entire process of changing inputs. Though I did figure
			out that functions really didn't add much bloat. Between 0.1.7 and 0.1.8 I only shaved 22 bytes off the 
			original compile size. 
			
			I have no clue what it takes to optimize C. I barely know it.
			
		srEnable renamed to blanking.
			This better represents what it does. While this is probably more notoriously known in regards to CRT
			operation; I'm a pinball guy by trade and the term is used quite a bit on the solid-state/digital 
			machines. 
			
		EEPROM Beta:
			Remember how I said someday the default boot wouldn't be static? Well, I've done it. This beta version uses
			3 bytes of EEPROM space to store the last used input as well as one additional byte to indicate if default
			information exists and to load if it it does, or write it if it doesn't. It currently uses bytes 1020 - 1023, 
			the end of the EEROM on my ATMega 328. 1020 stores the byte for the shift register, 1021 stores the x offset
			for the display, 1022 stores the index pointer to the name, and 1023 stores a "T" if it's written settings. 
			Right now, it will update those addresses on each input change; and read those settings on boot to pass to
			DontTouchTheStreams.
			
			While I toyed around with the idea of something like FRAM to avoid the lifetime limitations and just write
			each source change; I've decided I'm going to give the Arduino a lot of capacitance on it's power supply,
			attach a sense circuit to the main power supply, and just write those values when it detects a power-off. 
			The code only updates if necessary; so if you power it off on the same input it was powered-up at, it won't
			write. In theory...if you write to this thing twice a day it will take close to 100 years to hit the write
			limit. 
			
			But I haven't implemented that in hardware...though I have some ideas. Until I do this is considered a beta
			version that won't burn the EEPROM out like writing to it in loop; but still does so every single input
			change.
			
			It is written off the 0.1.8 code.
			
	Hardware:
		No changes; but eliminating the reset circuit on the dev prototype has caused zero ill effects with the blanking.
			
Version 0.1.7:

	Main:
		Decided to try and comment changes better.
			This at least gives a minor insight in to why I did it. I'll mark comments added later with an asterisk.
			
	Software:
		Practically rewrote the main loop.
			Instead of all the switch/case bullshit, I just dump to a variable and make that part of the
			conditional IF statements.
		Bitmapped the logo.
			Fonts are large. The 98x24 bitmap was smaller.
	
Version 0.1.6:

	Software:
		Removed a bunch of functions in favor of passing arguments to function.
			The indvidual functions for setting each input and setting the LCD have largely been combined
			in to one since I figured out how to use arguments. Additional stuff changed/added to accomodate
			this.*

Version 0.1.5:

	Hardware 
		Removed 2003 ground from 595 enable line. (That was a stupid idea that thankfully didn't blow up.)
			I calculated the relays to be 40mA each. Sinking that much current from an IO pin is pushing it, let alone
			the fact I need two relays for phono inputs. 
		Added logic invterter to drive the 595 enable and 2003 ground. (Transistor can sink more current).
			The 2N2222 is rated for like...800mA or something; wayyyy more than I need. In retrospect, this would have been
			a better solution overall than the reset circuit on the 595. Will I change it? I'll have to play with it.
		
	Software:
		Flipped srEnable logic to drive logic inveter added to board.

Version 0.1.4:

	Main:
		Project is now called HiFiLOGIX

	Hardware:
		Tied ULN2003/2803 ground to 595's enable line
			Even with the shift register quiet during boot, the darlington array isn't; and pull-down
			resistors don't seem to help. But I soon realize this is a stupid idea.
		Replaced 1602 display with SSD1306 128x32 OLED
		
	Software:
		Added code to drive OLED display.
		Removed 1602 display code.

Version 0.1.3:

	Hardware:
		Added power-on reset RC circuit to control 595 master reset.
		Removed 595 master reset from Arduino control.
		
	Software:
		Removed 595 master reset commands.
	
	
Version 0.1.2:

	Hardware:
		Wired 595 output enable and reset to Arduino control.
		
	Software:
		Added output and reset commands for 595.
		

Version 0.1.1:

	Hardware:
		Added KY-022 IR module (1838 IR sensor with integrated resistor+led)
		
	Software:
		Added basic support for IR remote control. 
		
		
Version 0.1

	Hardware:
		Added I2C 16x2 LCD Display
		
	Software: 
		Added support for display.
		
		
		
Version Alpha2.1

	Software: 
		Created routine to shift all 0s to 595.
		Added two-relay switching for Phono-1
		Added Phono-2 routine.
		
				
Version Alpha2

	Software:
		Fixed shift register bug from Alpha1.
		Removed serial monitor debugging.
		Cleaned up main loop if statement.
		
		
		
Version Alpha1

	Hardware:
		Initial build. Just switches and LEDs on a 595.
		
	Software:
		Initial offical release. Totally broken.
	