A simple digital lock with attempted audio guidance

Dependencies:   FATFileSystem TextLCD mbed

Fork of Digital_Lock_with_audio by NITH ece

main.cpp

Committer:
kit2
Date:
2013-04-23
Revision:
1:85eb1c94154a
Parent:
0:e09703934ff4
Child:
2:9bdba6204bb4

File content as of revision 1:85eb1c94154a:





#include "mbed.h"
#include "SDFileSystem.h"
#include <string>
#include <list>
#include <mpr121.h>
#include "TextLCD.h"
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <iostream>                                                             


//------------------------------------------------------------------initialize lcd

TextLCD lcd(p24, p25, p27, p28, p29, p30); // rs, e, d4-d7
//--------------------------------------------------------------------

//------------------------------------------------------------------initial touch pannel
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
DigitalOut servo(p12);
int org[7] = {0,0,0,0,0,0,0};
int Nums[7] = {0,0,0,0,0,0,0};
int counter = 0;
int count2 = 0;
 
//------------------------------------------- Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);
 

//-------------------------------------------------------- Setup the i2c bus on pins 28 and 27
I2C i2c(p9, p10);
 

//------------------------------------------ constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);

//-------------------------------------------------------------------touch panel initialised



//---------------------------------------------------------------------------------------------playing audio
AnalogOut DACout(p18);
DigitalOut digout(LED4);
Ticker tick;
SDFileSystem sd(p5, p6, p7, p8, "sd"); // NGX mbed base board

#define SAMPLE_FREQ 40000
#define BUF_SIZE (SAMPLE_FREQ/10)
#define SLICE_BUF_SIZE 1

void dac_out(void);
void play_wave(char *);
void cleanup(char *);
void fill_adc_buf(short *, unsigned);
void swapword(unsigned *);

// a FIFO for the DAC
short DAC_fifo[256];
short DAC_wptr;
short DAC_rptr;
short DAC_on;

typedef struct uFMT_STRUCT {
short comp_code;
short num_channels;
unsigned sample_rate;
unsigned avg_Bps;
short block_align;
short sig_bps;
} FMT_STRUCT;
void play_wave(char *wavname)
{
unsigned chunk_id,chunk_size,channel;
//        unsigned *data_wptr,data,samp_int,i;
unsigned data,samp_int,i;
short dac_data;
char *slice_buf;
short *data_sptr;
//        char *data_bptr;
FMT_STRUCT wav_format;
FILE *wavfile;
long slice,num_slices;
DAC_wptr=0;
DAC_rptr=0;
for (i=0;i<256;i+=2) 
    {
    DAC_fifo[i]=0;
    DAC_fifo[i+1]=3000;
    }
DAC_wptr=4;
DAC_on=0;

led1=led2=led3=led4=0;

wavfile=fopen(wavname,"rb");
if (!wavfile) {
    printf("Unable to open wav file '%s'\n",wavname);
    exit(1);
    }

fread(&chunk_id,4,1,wavfile);
fread(&chunk_size,4,1,wavfile);
while (!feof(wavfile)) {
    switch (chunk_id) {
      case 0x46464952:
        fread(&data,4,1,wavfile);
        break;
      case 0x20746d66:
        fread(&wav_format,sizeof(wav_format),1,wavfile);
        if (chunk_size > sizeof(wav_format))
        fseek(wavfile,chunk_size-sizeof(wav_format),SEEK_CUR);
// create a slice buffer large enough to hold multiple slices
        slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE);
        if (!slice_buf) {
        exit(1);
        }
        break;
      case 0x61746164:
        slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE);
        if (!slice_buf) {
        exit(1);
        }        num_slices=chunk_size/wav_format.block_align;
        samp_int=1000000/(wav_format.sample_rate);
   
// starting up ticker to write samples out -- no printfs until tick.detach is called
        tick.attach_us(&dac_out, samp_int); 
        DAC_on=1; 
        led2=1;
        for (slice=0;slice<num_slices;slice+=SLICE_BUF_SIZE) {
        fread(slice_buf,wav_format.block_align*SLICE_BUF_SIZE,1,wavfile);
        if (feof(wavfile)) {
        exit(1);
          }
          data_sptr=(short *)slice_buf;
          for (i=0;i<SLICE_BUF_SIZE;i++) {
          dac_data=0;

// for a stereo wave file average the two channels.
            for (channel=0;channel<wav_format.num_channels;channel++) {
              switch (wav_format.sig_bps) {
                case 16:
                  dac_data+=(  ((int)(*data_sptr++)) +32768)>>5;
                  break;
              }
            }
            dac_data>>=1;
            DAC_fifo[DAC_wptr]=dac_data;
            DAC_wptr=(DAC_wptr+1) & 0xff;
            while (DAC_wptr==DAC_rptr) {
            led1=1;
            }
            led1=0;
          }
        }
        DAC_on=0;
        led2=0;
        tick.detach();
        led3=1;
        free(slice_buf);
        break;
      case 0x5453494c:
        fseek(wavfile,chunk_size,SEEK_CUR);
        break;
      default:
        data=fseek(wavfile,chunk_size,SEEK_CUR);
        break;
    }
    fread(&chunk_id,4,1,wavfile);
    fread(&chunk_size,4,1,wavfile);
  }
  fclose(wavfile);
  led1=0;
}


