Exemplo n.º 1
0
void build_packet(const char** parameters)
{
  char* data = buffers[OPERATIONAL_BUFFER].data;
  // Fill D-PRS header
  memcpy(data, "$$CRCxxxx,", DPRS_SIGN_LENGTH);
  data += DPRS_SIGN_LENGTH;
  // Fill TNC-2 header
  data += build_aprs_call(data);
  memcpy(data, ">APD4XX,DSTAR*:", 15);
  data[5] = (software_version[1] % 10) + '0';
  data[6] = (software_version[2] % 24) + 'A';
  data += 15;
  // Fill APRS payload
  data += build_position_report(data, parameters);
  // Fill D-PRS/APRS-IS terminator and Slow Data filler
  memcpy(data, "\r\n", 2);
  data += 2;
  memset(data, 0x66, 5);
  // Update buffer attributes
  int length = data - buffers[OPERATIONAL_BUFFER].data;
  buffers[OPERATIONAL_BUFFER].length = length;
  buffers[OPERATIONAL_BUFFER].version ++;
  // Update CRC in D-PRS header
  data = buffers[OPERATIONAL_BUFFER].data;
  length -= TNC2_POSITION + 1; // Length from TNC-2 header to CR
  uint16_t sum = rx_dstar_crc_data(data + TNC2_POSITION, length);
  vdisp_i2s(data + CRC_POSITION, 4, 16, 1, sum);
  data[DPRS_SIGN_LENGTH - 1] = ',';
}
Exemplo n.º 2
0
void aprs_send_user_report(uint8_t * gps_a_data, uint16_t gps_a_len)
{
	uint16_t udp_payload_size = 0;
	
	uint8_t aprs_call[8];
	uint8_t aprs_call_size = build_aprs_call((char *) aprs_call);
	
	// gruener Bereich (APRS-IS-Header)
	udp_payload_size += 5 + aprs_call_size + 6 + 5 + 26;
	
	// TNC2-Payload
	udp_payload_size += gps_a_len;

	uint8_t  ipv4_aprs_addr[4];
	if (dns_cache_aprs(ipv4_aprs_addr) != 0)
	{
		return;  // DNS not in cache... try next time
	}
	
	eth_txmem_t * packet = udp4_get_packet_mem(udp_payload_size, aprs_local_port, APRS_SEND_ONLY_PORT, ipv4_aprs_addr);
	
	uint8_t* p = packet->data + 42;
				
	memcpy(p, "user ", 5);
	p += 5;
		
	memcpy(p, aprs_call, aprs_call_size);	//build_aprs_call(data);
	p += aprs_call_size;
		
	memcpy(p, " pass ", 6);
	p += 6;
		
	calculate_aprs_password((char *) p);
	p += 5;
		
	memcpy(p, " vers UP4DAR " SWVER_STRING " \r\n", 16 + strlen(SWVER_STRING));
	p += 16 + strlen(SWVER_STRING);
		
	memcpy(p, gps_a_data, gps_a_len);
		
	/*
	// ==============================================================================
	memcpy(p, "DL3OCK-7", 8);
	p += 8;
		
	memcpy(p, ">API282,WIDE1-1,DSTAR*,qAR,DL2MRB-B:", 36);
	p += 36;
		
	// HHMMSSh = Zulu time
	memcpy(p, "/163400h4803.70N/01137.36E>027/000/Denis", 40);
	p += 40;
	// ==============================================================================
	
	*/
	
	udp4_calc_chksum_and_send(packet, ipv4_aprs_addr);
}
Exemplo n.º 3
0
void aprs_send_beacon(void)
{
	uint16_t udp_payload_size = 0;
	
	uint8_t aprs_call[8];
	uint8_t aprs_call_size = build_aprs_call((char *)aprs_call);
	
	// gruener Bereich (APRS-IS-Header)
	udp_payload_size += 5 + aprs_call_size + 6 + 5 + 26;
	
	// TCP2-Payload
	udp_payload_size += aprs_call_size + 22 + 6 + 32 + 9;
	
	uint8_t ipv4_aprs_addr[4];
	if (dns_cache_aprs(ipv4_aprs_addr) != 0)
	{
		return;  // DNS not in cache... try next time
	}
	
	eth_txmem_t * packet = udp4_get_packet_mem(udp_payload_size, aprs_local_port, APRS_SEND_ONLY_PORT, ipv4_aprs_addr);
	
	//memcpy(packet->data + 42, data, udp_payload_size*sizeof(uint8_t));
	uint8_t* p = packet->data + 42;
		
	memcpy(p, "user ", 5);
	p += 5;
		
	memcpy(p, aprs_call, aprs_call_size);	//build_aprs_call(data);
	p += aprs_call_size;
		
	memcpy(p, " pass ", 6);
	p += 6;
		
	calculate_aprs_password((char *) p);
	p += 5;
		
	memcpy(p, " vers UP4DAR " SWVER_STRING " \r\n", 16 + strlen(SWVER_STRING));
	p += 16 + strlen(SWVER_STRING);
		
	memcpy(p, aprs_call, aprs_call_size);	//build_aprs_call(data);
	p += aprs_call_size;
		
	//memcpy(p, ">APD401,TCPIP*:", 15);
	//p += 15;
		
	memcpy(p, ">APD401,qAR,DL2MRB-B:/", 22);
	p += 22;
		
	// HHMMSS = Zulu time
	rtclock_get_time((char *) p);
	p += 6;
		
	memcpy(p, "h4803.63ND01137.34E&UP4DAR based", 32);
	p += 32;
		
	if (hotspot_mode)
	{
		memcpy(p, " Hotspot ", 9);
		p += 9;
	}
	else if (repeater_mode)
	{
		memcpy(p, " Repeater", 9);
		p += 9;
	}
		
	udp4_calc_chksum_and_send(packet, ipv4_aprs_addr);
}