A simple digital lock with attempted audio guidance

Dependencies:   FATFileSystem TextLCD mbed

Fork of Digital_Lock_with_audio by NITH ece

Revision:
1:85eb1c94154a
Parent:
0:e09703934ff4
Child:
2:9bdba6204bb4
--- a/main.cpp	Wed Mar 16 01:49:13 2011 +0000
+++ b/main.cpp	Tue Apr 23 12:49:09 2013 +0000
@@ -1,125 +1,365 @@
-/*
-Copyright (c) 2011 Anthony Buckton (abuckton [at] blackink [dot} net {dot} au)
 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+
 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <mbed.h>
+#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>                                                             
 
-#include <mpr121.h>
+
+//------------------------------------------------------------------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);
-
-// Create the interrupt receiver object on pin 26
+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 Serial to the PC for debugging
-Serial pc(USBTX, USBRX);
+//-------------------------------------------------------- Setup the i2c bus on pins 28 and 27
+I2C i2c(p9, p10);
+ 
 
-// Setup the i2c bus on pins 28 and 27
-I2C i2c(p9, p10);
-
-// Setup the Mpr121:
-// constructor(i2c object, i2c address of the mpr121)
+//------------------------------------------ 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 key_code=0;
     int i=0;
     int value=mpr121.read(0x00);
     value +=mpr121.read(0x01)<<8;
-    // LED demo mod by J. Hamblen
-    //pc.printf("MPR value: %x \r\n", value);
+    
     i=0;
     // puts key number out to LEDs for demo
-    for (i=0; i<12; i++) {
-        if (((value>>i)&0x01)==1) key_code=i+1;
+    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;
 }
-int main() {
-
-    pc.printf("\nHello from the mbed & mpr121\n\r");
+ 
 
-    unsigned char dataArray[2];
-    int key;
-    int count = 0;
+//------------------------------------------------------------------------------MAIN
 
-    pc.printf("Test 1: read a value: \r\n");
-    dataArray[0] = mpr121.read(AFE_CFG);
-    pc.printf("Read value=%x\r\n\n",dataArray[0]);
 
-    pc.printf("Test 2: read a value: \r\n");
-    dataArray[0] = mpr121.read(0x5d);
-    pc.printf("Read value=%x\r\n\n",dataArray[0]);
+int main()
+{
 
-    pc.printf("Test 3: write & read a value: \r\n");
-    mpr121.read(ELE0_T);
-    mpr121.write(ELE0_T,0x22);
-    dataArray[0] = mpr121.read(ELE0_T);
-    pc.printf("Read value=%x\r\n\n",dataArray[0]);
-
-    pc.printf("Test 4: Write many values: \r\n");
-    unsigned char data[] = {0x1,0x3,0x5,0x9,0x15,0x25,0x41};
-    mpr121.writeMany(0x42,data,7);
+//------------------------------------------------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);
 
-    // Now read them back ..
-    key = 0x42;
-    count = 0;
-    while (count < 7) {
-        char result = mpr121.read(key);
-        key++;
-        count++;
-        pc.printf("Read value: '%x'=%x\n\r",key,result);
+  int k;
+  //----------------------------------------------enter password
+  while(1)
+    { 
+    interrupt.fall(&fallInterrupt);
+    interrupt.mode(PullUp);
+    if(counter==7){
+    break;}
     }
-
-    pc.printf("Test 5: Read Electrodes:\r\n");
-    key = ELE0_T;
-    count = 0;
-    while (count < 24) {
-        char result = mpr121.read(key);
-        pc.printf("Read key:%x value:%x\n\r",key,result);
-        key++;
-        count++;
-    }
-    pc.printf("--------- \r\n\n");
-
-    // mpr121.setProximityMode(true);
-
-    pc.printf("ELE_CFG=%x", mpr121.read(ELE_CFG));
-
+    
+   
+  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) {
-        wait(5);
-        pc.printf(".");
-    }
+  
+  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;
+        }
+        }
 }
-
-
-
+}
+}