Koncentrator

Dependencies:   SX127x mbed-rtos mbed

comm.cpp

Committer:
MrSteel
Date:
2015-06-03
Revision:
0:dd55179403eb

File content as of revision 0:dd55179403eb:

#include "mbed.h"
#include "stdlib.h"
#include "rtos.h"
#include "sx127x_lora.h"
#include "comm.h"
#include "fun.h"
#include "application.h"

queueStruct queue[5];
uartBufferStructure pcBuffer;
uartBufferStructure fiberOpticBuffer;
uartBufferStructure loraBuffer;

Mutex pc_mutex;                 // Mutex for RTOS system - USB serial port
Mutex fiberOptic_mutex;         // Mutex for RTOS system - Fiber optic port
Mutex lora_mutex;

Timer txFiberOpticTmr;
Timer rxFiberOpticTmr;
Timer pcTmr;

void pc_thread(void const *argument) {
    pcBuffer.buf = (unsigned char *)malloc(sizeof(char)*PC_RX_BUFFER);
    pc.baud(PC_BAUD);
    pc.attach(&pc_handle); 
    pc_mutex.lock();
    pc.printf("\n#: Application %s \n#: Source ID: %d \n#: Destination ID: %d \n#: PC thread Started with BAUD(%d)", APP,SOURCE_ID,DESTINATION_ID,PC_BAUD);
    pc_mutex.unlock();   
    while(true){ 
        wait_ms(1);
    }
}

void lora_thread(void const *argument){
    Timer txLoraTmr;

    // Initialize lora
    kom.init();
    Lora.enable();
    Lora.setSf(8);
    Lora.setBw(250);
    
    kom.set_frf_MHz(868); 
    Lora.start_rx(); 
     
    pc_mutex.lock();
    pc.printf("\n#: LoRa thread started");
    pc_mutex.unlock();
    loraBuffer.buf = (unsigned char *)malloc(sizeof(char)*LORA_RX_BUFFER); 
    
    txLoraTmr.stop();    
    txLoraTmr.reset();    
    txLoraTmr.start();
    
    int step = 0;
    while(true){ 
        // PING rutine   
        
        if(txLoraTmr.read_ms()>=500 && step==0) {  
            unsigned char tmpStr[] = {pSTX, sys.last_ppe_id[0], 0, SOURCE_ID, 0, 1, 0, 1, pBEL, pETX};            
            //lora_mutex.lock();  
            printStr(LORA_TARGET,tmpStr,sizeof(tmpStr));
            //lora_mutex.unlock();                        
            sys.last_ppe_id[0] = sys.last_ppe_id[0] + 1;   
            txLoraTmr.reset();           
            step++;
            
            pc_mutex.lock();
            pc.printf("\n<:");            
            pc_mutex.unlock();
            TX_LED = SetLed;
        }
        if(txLoraTmr.read_ms()>=500 && step==1) { 
            unsigned char tmpStr[] = {pSTX, sys.last_ppe_id[1], 0, SOURCE_ID, 0, 2, 0, 1, pBEL, pETX};           
            //lora_mutex.lock();  
            printStr(LORA_TARGET,tmpStr,sizeof(tmpStr));  
            //lora_mutex.unlock();                                              
            sys.last_ppe_id[1] = sys.last_ppe_id[1] + 1;              
            txLoraTmr.reset();             
            step++;
            TX_LED = SetLed;          
        } 
        if(txLoraTmr.read_ms()>=500 && step==2) {      
            unsigned char tmpStr[] = {pSTX, sys.last_ppe_id[2], 0, SOURCE_ID, 0, 3, 0, 1, pBEL, pETX};           
            //lora_mutex.lock();  
            printStr(LORA_TARGET,tmpStr,sizeof(tmpStr));   
            //lora_mutex.unlock();                                             
            sys.last_ppe_id[2] = sys.last_ppe_id[2] + 1;              
            txLoraTmr.reset();             
            step=0;
            TX_LED = SetLed;             
        }        
        if(Lora.service() == SERVICE_READ_FIFO) {
            unsigned int pyloadSize = kom.read_reg(REG_LR_RXNBBYTES);
            float rssi = Lora.get_pkt_rssi();
            unsigned int i;       
            for(i=0;i<pyloadSize;i++){              
                loraBuffer.buf[i] = kom.rx_buf[i];
                loraBuffer.lenght = loraBuffer.lenght++;
            }  
            pc_mutex.lock();
            pc.printf("[%d,%2.1f]",loraBuffer.buf[3],rssi);
            pc_mutex.unlock();
        }     
        
    }
}

