Dependencies:   mbed qnode2 MFRC522-2 eeprom Buffer2

main.cpp

Committer:
alejo5214416
Date:
2019-05-24
Revision:
11:da25ed58aab0
Parent:
10:90a9aa4482e8

File content as of revision 11:da25ed58aab0:

#include "mbed.h"
#include "MFRC522.h"
#include "qnode.h"
#include "Buffer.h"
#include "eeprom.h"
#define eepr_addr 0x50
#define max_size 300
uint16_t const count_address=0x0000;

I2C i2c(p28,p27);
DigitalOut led4(LED4);
DigitalOut led3(LED3);
DigitalOut led1(LED1);
DigitalOut enable(p19);
Serial pc(USBTX, USBRX);
Serial disp_uno(p9, p10);  // tx, rx
MFRC522    RfChip   (p5, p6, p7, p8, p21);
circular_buf_t buf; // ---->BUFFER CIRCULAR buf
InterruptIn event(p16);
InterruptIn reset(p15,PullDown);
bool flag1=false;
bool flag2=false;
bool flag3=false;
bool flag4=false;
volatile bool buf1ready=false;
volatile bool buf2ready=false;


typedef union reg{
    uint8_t     uid_reg[4];
    uint32_t    clave;
    }reg;
    
    reg dtb[max_size];
    
void insertionSort(reg *regs, uint8_t count);
void interrupcion();
void disp_unoTx_isr();
void disp_unoRx_isr();
void flush_memory();

int main()
{
    uint16_t adr=0x0001;    
    freq(400000);
    event.rise(&interrupcion);
    reset.rise(&flush_memory);
    disp_uno.attach(&disp_unoRx_isr,Serial::RxIrq);
    disp_uno.attach(&disp_unoTx_isr,Serial::TxIrq);
    struct Queue *q = createQueue();
    buf.size = 5;
    buf.buffer = (uint8_t*) malloc(buf.size);
    enable=0;
    RfChip.PCD_Init();
    //count = 0x0001; //-------->>>>>>para iniciar el conteo en 0 de la memoria de cantidad de uid registrados
    //write_data(eepr_addr, count_address,&count);//---->>>
    uint8_t count = data_read(eepr_addr, count_address);
    uint16_t uid=0x00;
    if (count>0) {
        //uint16_t array[count];
        pc.printf("\n%x UID's registrados en memoria\n",count);
        for(uid=0x00; uid<count; uid++) {
            //array[uid]=0;
            for(uint8_t byte_uid=0; byte_uid<4; byte_uid++) {
                //printf("Suma %x",array[uid]);
                printf("%02X",data_read(eepr_addr, (uid*4)+byte_uid+0x01));
                //array[uid] = array[uid]+ data_read(eepr_addr, (uint16_t(uid*4)+uint16_t(byte_uid)+0x0001));
                dtb[uid].uid_reg[byte_uid] = data_read(eepr_addr,(uid*4)+byte_uid+0x01);   
            }
            //insertionSort(&dtb[0], count);
            printf("\n");
            //printf("Posicion del arreglo:%d  valor:%03X",uid+1,array[uid]);
        }

        
        pc.printf("\nValores Ordenados ");
        insertionSort(&dtb[0], count);
        for(uint8_t d=0x00; d<count; d++) {
            for(int i=0;i<4;i++){
                pc.printf("%02X",dtb[d].uid_reg[i]);
            }
            pc.printf("\n");
        }

        /*
        pc.printf("\nValores Ordenados ");
        insertionSort(dtb, count);
        for(uint8_t d=0x00; d<count; d++) {
            pc.printf("%03X ",dtb[d]);
        }
        */
    }
    else{
        pc.printf("%x UID's registrados en memoria\n",count);
        }
    adr = (4*uint16_t(count)+1);//--->>Crear posicion de escritura actual
    
    while(1) {
        while(flag4==true) {
            if(!RfChip.PICC_IsNewCardPresent())
                continue;
            if (!RfChip.PICC_ReadCardSerial())
                continue;
            pc.printf("Tarjeta Numero: ");
            uint8_t *c = &RfChip.uid.uidByte[0];
            //enQueue(q,c);
            //count = data_read(eepr_addr, count_address);
            write_data(eepr_addr, adr,c);//---->>>guardar UID en memoria
            for(int j=0; j<4; j++) {
                uint8_t car = data_read(eepr_addr, (adr+j));
                pc.printf("%02X",car);
            }
            pc.printf("\n");
            count++;//------>>>>sumar 1 al contador de UID's
            adr = (4*uint16_t(count)+1);//--->>actualizar posicion de escritura
            write_data(eepr_addr, count_address,&count);///---->>actualizar en memoria el contador
            pc.printf("\n");
            flag4=false;
        }
    }
}


void flush_memory()
{
    led4=1;
    uint8_t data = 0x00;
    for(uint16_t k=0x0000; k<0x003f; k++) {
        write_data(eepr_addr,k,&data);
    }
    int j=0;
    while(j<1) {
        for(uint16_t i=0x0000; i<0x003f; i++) {
            uint8_t count = data_read(eepr_addr, i);
            pc.printf("Posicion de memoria:%d   dato:%02X\n",i,count);

        }
        j++;
    }
    printf("Memoria borrada\n");
    led4=0;
}





void interrupcion()
{

    flag4=true;
}

void disp_unoTx_isr()
{
    enable=0;
}

void disp_unoRx_isr()
{
    uint8_t b = disp_uno.getc();

    if(b!=NULL) {
        circular_buf_put(&buf, b);
    } else {
        uint8_t a;
        circular_buf_get(&buf,&a);
        if(a=='1') {
            circular_buf_get(&buf,&a);
            if(a=='S') {
                flag1=true;
            } else if(a=='Y') {
                flag2=true;
            } else if(a=='N') {
                flag3=true;
            }
        } else
            circular_buf_reset(&buf);

    }

}



void insertionSort(reg *regs, uint8_t count)
{
    uint32_t i, key;
    int j;
    for (i = 1; i < count; i++) {
        key = regs[i].clave;
        j = i-1;

        /* Move elements of arr[0..i-1], that are
            greater than key, to one position ahead
            of their current position */
        while ((j>=0) && (regs[j].clave> key)) {
            regs[j+1].clave = regs[j].clave;
            j = j-1;
        }
        regs[j+1].clave = key;
    }
}