/*****************************************************
  
  ACCOUPHENE FIRMWARE v.0.02
 
  Uses an ATTINY26 with speakers hooked to 
  PA0..PA7 and PB0..PB4

	The frequencies are generated by various 
	duty cyles defined by vars A..M

  Vincent Leclerc, XS Labs, January 2006
  v@xslabs.net

  (CC) Attribution-NonCommercial-ShareAlike 2.0
  http://creativecommons.org/licenses/by-nc-sa/2.0/

******************************************************/

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

// duty cycles
#define A   2
#define B   5
#define C   8
#define D  10
#define E  15
#define F  20
#define G  25
#define H  30
#define I  35
#define J  40
#define K  45
#define L  50
#define M  55

// functions declarations
void vibrate(void);
void sweep(uint16_t max);

// main
int main(void){

  // declare vars
  uint8_t l;
  uint16_t i,j,k,m;
	uint8_t state_A = 0;
	uint8_t state_B = 0;
	uint8_t state_C = 0;
	uint8_t state_D = 0;
	uint8_t state_E = 0;
	uint8_t state_F = 0;
	uint8_t state_G = 0;
	uint8_t state_H = 0;
	uint8_t state_I = 0;
	uint8_t state_J = 0;
	uint8_t state_K = 0;
	uint8_t state_L = 0;
	uint8_t state_M = 0;
	  
  DDRA = 0xFF;
  DDRB = 0xFF;
  
  while(1){ 
		// GENERATE DIFFERENT FREQUENCIES BY MODING i WITH VARIOUS CONSTANTS
		// TO TOGGLE AN OUTPUT PIN ON AND OFF AT SPECIFIC DUTY CYCLES
		for(i=0;i<0xFFFF;i++){
			if (!(i % A)) {
				if (state_A) PORTA |=  0x01;
				else         PORTA &= ~0x01; 
				state_A = 1 - state_A;
			}
			if (!(i % B)) {
				if (state_B) PORTA |=  0x02;
				else         PORTA &= ~0x02; 
				state_B = 1 - state_B;
			}
			if (!(i % C)) {
				if (state_C) PORTA |=  0x04;
				else         PORTA &= ~0x04; 
				state_C = 1 - state_C;
			}
			if (!(i % D)) {
				if (state_D) PORTA |=  0x08;
				else         PORTA &= ~0x08; 
				state_D = 1 - state_D;
			}
			if (!(i % E)) {
				if (state_E) PORTA |=  0x10;
				else         PORTA &= ~0x10; 
				state_E = 1 - state_E;
			}
			if (!(i % F)) {
				if (state_F) PORTA |=  0x20;
				else         PORTA &= ~0x20; 
				state_F = 1 - state_F;
			}
			if (!(i % G)) {
				if (state_G) PORTA |=  0x40;
				else         PORTA &= ~0x40; 
				state_G = 1 - state_G;
			}
			if (!(i % H)) {
				if (state_H) PORTA |=  0x80;
				else         PORTA &= ~0x80; 
				state_H = 1 - state_H;
			}
			if (!(i % I)) {
				if (state_I) PORTB |=  0x01;
				else         PORTB &= ~0x01; 
				state_I = 1 - state_I;
			}
			if (!(i % J)) {
				if (state_J) PORTB |=  0x02;
				else         PORTB &= ~0x02; 
				state_J = 1 - state_J;
			}
			if (!(i % K)) {
				if (state_K) PORTB |=  0x04;
				else         PORTB &= ~0x04; 
				state_K = 1 - state_K;
			}
			if (!(i % L)) {
				if (state_L) PORTB |=  0x08;
				else         PORTB &= ~0x08; 
				state_L = 1 - state_L;
			}
			if (!(i % M)) {
				if (state_M) PORTB |=  0x10;
				else         PORTB &= ~0x10; 
				state_M = 1 - state_M;
			}
		}
  }
  return 0;
}

// functions
void vibrate(void){
	uint16_t j;
	for (j=0;j<0x1800;j++) PORTA = 0xAA;
	for (j=0;j<0x1800;j++) PORTA = 0x55;
	return;
}

void sweep(uint16_t max){ // ****USES INPUT ON PORTB
	uint16_t i,j,k;
	for (i=0;i<max;i++) {
		for(k=0;k<max-i;k++){
			if (PINB > 0) i=0;
			for (j=0;j<i;j++) PORTA = 0xAA;
			for (j=0;j<i;j++) PORTA = 0x55;
		}
	}
	return;
}