void dac_out()
{
  if (DAC_on) {
    digout=1;
    DACout.write_u16(DAC_fifo[DAC_rptr]);
    DAC_rptr=(DAC_rptr+1) & 0xff;
    digout=0;
  }
}

    


//---------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------obtaining input

void fallInterrupt() {
int key_code=0;
    int i=0;
    int value=mpr121.read(0x00);
    value +=mpr121.read(0x01)<<8;
    
    i=0;
    // puts key number out to LEDs for demo
    for (i=0; i<12; i++) 
    {
        if (((value>>i)&0x01)==1) 
        {
            key_code=i;
            lcd.printf("%d", i);
            if(counter < 7)
            {
                Nums[counter] = i;
                counter++;
            }
        }
    }
    led4=key_code & 0x01;
    led3=(key_code>>1) & 0x01;
    led2=(key_code>>2) & 0x01;
    led1=(key_code>>3) & 0x01;
}
 

//------------------------------------------------------------------------------MAIN


int main()
{

//------------------------------------------------to start enter new password which user wants to set
lcd.cls();
lcd.printf("enter your new password\n");
play_wave("/sd/forest.wav");
wait(0.5);

  int k;
  //----------------------------------------------enter password
  while(1)
    { 
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);
    if(counter==7){
    break;}
    }
    
   
  for (k=0; k<7; k++)
  {
    org[k]=Nums[k];
  }
    
  wait(1);
     
AGAIN:    
    lcd.cls();
    lcd.printf("1-open door\n2-reset password");
    play_wave("/sd/forest.wav");
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);
  
  while (1) 
  {
  counter=0;
  if(Nums[0]==1)
    { 
    lcd.cls();    
    //---------------------------------------------------enter the password
    lcd.printf("enter your password\n");
    play_wave("/sd/forest.wav");
    wait(1);
    
    while(1)
        {
        interrupt.fall(&fallInterrupt);
        interrupt.mode(PullUp);
        if(counter==7){break;}
        }
             if(counter == 7)
                   {
                       wait(1);    
                       //lcd.printf("%d",Nums[4]);
                           for(k=0;k<7;k++)
                           {
                           lcd.printf("%d",Nums[k]); 
                           wait(1);
                           }
                           if((Nums[0] == org[0]) && (Nums[1] == org[1]) && (Nums[2] == org[2])&&(Nums[3] == org[3]) && (Nums[4] == org[4]) &&(Nums[5] == org[5])&& (Nums[6] == org[6]))
                           {
                              lcd.cls();
                              lcd.printf("password is correct, door open\n"); 
                              servo=1;
                              wait(1);
                              lcd.cls();
                              lcd.printf("opening door...\n"); 
                           // play_wave("/sd/forest.wav");
                              wait(10);
                              goto AGAIN;
                           }
       else
       {
       lcd.cls();
       lcd.printf("password incorrect.retry\n"); 
        play_wave("/sd/forest.wav");
       goto AGAIN;
       }
       }
       }
       
       
       wait(1); 
       if(Nums[0]==2)
       {   
         wait(1);
         counter=0;
         lcd.cls();
         lcd.printf("enter your old password\n");
         play_wave("/sd/forest.wav");
         while(1)
         {
         interrupt.fall(&fallInterrupt);
         interrupt.mode(PullUp);
         if(counter==7){break;}
         }
  
    if(counter == 7)
    {
   
       if((Nums[0] == org[0]) && (Nums[1] == org[1]) && (Nums[2] == org[2])&&(Nums[3] == org[3]) && (Nums[4] == org[4]) &&(Nums[5] == org[5])&& (Nums[6] == org[6]))
       {
       counter=0;
       lcd.cls();
       lcd.printf("enter your new password"); 
       play_wave("/sd/forest.wav");
       while(1)
        {
        interrupt.fall(&fallInterrupt);
        interrupt.mode(PullUp);
        if(counter==7){break;}
        }
  
         for (k=0; k<7; k++)
         {
          org[k]=Nums[k];
         }
  
       lcd.cls();
       lcd.printf("password changed");
       play_wave("/sd/forest.wav");
       goto AGAIN;
       }
       else
       {
        lcd.cls();
        lcd.printf("password incorrect.retry\n");
       play_wave("/sd/forest.wav");
        goto AGAIN;
        }
        }
}
}
}