void cmdReadMemory(unsigned long addr, int lng, unsigned char * data){
    if(lng > data_size){
    handle_error(DATA_LEN_ERROR);
        return;
  } /* TODO: handler assert error */

    if(cmdGeneric(0x11)){
        mdebug(10, "*** ReadMemory command");
        unsigned char * addr_buffer = (unsigned char *) malloc(sizeof(unsigned char)*5);
        encode_addr(addr, addr_buffer); /* Get addr and crc buffer */
        uart_write(addr_buffer, 5);
        wait_for_ask();
        int n = (lng - 1) & 0xFF;
        unsigned char crc = n ^ 0xFF;
        unsigned char n_crc_buff[2];
        n_crc_buff[0] = n;
        n_crc_buff[1] = crc;
        uart_write(n_crc_buff, 2);
        wait_for_ask();
        /* read lng number of bytes */
        uart_reads(data, lng);
    }
    else{
        /* TODO: handle nack */
    handle_error(NACK_ERROR);
    }
}
void cmdGo(unsigned long addr){
    if(cmdGeneric(0x21)){
        mdebug(10, "*** Go command");
        unsigned char * addr_buffer = (unsigned char *) malloc(sizeof(unsigned char)*5);
        encode_addr(addr, addr_buffer); /* Get addr and crc buffer */
        uart_write(addr_buffer, 5);
        wait_for_ask();
    }
    else{
        /* TODO: handle nack */
    handle_error(NACK_ERROR);
    }
}
Exemple #3
0
void ax25_encode_header(FBUF* b, addr_t* from, 
                                 addr_t* to,
                                 addr_t digis[],
                                 uint8_t ndigis,
                                 uint8_t ctrl,
                                 uint8_t pid)
{
    register uint8_t i;
    if (ndigis > 7) ndigis = 0;
    encode_addr(b, to->callsign, to->ssid, 0);
    encode_addr(b, from->callsign, from->ssid, (ndigis == 0 ? FLAG_LAST : 0));       
    
    /* Digipeater field */
    for (i=0; i<ndigis; i++)
        encode_addr(b, digis[i].callsign, digis[i].ssid, 
            digis[i].flags | (i+1==ndigis ? FLAG_LAST : 0));

    
    fbuf_putChar(b, ctrl);           // CTRL field
    if ((ctrl & 0x01) == 0  ||       // PID (and data) field, only if I frame
         ctrl == FTYPE_UI)           // or UI frame
       fbuf_putChar(b, pid);        
}
void cmdWriteMemory(unsigned long addr, unsigned char *data, int len){
  
    if(len > data_size){ 
        handle_error(DATA_LEN_ERROR);
        return;
    }
    if(cmdGeneric(0x31)){
        //mdebug(10, "*** Write memory command");
        unsigned char * addr_buffer = (unsigned char *) malloc(sizeof(unsigned char)*5);
        encode_addr(addr, addr_buffer); /* Get addr and crc buffer */
        uart_write(addr_buffer, 5);
        wait_for_ask();
        int lng = len-1; //(strlen((char *)data)-1) & 0xFF;
        //mdebug(10, "    %s bytes to write"); /* TODO: debug ? */
        unsigned char length_data[1];
        length_data[0] = lng;
        uart_write(length_data, 1); /* len really */
        unsigned char crc[] = {lng};
        unsigned char c[1];
        for(int i = 0; i <= lng; i++){
            c[0] = data[i];
            crc[0] = crc[0] ^ c[0];
            //uart_write(c, 1);
        }
        uart_write(data, len);
        uart_write(crc, 1);
        
        //mdebug(0, "last ack");
        wait_for_ask();
        //mdebug(10, "    Write memory done");
    }
    else{
        /* TODO: handle nack */
    mdebug(0, "write cmd not accepted");
    handle_error(NACK_ERROR);
    }
}