示例#1
0
文件: a_lib.c 项目: rballis/up4dar-os
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
	}
}
示例#2
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] = ',';
}
示例#3
0
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;
}
示例#4
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);
	}
}
示例#5
0
文件: aprs.c 项目: dl1bff/up4dar-os
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';
  }
  */
}
示例#6
0
文件: main.c 项目: rballis/up4dar-os
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
		{
示例#7
0
文件: gps.c 项目: st0ne/up4dar-os
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);
	*/
}
示例#8
0
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
}