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); } }
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); } }