void fiberOptic_thread(void const *argument){
    OperationMode.mode(PullUp);   
    fiberOpticBuffer.buf = (unsigned char *)malloc(sizeof(char)*FIBER_OPTIC_RX_BUFFER); 
    fiberOptic.baud(FIBER_OPTIC_BAUD);
    fiberOptic.attach(&fiberOptic_handle);  
    if(!OperationMode.read()) { 
        pc_mutex.lock();
        pc.printf("\n#: Fiber Optic thread started with BAUD(%d)",FIBER_OPTIC_BAUD);
        pc_mutex.unlock();
        //FIBER_OPTIC_TX = 1;   
        sys.fiberOpticEnable = true;
        FIBER_OPTIC_TX_PWR = 0;
        FIBER_OPTIC_RX_PWR = 0;
        
        txFiberOpticTmr.start();     
          
        while(true) {        
            // PING rutine        
            if(txFiberOpticTmr.read()>FIBER_OPTIC_INTERVAL) {
                if(sys.last_ppe_id_fo==0)
                    sys.last_ppe_id_fo = 1;
                pc_mutex.lock();
                pc.printf("\n>: PPE_ID_FO: %d, NODE: 1", sys.last_ppe_id_fo);
                pc_mutex.unlock();     
                fiberOptic_mutex.lock();
                fiberOptic.printf("%c%c%c%c%c%c%c%c%c%c",pSTX,sys.last_ppe_id_fo,0,SOURCE_ID,0,1,0,1,pACK,pETX);
                fiberOptic_mutex.unlock();           
                sys.last_ppe_id_fo = sys.last_ppe_id_fo + 1;    
                txFiberOpticTmr.reset();
            }   
            if(fiberOpticBuffer.flg) {
                if(fiberOpticBuffer.lenght >= 5){
                    pc_mutex.lock();
                    pc.printf("\n>: Received shitty payload");
                    pc_mutex.unlock(); 
                    fiberOpticBuffer.flg = false;
                    fiberOpticBuffer.lenght = false;
                }
                if(fiberOpticBuffer.buf[0]==pSTX && fiberOpticBuffer.buf[fiberOpticBuffer.lenght-1]==pETX ) {
                    pc_mutex.lock();
                    pc.printf("\n>: Received shitty payload");
                    pc_mutex.unlock(); 
                    fiberOpticBuffer.flg = false;
                    fiberOpticBuffer.lenght = false;
                }
                
            }
        }
    }
    else {    
        sys.fiberOpticEnable = false;    
        pc_mutex.lock();
        pc.printf("\n#: Fiber Optic thread disabled!\n");
        pc_mutex.unlock();
        //FIBER_OPTIC_TX = 0; 
        FIBER_OPTIC_TX_PWR = 1;
        FIBER_OPTIC_RX_PWR = 1;
    }
}

void pc_handle(void) {
    //LEDG = SetLed;
    pc_mutex.lock();
    unsigned char c = pc.getc();  
    pc_mutex.unlock();
    sys.RXCharCounter[pc_com] = sys.RXCharCounter[pc_com]+1;
    if(pcBuffer.lenght < PC_RX_BUFFER) {
        pcBuffer.buf[pcBuffer.lenght]   = c;
        pcBuffer.lenght               = pcBuffer.lenght + 1;
        pcBuffer.flg                  = true;
    }
}

void fiberOptic_handle(void) {  
    //LEDB = SetLed;
    fiberOptic_mutex.lock();
    unsigned char c = fiberOptic.getc();  
    fiberOptic_mutex.unlock();    
                    
    if(fiberOpticBuffer.lenght < FIBER_OPTIC_RX_BUFFER) {
        fiberOpticBuffer.buf[fiberOpticBuffer.lenght] = c;
        fiberOpticBuffer.lenght               = fiberOpticBuffer.lenght + 1;
        fiberOpticBuffer.flg                  = true;
    }
}

void printBuffer(uartBufferStructure buffer) {
    if(buffer.flg) {
        unsigned int i;
        pc_mutex.lock();
        pc.printf("\n<: ");
        pc_mutex.unlock(); 
        for(i=0;i<buffer.lenght-1;i++){
            pc_mutex.lock();
            pc.printf("%02x ",buffer.buf[i]);
            pc_mutex.unlock();
        }
    }
       
}



void lora_rx_thread(void const *argument) {
    /*
    unsigned int i;
    while(true) {        
        lora_mutex.lock();        
        if(Lora.service() == SERVICE_READ_FIFO) {
        lora_mutex.unlock();  
         
            pc_mutex.lock();
            pc.printf(".");
            pc_mutex.unlock();  
            unsigned int pyloadSize = kom.read_reg(REG_LR_RXNBBYTES);
            float rssi = Lora.get_pkt_rssi();
            
            while(Lora.service() == SERVICE_READ_FIFO) { 
                loraBuffer.buf[i] = kom.rx_buf[i];
                loraBuffer.lenght = loraBuffer.lenght++;
            }
            
                pc_mutex.lock();
                pc.printf(".");
                pc_mutex.unlock();  
            while(Lora.service() == SERVICE_READ_FIFO) { 
                loraBuffer.buf[i] = kom.rx_buf[i];
                loraBuffer.lenght = loraBuffer.lenght++;
                pc_mutex.lock();
                pc.printf("Tukaj");
                pc_mutex.unlock();  
           // }
        }
    }
    */
}