static void set_speaker_volume (int up) { int new_volume = SETTING_CHAR(C_SPKR_VOLUME) + ( up ? 1 : -1 ); if ((new_volume <= 6) && (new_volume >= -57)) { SETTING_CHAR(C_SPKR_VOLUME) = new_volume; char buf[4]; if (new_volume < 0) { new_volume = -new_volume; buf[0] = '-'; } else { buf[0] = '+'; } lcd_show_menu_layer(help_layer); help_layer_timer = 0; // display permanent vd_clear_rect(help_layer, 0, 12, 146, 43); vdisp_i2s(buf + 1, 2, 10, 1, new_volume); vd_prints_xy(help_layer, 30, 30, VDISP_FONT_6x8, 0, "Volume"); vd_prints_xy(help_layer, 70, 30, VDISP_FONT_6x8, 0, buf); lcd_show_help_layer(help_layer); help_layer_timer = 3; // approx 2 seconds } }
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] = ','; }
size_t build_altitude_extension(char* buffer) { if ((altitude != UNDEFINED_ALTITUDE) && (validity2 > the_clock)) { if (altitude >= 0) { memcpy(buffer, "/A=", 3); vdisp_i2s(buffer + 3, 6, 10, 1, (unsigned int) altitude); } else { memcpy(buffer, "/A=-", 4); vdisp_i2s(buffer + 4, 5, 10, 1, (unsigned int) - altitude); } return 9; } return 0; }
void rtclock_disp_xy(int x, int y, int dots, int display_seconds) { unsigned int m = the_clock / 60; unsigned int minutes = m % 60; unsigned int h = m / 60; unsigned int hours = h % 24; char buf[3]; vdisp_i2s(buf, 2, 10, 1, hours); vdisp_prints_xy(x, y, VDISP_FONT_6x8, 0, buf); vdisp_set_pixel(x + 12, y + 0, 0, 0, 4); vdisp_set_pixel(x + 12, y + 1, 0, dots, 4); vdisp_set_pixel(x + 12, y + 2, 0, 0, 4); vdisp_set_pixel(x + 12, y + 3, 0, 0, 4); vdisp_set_pixel(x + 12, y + 4, 0, 0, 4); vdisp_set_pixel(x + 12, y + 5, 0, dots, 4); vdisp_set_pixel(x + 12, y + 6, 0, 0, 4); vdisp_set_pixel(x + 12, y + 7, 0, 0, 4); vdisp_i2s(buf, 2, 10, 1, minutes); vdisp_prints_xy(x + 16, y, VDISP_FONT_6x8, 0, buf); if (display_seconds != 0) { vdisp_set_pixel(x + 28, y + 0, 0, 0, 4); vdisp_set_pixel(x + 28, y + 1, 0, dots, 4); vdisp_set_pixel(x + 28, y + 2, 0, 0, 4); vdisp_set_pixel(x + 28, y + 3, 0, 0, 4); vdisp_set_pixel(x + 28, y + 4, 0, 0, 4); vdisp_set_pixel(x + 28, y + 5, 0, dots, 4); vdisp_set_pixel(x + 28, y + 6, 0, 0, 4); vdisp_set_pixel(x + 28, y + 7, 0, 0, 4); unsigned int seconds = the_clock % 60; vdisp_i2s(buf, 2, 10, 1, seconds); vdisp_prints_xy(x + 32, y, VDISP_FONT_6x8, 0, buf); } }
void calculate_aprs_password(char* password) { uint8_t hash[] = { 0x73, 0xe2 }; for (size_t index = 0; (index < CALLSIGN_LENGTH) && (settings.s.my_callsign[index] > ' '); index ++) hash[index & 1] ^= settings.s.my_callsign[index]; uint16_t code = ((hash[0] << 8) | hash[1]) & 0x7fff; vdisp_i2s(password, 5, 10, 1, code); /* // Patch to the original Routine of DL1BFF // in order TO HAVE leading zeros! for (int i=0; (i<5) && (password[i] == 0x20); ++i) { password[i] = '0'; } */ }
static void vServiceTask( void *pvParameters ) { int last_backlight = -1; int last_contrast = -1; char last_repeater_mode = 0; char last_parrot_mode = 0; char dcs_boot_timer = 8; // bool update = true; bool last_rmu_enabled = false; for (;;) { vTaskDelay(500); // gpio_toggle_pin(AVR32_PIN_PB28); //gpio_toggle_pin(AVR32_PIN_PB18); // x_counter ++; // rtclock_disp_xy(84, 0, x_counter & 0x02, 1); rtclock_disp_xy(84, 0, 2, 1); vdisp_i2s( tmp_buf, 5, 10, 0, voltage); tmp_buf[3] = tmp_buf[2]; tmp_buf[2] = '.'; tmp_buf[4] = 'V'; tmp_buf[5] = 0; vdisp_prints_xy( 55, 0, VDISP_FONT_4x6, 0, tmp_buf ); // vdisp_i2s( tmp_buf, 5, 10, 0, serial_rx_error ); // vd_prints_xy(VDISP_DEBUG_LAYER, 108, 28, VDISP_FONT_4x6, 0, tmp_buf ); vdisp_i2s( tmp_buf, 5, 10, 0, serial_rx_ok ); vd_prints_xy(VDISP_DEBUG_LAYER, 108, 34, VDISP_FONT_4x6, 0, tmp_buf ); // vdisp_i2s( tmp_buf, 5, 10, 0, serial_timeout_error ); vdisp_i2s( tmp_buf, 5, 10, 0, dstar_pos_not_correct ); vd_prints_xy(VDISP_DEBUG_LAYER, 108, 40, VDISP_FONT_4x6, 0, tmp_buf ); vdisp_i2s( tmp_buf, 5, 10, 0, serial_putc_q_full ); vd_prints_xy(VDISP_DEBUG_LAYER, 108, 46, VDISP_FONT_4x6, 0, tmp_buf ); vdisp_i2s( tmp_buf, 5, 10, 0, initialHeapSize ); vd_prints_xy(VDISP_DEBUG_LAYER, 108, 52, VDISP_FONT_4x6, 0, tmp_buf ); vdisp_i2s( tmp_buf, 5, 10, 0, xPortGetFreeHeapSize() ); vd_prints_xy(VDISP_DEBUG_LAYER, 108, 58, VDISP_FONT_4x6, 0, tmp_buf ); int v = 0; switch (eth_autoneg_state) { case 0: if (SETTING_BOOL(B_ONLY_TEN_MBIT)) { AVR32_MACB.man = 0x50920061; // write register 0x04, advertise only 10MBit/s for autoneg } eth_autoneg_state = 1; break; case 1: AVR32_MACB.man = 0x50821200; // write register 0x00, power on, autoneg, restart autoneg eth_autoneg_state = 2; break; case 2: AVR32_MACB.man = 0x60C20000; // read register 0x10 eth_autoneg_state = 3; break; case 3: v = AVR32_MACB.MAN.data; // read data from previously read register 0x10 AVR32_MACB.man = 0x60C20000; // read register 0x10 break; } dvset(); nodeinfo_print(); if (last_rmu_enabled != rmu_enabled) { rmuset_print(); last_rmu_enabled = rmu_enabled; } const char * net_status = " "; dhcp_set_link_state( v & 1 ); if (v & 1) // Ethernet link is active { v = ((v >> 1) & 0x03) ^ 0x01; switch (v) { case 0: net_status = " 10HD"; break; case 1: net_status = "100HD"; break; case 2: net_status = " 10FD"; break; case 3: net_status = "100FD"; break; } AVR32_MACB.ncfgr = 0x00000800 | v; // SPD, FD, CLK = MCK / 32 -> 1.875 MHz vdisp_prints_xy( 28, 0, VDISP_FONT_4x6, (dhcp_is_ready() != 0) ? 0 : 1, net_status ); } else {
static void recv_gpgsv(int num_sats) { int total = get_nmea_num(1); int msgnum = get_nmea_num(2); if (msgnum == 1) // first msg { gps_init_satlist(); // clear list } int j; int i; for (i=0; i < num_sats; i++) { int s_ptr = i + ((msgnum - 1) << 2); if (s_ptr < MAX_SATELLITES) { if ( (*(nmea_params[ 4 + i * 4 ])) == 0) // empty parameter { sats[s_ptr].sat_id = NO_SAT; } else { sats[s_ptr].sat_id = get_nmea_num( 4 + i * 4 ); sats[s_ptr].elevation = get_nmea_num( 5 + i * 4 ); sats[s_ptr].azimuth = get_nmea_num( 6 + i * 4 ); sats[s_ptr].snr = get_nmea_num( 7 + i * 4 ); } } } if (msgnum == total) // last record, print it { vd_clear_rect (VDISP_GPS_LAYER, 0, 0, 128, 64); if (gps_fix >= 2) { buf[0] = 0x30 + gps_fix; buf[1] = 0; vd_prints_xy(VDISP_GPS_LAYER, 62, 46, VDISP_FONT_4x6, 0, buf); vd_prints_xy(VDISP_GPS_LAYER, 66, 46, VDISP_FONT_4x6, 0, "D FIX"); } else { vd_prints_xy(VDISP_GPS_LAYER, 62, 46, VDISP_FONT_4x6, 0, "NO FIX"); } /* if (gpgga_fix_info > 0) { buf[0] = 0x30 + gpgga_fix_info; buf[1] = 0; vd_prints_xy(VDISP_GPS_LAYER, 0, 56, VDISP_FONT_6x8, 0, buf); } else { vd_prints_xy(VDISP_GPS_LAYER, 0, 56, VDISP_FONT_6x8, 0, "-"); } if (gprmc_fix_mode > 0) { buf[0] = gprmc_fix_mode; buf[1] = 0; vd_prints_xy(VDISP_GPS_LAYER, 6, 0, VDISP_FONT_6x8, 0, buf); } else { vd_prints_xy(VDISP_GPS_LAYER, 6, 0, VDISP_FONT_6x8, 0, "-"); } if (gprmc_status > 0) { buf[0] = gprmc_status; buf[1] = 0; vd_prints_xy(VDISP_GPS_LAYER, 12, 0, VDISP_FONT_6x8, 0, buf); } else { vd_prints_xy(VDISP_GPS_LAYER, 12, 0, VDISP_FONT_6x8, 0, "-"); } */ /* for (i=0; i < 360; i+= 45) { vd_set_pixel(VDISP_GPS_LAYER, 32 + (fixpoint_sin(i) / 700), 32 + (fixpoint_cos(i) / 700), 0, 1, 1); } */ for (i=0; i < 360; i+= 10) { vd_set_pixel(VDISP_GPS_LAYER, 32 + (fixpoint_sin(i) / 357), 32 + (fixpoint_cos(i) / 357), 0, 1, 1); } vd_prints_xy(VDISP_GPS_LAYER, 0, 28, VDISP_FONT_6x8, 0, "W"); vd_prints_xy(VDISP_GPS_LAYER, 58, 28, VDISP_FONT_6x8, 0, "E"); vd_prints_xy(VDISP_GPS_LAYER, 29, 0, VDISP_FONT_6x8, 0, "N"); vd_prints_xy(VDISP_GPS_LAYER, 29, 56, VDISP_FONT_6x8, 0, "S"); for (i=0; i < MAX_SATELLITES; i++) { if (sats[i].sat_id != NO_SAT) { int x = 120 - (i % 6) * 10; int y = (i / 6) * 21; int used_in_fix = 0; for (j=0; j < GPGSA_NUM_DATA; j++) { if (sats[i].sat_id == gpgsa_data[j]) { used_in_fix = 1; } } if (sats[i].elevation > 0) { int xx = 28 + fixpoint_cos(sats[i].elevation) * fixpoint_sin(sats[i].azimuth) / 3570000; int yy = 29 - fixpoint_cos(sats[i].elevation) * fixpoint_cos(sats[i].azimuth) / 3570000; vdisp_i2s(buf, 2, 10, 1, sats[i].sat_id); vd_prints_xy(VDISP_GPS_LAYER, xx, yy+1, VDISP_FONT_4x6, used_in_fix, buf); for (j=0; j < 8; j++) { vd_set_pixel(VDISP_GPS_LAYER, xx + j, yy, 0, used_in_fix, 1); } for (j=0; j < 7; j++) { vd_set_pixel(VDISP_GPS_LAYER, xx + 8, yy + j, 0, used_in_fix, 1); } } vdisp_i2s(buf, 2, 10, 1, sats[i].sat_id); vd_prints_xy(VDISP_GPS_LAYER, x, y + 14, VDISP_FONT_4x6, 0, buf); int v = fixpoint_sin(sats[i].snr) / 833; vd_set_pixel(VDISP_GPS_LAYER, x+1, y + 12, 0, 0x7F, 7); for (j=1; j < v; j++) { vd_set_pixel(VDISP_GPS_LAYER, x+1, y + 12 - j, 0, used_in_fix ? 0x7F : 0x41 , 7); } vd_set_pixel(VDISP_GPS_LAYER, x+1, y + 12 - v, 0, 0x7F, 7); /* vdisp_i2s(buf, 3, 10, 1, sats[i].sat_id); vd_prints_xy(VDISP_GPS_LAYER, x + 0, y, VDISP_FONT_4x6, used_in_fix, buf); vdisp_i2s(buf, 2, 10, 1, sats[i].elevation); vd_prints_xy(VDISP_GPS_LAYER, x + 16, y, VDISP_FONT_4x6, 0, buf); vdisp_i2s(buf, 3, 10, 1, sats[i].azimuth); vd_prints_xy(VDISP_GPS_LAYER, x + 28, y, VDISP_FONT_4x6, 0, buf); vdisp_i2s(buf, 2, 10, 1, sats[i].snr); vd_prints_xy(VDISP_GPS_LAYER, x + 44, y, VDISP_FONT_4x6, 0, buf); */ } } } for (i=0; i < 2; i++) { vd_prints_xy(VDISP_GPS_LAYER, 56, 52 + (i*6), VDISP_FONT_4x6, 0, fix_data[i]); } /* vdisp_i2s(buf, 2, 10, 1, get_nmea_num(1)); vd_prints_xy(VDISP_GPS_LAYER, 0, 58, VDISP_FONT_4x6, 0, buf); vdisp_i2s(buf, 2, 10, 1, get_nmea_num(2)); vd_prints_xy(VDISP_GPS_LAYER, 12, 58, VDISP_FONT_4x6, 0, buf); vdisp_i2s(buf, 2, 10, 1, get_nmea_num(3)); vd_prints_xy(VDISP_GPS_LAYER, 24, 58, VDISP_FONT_4x6, 0, buf); */ }
void slowdata_analyze_stream(void) { while (slowDataFIFOoutPtr != slowDataFIFOinPtr) { char d = (char) slowDataFIFO[slowDataFIFOoutPtr]; slowDataFIFOoutPtr++; if (slowDataFIFOoutPtr >= SLOWDATA_FIFO_BYTES) { slowDataFIFOoutPtr = 0; } switch (slowDataGPSA_state) { case 0: if (d == '$') { slowDataGPSA_state = 1; } break; case 1: if (d == '$') { slowDataGPSA_state = 2; } else { slowDataGPSA_state = 0; } break; case 2: if (d == 'C') { slowDataGPSA_state = 3; } else { slowDataGPSA_state = 0; } break; case 3: if (d == 'R') { slowDataGPSA_state = 4; } else { slowDataGPSA_state = 0; } break; case 4: if (d == 'C') { slowDataGPSA_state = 5; } else { slowDataGPSA_state = 0; } break; case 5: if (d > ' ') { slowDataGPSA_state = 6; crc[0] = d; } else { slowDataGPSA_state = 0; } break; case 6: if (d > ' ') { slowDataGPSA_state = 7; crc[1] = d; } else { slowDataGPSA_state = 0; } break; case 7: if (d > ' ') { slowDataGPSA_state = 8; crc[2] = d; } else { slowDataGPSA_state = 0; } break; case 8: if (d > ' ') { slowDataGPSA_state = 9; crc[3] = d; } else { slowDataGPSA_state = 0; } break; case 9: if (d == ',') { slowDataGPSA_state = 10; slowDataGPSA_ptr = 0; } else { slowDataGPSA_state = 0; } break; case 10: if (d >= ' ') // printable character { if (slowDataGPSA_ptr >= SLOWDATA_GPSA_BUFLEN) // buffer full, line too long { slowDataGPSA_state = 0; } else { slowDataGPSA[slowDataGPSA_ptr] = d; slowDataGPSA_ptr ++; } } else // everything else including CR { slowDataGPSA_state = 0; if (slowDataGPSA_ptr < SLOWDATA_GPSA_BUFLEN) // buffer not full { slowDataGPSA[slowDataGPSA_ptr] = d; // put last character at the end slowDataGPSA_ptr ++; // crc[4] = 0; // vd_prints_xy(VDISP_NODEINFO_LAYER, 80, 16, VDISP_FONT_6x8, 0, crc); unsigned short sum = rx_dstar_crc_data((unsigned char *) slowDataGPSA, slowDataGPSA_ptr); char buf[5]; vdisp_i2s(buf, 4, 16, 1, sum); // buf[4] = 0; // vd_prints_xy(VDISP_NODEINFO_LAYER, 80, 24, VDISP_FONT_6x8, 0, buf); if (memcmp(crc, buf, 4) == 0) { aprs_send_user_report((unsigned char *) slowDataGPSA, slowDataGPSA_ptr -1); // send GPS-A data without trailing CR } } } break; } // switch } // while }