void transmit_raw_buffer(int *data, int len) { int i; char sent[5]; snprintf(sent, 4, "%d: ", len); uart1_transmit_string(sent); for (i = 0; i < len; i++) { snprintf(sent, 4, "%03X ", data[i]); uart1_transmit_string(sent); } printf("\n"); }
/*************************************************************************** * 20 01 XX XX Speed through water: XXXX/10 Knots * Corresponding NMEA sentence: VHW */ int water_temperature(int *data, int len, int oformat) { char buf[PRINTF_BUFSIZE+1]; if (len != (data[1] & 0x3) + 3) return 1; if (oformat == FORMAT_NMEA) { return 0; } if (oformat == FORMAT_JSON) { return 0; } if (oformat == FORMAT_HUMAN) { snprintf(buf, PRINTF_BUFSIZE, "Water temperature: %d C %d F\n", data[2], data[3]); uart1_transmit_string(buf); return 0; } }
/*************************************************************************** * 20 01 XX XX Speed through water: XXXX/10 Knots * Corresponding NMEA sentence: VHW */ int speed_through_water(int *data, int len, int oformat) { char buf[PRINTF_BUFSIZE+1]; int spd_raw; float spd; if (len != data[1]+3) return 1; spd_raw = data[3] << 8 | data[2]; spd = spd_raw / 10.0; if (oformat == FORMAT_NMEA) { return 0; } if (oformat == FORMAT_JSON) { return 0; } if (oformat == FORMAT_HUMAN) { snprintf(buf, PRINTF_BUFSIZE, "Speed through water: %f kts\n", spd); uart1_transmit_string(buf); return 0; } }
/*************************************************************************** * Apparent Wind Speed sentence * * 11 01 XX 0Y Apparent Wind Speed: (XX & 0x7F) + Y/10 Knots * Units flag: XX&0x80=0 => Display value in Knots * XX&0x80=0x80 => Display value in Meter/Second * Corresponding NMEA sentence: MWV */ int apparent_wind_speed(int *data, int len, int oformat, struct wind_data *wd) { char buf[PRINTF_BUFSIZE+1]; int ws_raw; float ws; if (len != data[1]+3) return 1; ws_raw = (data[2] & 0x7F)*10 + (data[3] & 0x0F); ws = ws_raw / 10.0; if (oformat == FORMAT_NMEA) { wd->wd_speed = ws; wd->wd_speed_age = time; transmit_wind_data(wd); return 0; } if (oformat == FORMAT_JSON) { return 0; } if (oformat == FORMAT_HUMAN) { snprintf(buf, PRINTF_BUFSIZE, "Wind speed: %f deg\n", ws); uart1_transmit_string(buf); return 0; } }
/*************************************************************************** * Apparent Wind Angle sentence * * 10 01 XX YY Apparent Wind Angle: XXYY/2 degrees right of bow * Used for autopilots Vane Mode (WindTrim) * Corresponding NMEA sentence: MWV */ int apparent_wind_angle(int *data, int len, int oformat, struct wind_data *wd) { char buf[PRINTF_BUFSIZE+1]; int wa_raw; float wa; if (len != data[1]+3) return 1; wa_raw = (data[2] << 8) | (data[3] & 0xFF); wa = wa_raw / 2.0; if (oformat == FORMAT_NMEA) { wd->wd_angle = wa; wd->wd_angle_age = time; transmit_wind_data(wd); return 0; } if (oformat == FORMAT_JSON) { return 0; } if (oformat == FORMAT_HUMAN) { snprintf(buf, PRINTF_BUFSIZE, "Wind angle: %f deg\n", wa); uart1_transmit_string(buf); return 0; } }
/*************************************************************************** * Depth Below Transducer sentence * * 00 02 YZ XX XX Depth below transducer: XXXX/10 feet * Flags in Y: Y&8 = 8: Anchor Alarm is active * Y&4 = 4: Metric display units or * Fathom display units if * followed by command 65 * Y&2 = 2: Used, unknown meaning * Flags in Z: Z&4 = 4: Transducer defective * Z&2 = 2: Deep Alarm is active * Z&1 = 1: Shallow Depth Alarm is active * Corresponding NMEA sentences: DPT, DBT */ int depth_below_transducer(int *data, int len, int oformat) { char buf[PRINTF_BUFSIZE+1]; unsigned int depth_raw; float depth_meters, depth_feet, depth_fathoms; if (len != data[1]+3) return 1; depth_raw = (data[4] << 8) | data[3]; if (oformat == FORMAT_NMEA) { depth_meters = depth_raw/10.0; depth_fathoms = 0.54*depth_meters; depth_feet = 3.281*depth_meters; nmea_sprintf(buf, PRINTF_BUFSIZE, "$SDDBT,%.1f,f,%.1f,M,%.1f,F", depth_feet, depth_meters, depth_fathoms); uart1_transmit_string(buf); return 0; } if (oformat == FORMAT_JSON) { return 0; } if (oformat == FORMAT_HUMAN) { depth_feet = depth_raw/10.0; snprintf(buf, PRINTF_BUFSIZE, "Depth: %f meters\n", depth_feet/3.281); uart1_transmit_string(buf); return 0; } }
void main(void) { DDRC = 0xff; PORTC = 0xff; unsigned char ch,ch1; unsigned char buf[10]; uart1_init(); lcd_init(); lcd_char('*'); init_i2c(); WR_I2C(0,0x57);//Sec WR_I2C(1,0x59);//Min WR_I2C(2,0x11 | (1<<5)|(1<<6) );//Hr WR_I2C(3,1);//Day WR_I2C(4,0x31);//Date WR_I2C(5,0x12);//Month WR_I2C(6,0x99);//year while(1) { ch = RD_I2C(0,0);//sec sprintf(buf,"\n\rSec = %02d",Hex2Dec(ch)); uart1_transmit_string(buf); ch = RD_I2C(1,0);//min sprintf(buf,"\n\rMin = %02d",Hex2Dec(ch)); uart1_transmit_string(buf); ch = RD_I2C(2,0);//hr sprintf(buf,"\n\rHr = %02d",Hex2Dec( ch & 0x1F ) ); uart1_transmit_string(buf); ch = RD_I2C(3,0);//day sprintf(buf,"\n\rDay = %02d",Hex2Dec(ch)); uart1_transmit_string(buf); ch = RD_I2C(4,0);//date sprintf(buf,"\n\rDate = %02d",Hex2Dec(ch)); uart1_transmit_string(buf); ch = RD_I2C(5,0);//month sprintf(buf,"\n\rMonth = %02d",Hex2Dec(ch)); uart1_transmit_string(buf); ch = RD_I2C(6,0);//year sprintf(buf,"\n\rYear = %02d",Hex2Dec(ch)); uart1_transmit_string(buf); _delay_ms(1000); } }
int transmit_wind_data(struct wind_data *wd) { char buf[NMEA_MAX_LENGTH+1]; char *valid = ""; int ret; if ( (time - wd->wd_angle_age < MAX_DATA_AGE) && (time - wd->wd_speed_age < MAX_DATA_AGE) ) valid = ",A"; ret = nmea_sprintf(buf, PRINTF_BUFSIZE, "VWMWV,%.1f,R,%.1f,K%s", wd->wd_angle, wd->wd_speed, valid); uart1_transmit_string(buf); return ret; }