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] = ','; }
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); }
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); }