Embedded software Assessment 2

Dependencies:   MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed

Function.h

Committer:
muaiyd
Date:
2014-02-21
Revision:
13:6094b94b3b7c
Parent:
12:582753a4f1fb
Child:
14:17be0f2d153f

File content as of revision 13:6094b94b3b7c:

#include "MCP23017.h"
#include "WattBob_TextLCD.h"
#include "mbed.h"
#include "SDFileSystem.h"

MCP23017 Port(p9,p10,0x40) ;      // 16-bit parallel I/O object 
WattBob_TextLCD LCD(&Port);       // Varaible to 2*16 chacater LCD object


BusOut BinLed(LED4, LED3, LED2, LED1);
DigitalIn FrequencyIn(p15);
DigitalIn Switch1(p17);
DigitalIn Switch2(p18);
AnalogIn Analogue_in_1(p19);
AnalogIn Analogue_in_2(p20);
 
SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board

uint8_t Analug1_valu[5]={0,0,0,0,0};
uint8_t Analug2_valu[5]={0,0,0,0,0};
uint8_t Bin=0x00;
bool Swch1;
bool Swch2;
bool Ena_job6=0;
bool FreqTimeOutE=1;
uint8_t Error_Code;
uint16_t Freq;
char Temp[4];
FILE *fp;

Timer FreqMsurT;
Timer FreqTimeOut;
Timer LogTimer;

Ticker CallFreqMsur;
Ticker CallReadDigitalin;
Ticker CallReadAnalogin;
Ticker CallDisplay;
Ticker CallInputCheck;
Ticker CallBinaryCounter;
Ticker CallLogFile;


void Init_LCD();
void FreqMsur();
void ReadDigitalin();
void ReadAnalogin();
void Display();
void InputCheck();
void BinaryCounter();
void InitFile();
void LogFile();

/********************************************************************************
                            Functions
###############################################################################*/
void Write_LCD(const char STR[],int8_t PY,int8_t PX,bool clr){
    if(clr)
        LCD.cls();
    LCD.locate(PY,PX);
    LCD.printf(STR);
}
/***************************************************************************/
void Init_LCD(){
    Port.write_bit(1,BL_BIT); 
    Write_LCD("Muaiyd",0,4,1);
    Write_LCD("Heriot-Watt Uni.",1,0,0);
    wait(1.5);
    Write_LCD("F=",0,0,1);
    Write_LCD("A1=",1,0,0);
    Write_LCD("A2=",1,7,0);
    Write_LCD("S1=",0,7,0);
    Write_LCD("S2=",0,12,0);
    Write_LCD("E",1,14,0);
    LogTimer.start();
}

/***************************************************************************************
Measure the frequency of a 3.3v square wave signal once every second. The frequency range
is 500Hz to 1000Hz with 50% duty cycle). 
*****************************************************************************************/

void FreqMsur(){
    FreqTimeOut.start();
    while(!FrequencyIn){
          if (FreqTimeOut.read_ms() > 50)
               break;
    }
    while(FrequencyIn){
          if (FreqTimeOut.read_ms() > 50)
               break;
    }
    if (FreqTimeOut.read_ms() > 50)
        FreqTimeOutE=0;
        
    if(FreqTimeOutE){
        FreqMsurT.start();
        while(!FrequencyIn){
        }
        while(FrequencyIn){
        }    
        FreqMsurT.stop();
        float Period=FreqMsurT.read_us();
        Freq=1/Period*1000000.0;  //Adding 0.5 to round the frequency to nearst int
    }
    else{
        Freq=0xffff; 
    }                
    FreqMsurT.reset();
    FreqTimeOut.stop();
    FreqTimeOut.reset();
    FreqTimeOutE=1;

}

//Read TWO digital inputs every 400mS (switch_1 and switch_2) 
void ReadDigitalin(){
    Swch1=Switch1;
    Swch2=Switch2;    
}
/*******************************************************************
Read TWO analogue inputs every 800mS (Analogue_in_1 at pin 19
and Analogue_in_2 at pin 20). Also, averaging the last 4 readings
********************************************************************/
void ReadAnalogin(){
        Analug1_valu[4]=0;
        Analug2_valu[4]=0;
        for(int i=0;i<3;i++){
            Analug1_valu[i]=Analug1_valu[i+1];
            Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[i]/4;
            Analug2_valu[i]=Analug2_valu[i+1];
            Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[i]/4;
        }
        Analug1_valu[3]=Analogue_in_1.read()*255;
        Analug2_valu[3]=Analogue_in_2.read()*255;
        Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[3]/4;
        Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[3]/4;  
}
/*************************************************************
Display the following on the LCD display every 2 seconds 
a. Frequency value (show as integer) 
b. analogue values (show as integers) 
c. digital values
d. Possible error code
**************************************************************/
void Display(){  
    Write_LCD("    ",0,2,0);  
    if( Freq<1200 && Freq>400){
        sprintf(Temp, "%d", Freq);
        Write_LCD(Temp,0,2,0);
    }
    else{
        Write_LCD("Err",0,2,0);
    }
    sprintf(Temp, "%d", Analug1_valu[4]);
    Write_LCD("   ",1,3,0);
    Write_LCD(Temp,1,3,0);
    sprintf(Temp, "%d", Analug2_valu[4]);
    Write_LCD("   ",1,10,0);
    Write_LCD(Temp,1,10,0);
    sprintf(Temp, "%d", Swch1);
    Write_LCD(Temp,0,10,0);
    sprintf(Temp, "%d", Swch2);
    Write_LCD(Temp,0,15,0);
    sprintf(Temp, "%d", Error_Code);
    Write_LCD(Temp,1,15,0);
}
//############################################################
void InputCheck(){
    if(Swch1&&(Analug1_valu[4]>Analug2_valu[4])){
        Error_Code=3;
    }
    else{
        Error_Code=0;
    }
    if(Swch2){
        Ena_job6=1;
    }
    else{
        Ena_job6=0;
    }        
}

void BinaryCounter(){
     if(Ena_job6){
         BinLed=Bin;
         Bin++;    
     }
     else{
         BinLed=0x00;
         Bin=0x00;
    }         
}
/***************************************************************

*****************************************************************/
void InitFile(){
    fp = fopen( "/sd/LogDir/LogHistory.txt" , "a");
    if(fp == NULL) {
        error("Could not open file for write\n");
    } 
    fprintf(fp,"%s","**************************************************************\r\n");
    fprintf(fp,"%s","Time Freq    Sw1   Sw2    An1    An2 ;\r\n");
    fprintf(fp,"%s","**************************************************************\r\n");
    fclose(fp);  
}
/**************************************************************

***************************************************************/
void LogFile(){
    char* Frq; 
    fp = fopen("/sd/LogDir/sdtest.txt", "a");  
    if( Freq<1200 && Freq>400){
        sprintf(Temp, "%d", Freq); 
        Frq = Temp;
    }
    else 
        Frq="Err";
  
    fprintf(fp,"%d ,",(LogTimer.read_ms()/1000));
    fprintf(fp,"  %s  ,",Frq);
    fprintf(fp,"  %i  ,",Swch1);
    fprintf(fp,"  %i  ,",Swch2);
    fprintf(fp,"  %d%3  ,",Analug1_valu[4]);
    fprintf(fp,"  %d%3 ",Analug2_valu[4]);
    fprintf(fp," %s","\r\n");
    fclose(fp); 
    printf("Goodbye World!\n");    
}