The preloaded firmware shipped on the E-Dice.

Dependencies:   mbed

main.cpp

Committer:
Experiment626
Date:
2014-09-15
Revision:
1:a30065092967
Parent:
0:7c263455b8b9

File content as of revision 1:a30065092967:

/*
** This software can be freely used, even comercially, as highlighted in the license.
** 
** Copyright 2014 GHI Electronics, LLC
** 
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
** 
**     http://www.apache.org/licenses/LICENSE-2.0
** 
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
**/

#include "mbed.h"
#include <stdlib.h>
#include "MMA845x.h"

PinName const SDA = P0_5;
PinName const SCL = P0_4;

#define MMA8451_I2C_ADDRESS (0x1C << 1)

//enum DieBitMask { ONE = 8, TWO = 65, THREE = 73, FOUR = 85, FIVE = 93, SIX = 119 };
enum DIE { LEFT = 0, RIGHT = 1 };

void SetDieNumber( DIE leftRight, int dieFaceNumber);
void soundBuzzer(int Hz);
void RandomRollCycle(int iteration);
void ClearLEDs();
int SetSensitivityLevel();
void ProgramSplash();
void ProgramStart();

DigitalOut LeftDieLED[] = {(P0_19), (P0_18), (P0_17), (P1_15), (P0_23), (P0_14), (P0_15)};// declare 7 LEDs on Left Die
DigitalOut RightDieLED[] = {(P0_9), (P0_8), (P0_7), (P0_21), (P0_10), (P0_22), (P0_11)};// declare 7 LEDs on Right Die
DigitalOut Buzzer(P0_13);

DigitalIn userButton1(P0_1, PullUp);
DigitalIn userButton2(P0_16);

MMA845x acc(SDA, SCL, MMA8451_I2C_ADDRESS);

int frequencyInHz = 400;
int sensitivityLevel = 1;

main()
{
    ProgramSplash();
    
    while(true)
    {
        if(!userButton2)
            SetSensitivityLevel();
        
        if(!userButton1)
            ProgramStart();
    }  
}

void SetDieNumber( DIE leftRight, int dieFaceNumber)
{
    switch (dieFaceNumber)
    {
        case 1:
            if(leftRight == LEFT)
            {
                LeftDieLED[3] = true;
            }
            else
            {
                RightDieLED[3] = true;
            }   
            break;   
        case 2:
            if(leftRight == LEFT)
            {
                LeftDieLED[0] = true;LeftDieLED[6] = true;
            }
            else
            {
                RightDieLED[0] = true;RightDieLED[6] = true;
            }
            break;   
        case 3:
            if(leftRight == LEFT)
            {
                LeftDieLED[0] = true;LeftDieLED[3] = true;LeftDieLED[6] = true;
            }
            else
            {
                RightDieLED[0] = true;RightDieLED[3] = true;RightDieLED[6] = true;
            }
            break;   
        case 4:
            if(leftRight == LEFT)
            {
                LeftDieLED[0] = true;LeftDieLED[2] = true;LeftDieLED[4] = true;LeftDieLED[6] = true;
            }
            else
            {
                RightDieLED[0] = true;RightDieLED[2] = true;RightDieLED[4] = true;RightDieLED[6] = true;
            }   
            break;   
        case 5:
            if(leftRight == LEFT)
            {
                LeftDieLED[0] = true;LeftDieLED[2] = true;LeftDieLED[3] = true;LeftDieLED[4] = true;LeftDieLED[6] = true;
            }
            else
            {
                RightDieLED[0] = true;RightDieLED[2] = true;RightDieLED[3] = true;RightDieLED[4] = true;RightDieLED[6] = true;
            }   
            break;   
        case 6:
            if(leftRight == LEFT)
            {
                LeftDieLED[0] = true;LeftDieLED[1] = true;LeftDieLED[2] = true;LeftDieLED[4] = true;LeftDieLED[5] = true;LeftDieLED[6] = true;
            }
            else
            {
                RightDieLED[0] = true;RightDieLED[1] = true;RightDieLED[2] = true;RightDieLED[4] = true;RightDieLED[5] = true;RightDieLED[6] = true;
            }   
            break;   
    }
}

void soundBuzzer(int Hz)
{
    int ticks = Hz/64;
    int tickCount = 0;
    float frequency = 1/(float)Hz;
    
    while(tickCount < ticks)
    {
        wait(frequency);
        Buzzer = true;
        wait(frequency);
        Buzzer = false;
        tickCount++;
    }
}

void RandomRollCycle(int iteration)
{
    int leftDieRoll = 0;
    int rightDieRoll = 0;

    for(int soundLoop = iteration; soundLoop > 5; soundLoop--)
    {
        leftDieRoll = rand() % 6 + 1;
        rightDieRoll = rand() % 6 + 1;

        ClearLEDs();

        SetDieNumber(LEFT, leftDieRoll);
        soundBuzzer(1000);

        SetDieNumber(RIGHT, rightDieRoll);
        soundBuzzer(500);

        wait(1/(float)soundLoop);
    }
}

void ClearLEDs()
{
    for(int y = 0; y < 7; y++)
    {
        LeftDieLED[y] = false;
        RightDieLED[y] = false;
    }
}

int SetSensitivityLevel()
{
    ClearLEDs();
    
    sensitivityLevel++;
    
    if(sensitivityLevel > 6)
        sensitivityLevel = 1;
    
    SetDieNumber(LEFT, sensitivityLevel);
    
    soundBuzzer(600);
    wait(.25);
}

void ProgramSplash()
{
    for(int x = 200; x < 1000; x+=20)
        soundBuzzer(x);
    
    SetDieNumber(LEFT, sensitivityLevel);
}

void ProgramStart()
{
    ClearLEDs();
    for(int g = 0; g < 4; g++)
    {
        soundBuzzer(1000);
        wait(0.100);
    }
    SetDieNumber(RIGHT, 6);
    SetDieNumber(LEFT, 6);
    
    
    
    int16_t zAxis = 0;
    
    int deltaX;
    int X1;
    int X2;
    
    int deltaY;
    int Y1;
    int Y2;

    int deltaZ;
    int Z1;
    int Z2;
    
    zAxis = acc.getZ();
    srand (abs(zAxis));
    
//    int inactivityCounter = 0;
    
    while(true)
    {
        X1 = acc.getX();
        Y1 = acc.getY();
        Z1 = acc.getZ();
        wait(.25);
        X2 = acc.getX();
        Y2 = acc.getY();
        Z2 = acc.getZ();
        
        deltaX = X2 - X1;
        deltaY = Y2 - Y1;
        deltaZ = Z2 - Z1;        
        
        if(abs(deltaZ) >> (sensitivityLevel + 2))
            RandomRollCycle(26);

/*       
        inactivityCounter++;
        if(inactivityCounter > 500)
        {
            inactivityCounter = 0;
            deepsleep();
        }
*/
    }

}







/*

intialize()
{
    set pins to outputs for example
    maybe initialize teh accelerometer
    AcelInit();
    }

int Getsense()
{
    int sese =1;
    while(button not pressed)
    {
        if(othe rbutton)
        {
            sense++;
            if sense > 6) sense =1;
            SetLEDs(LEFT, sense);
        }
            
    }
    return sense;
}
void main()
{
    Intialize();
    
    sense = GetSensetivity();
    
    while(1)
    {
      int x = getaccel();
      if(x >> (sense+3))
        NewDiceRandom();
      
    }
}
*/