/* This function is called repetitively from the main program */ void labwork( void ) { delay( 1000 ); time2string( textstring, mytime ); display_string( 3, textstring ); display_update(); getbtns(); if (getbtns() == 1) mytime += (getsw() << 4); if (getbtns() == 2) mytime += (getsw() << 8); if (getbtns() == 4) mytime += (getsw() << 12); volatile int* porte = (volatile int*) 0xbf886110; tick( &mytime ); *porte += 1; display_image(96, icon); }
void main(void) { unsigned char sw; for (;;) { sw=getsw(); if (sw !=0) { ledptn(sw); beepsnd(1000,50); delay(10000); } } }
/* This function is called repetitively from the main program */ void labwork( void ){ prime = nextprime(prime); display_string(0, itoaconv(prime)); display_update(); int btns = getbtns(); if(btns){ int sw = getsw(); //BTN2 if(btns & 0x4){ mytime &= 0x0fff; //remove old digit mytime |= (sw<<12); //set new digit } //BTN3 if(btns & 0x2){ mytime &= 0xf0ff; mytime |= (sw<<8); } //BTN2 if(btns & 0x1){ mytime &= 0xff0f; mytime |= (sw<<4); } } }
/*@ +charint @*/ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size_t len) { unsigned char buf2[MAX_PACKET_LENGTH], *cp, *tp; size_t i, datalen; unsigned int used, visible, satcnt; double version; gps_mask_t mask = 0; if (len == 0) return 0; /* time to unstuff it and discard the header and footer */ cp = buf + 2; tp = buf2; if (*cp == 0x10) cp++; datalen = (size_t)*cp++; gpsd_report(LOG_RAW, "raw EverMore packet type 0x%02x, length %d: %s\n", *cp, len, gpsd_hexdump(buf, len)); datalen -= 2; for (i = 0; i < (size_t)datalen; i++) { *tp = *cp++; if (*tp == 0x10) cp++; tp++; } /*@ -usedef -compdef @*/ gpsd_report(LOG_RAW, "EverMore packet type 0x%02x, length %d: %s\n", buf2[0], datalen, gpsd_hexdump(buf2, datalen)); /*@ +usedef +compdef @*/ (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag), "EID%d",(int)buf2[0]); switch (getub(buf2, 1)) { case 0x02: /* Navigation Data Output */ session->gpsdata.fix.time = session->gpsdata.sentence_time = gpstime_to_unix((int)getuw(buf2, 2), getul(buf2, 4)*0.01) - session->context->leap_seconds; ecef_to_wgs84fix(&session->gpsdata, getsl(buf2, 8)*1.0, getsl(buf2, 12)*1.0, getsl(buf2, 16)*1.0, getsw(buf2, 20)/10.0, getsw(buf2, 22)/10.0, getsw(buf2, 24)/10.0); used = getub(buf2, 26) & 0x0f; visible = (getub(buf2, 26) & 0xf0) >> 4; version = getuw(buf2, 27)/100.0; /* that's all the information in this packet */ if (used < 3) session->gpsdata.fix.mode = MODE_NO_FIX; else if (used == 3) session->gpsdata.fix.mode = MODE_2D; else { session->gpsdata.fix.mode = MODE_3D; mask |= ALTITUDE_SET | CLIMB_SET; } gpsd_report(LOG_PROG, "NDO 0x02: version %3.2f, mode=%d, status=%d, visible=%d, used=%d\n", version, session->gpsdata.fix.mode, session->gpsdata.status, visible, used); mask |= TIME_SET | LATLON_SET | TRACK_SET | SPEED_SET | MODE_SET | CYCLE_START_SET; if (session->subtype[0] == '\0') { (void)snprintf(session->subtype, sizeof(session->subtype), "%3.2f", version); mask |= DEVICEID_SET; } return mask; case 0x04: /* DOP Data Output */ session->gpsdata.fix.time = session->gpsdata.sentence_time = gpstime_to_unix((int)getuw(buf2, 2), getul(buf2, 4)*0.01) - session->context->leap_seconds; session->gpsdata.gdop = (double)getub(buf2, 8)*0.1; session->gpsdata.pdop = (double)getub(buf2, 9)*0.1; session->gpsdata.hdop = (double)getub(buf2, 10)*0.1; session->gpsdata.vdop = (double)getub(buf2, 11)*0.1; session->gpsdata.tdop = (double)getub(buf2, 12)*0.1; switch (getub(buf2, 13)) { case 0: /* no position fix */ case 1: /* manual calls this "1D navigation" */ session->gpsdata.status = STATUS_NO_FIX; session->gpsdata.fix.mode = MODE_NO_FIX; break; case 2: /* 2D navigation */ session->gpsdata.status = STATUS_FIX; session->gpsdata.fix.mode = MODE_2D; break; case 3: /* 3D navigation */ session->gpsdata.status = STATUS_FIX; session->gpsdata.fix.mode = MODE_3D; break; case 4: /* 3D navigation with DGPS */ session->gpsdata.status = STATUS_DGPS_FIX; session->gpsdata.fix.mode = MODE_3D; break; } /* that's all the information in this packet */ gpsd_report(LOG_PROG, "DDO 0x04: mode=%d, status=%d\n", session->gpsdata.fix.mode, session->gpsdata.status); return TIME_SET | DOP_SET | MODE_SET | STATUS_SET; case 0x06: /* Channel Status Output */ session->gpsdata.fix.time = session->gpsdata.sentence_time = gpstime_to_unix((int)getuw(buf2, 2), getul(buf2, 4)*0.01) - session->context->leap_seconds; session->gpsdata.satellites = (int)getub(buf2, 8); session->gpsdata.satellites_used = 0; memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used)); if (session->gpsdata.satellites > 12) { gpsd_report(LOG_WARN, "Warning: EverMore packet has information about %d satellites!\n", session->gpsdata.satellites); } if (session->gpsdata.satellites > EVERMORE_CHANNELS) session->gpsdata.satellites = EVERMORE_CHANNELS; satcnt = 0; for (i = 0; i < (size_t)session->gpsdata.satellites; i++) { int prn; // channel = getub(buf2, 7*i+7+2) prn = (int)getub(buf2, 7*i+7+3); if (prn == 0) continue; /* satellite record is not valid */ session->gpsdata.PRN[satcnt] = prn; session->gpsdata.azimuth[satcnt] = (int)getuw(buf2, 7*i+7+4); session->gpsdata.elevation[satcnt] = (int)getub(buf2, 7*i+7+6); session->gpsdata.ss[satcnt] = (int)getub(buf2, 7*i+7+7); /* * Status bits at offset 8: * bit0 = 1 satellite acquired * bit1 = 1 code-tracking loop locked * bit2 = 1 carrier-tracking loop locked * bit3 = 1 data-bit synchronization done * bit4 = 1 frame synchronization done * bit5 = 1 ephemeris data collected * bit6 = 1 used for position fix */ if (getub(buf2, 7*i+7+8) & 0x40) { session->gpsdata.used[session->gpsdata.satellites_used++]=prn; } satcnt++; } session->gpsdata.satellites = (int)satcnt; /* that's all the information in this packet */ gpsd_report(LOG_PROG, "CSO 0x04: %d satellites used\n", session->gpsdata.satellites_used); return TIME_SET | SATELLITE_SET | USED_SET; case 0x08: /* Measurement Data Output */ /* clock offset is a manufacturer diagnostic */ /* (int)getuw(buf2, 8); clock offset, 29000..29850 ?? */ session->gpsdata.fix.time = session->gpsdata.sentence_time = gpstime_to_unix((int)getuw(buf2, 2), getul(buf2, 4)*0.01) - session->context->leap_seconds; visible = getub(buf2, 10); /* FIXME: read full statellite status for each channel */ /* we can get pseudo range (m), delta-range (m/s), doppler (Hz) and status for each channel */ /* gpsd_report(LOG_PROG, "MDO 0x04: visible=%d\n", visible); */ gpsd_report(LOG_PROG, "MDO 0x04:\n"); return TIME_SET; case 0x20: /* LogConfig Info, could be used as a probe for EverMore GPS */ gpsd_report(LOG_IO, "LogConfig EverMore packet, length %d: %s\n", datalen, gpsd_hexdump(buf2, datalen)); return ONLINE_SET; case 0x22: /* LogData */ gpsd_report(LOG_IO, "LogData EverMore packet, length %d: %s\n", datalen, gpsd_hexdump(buf2, datalen)); return ONLINE_SET; case 0x38: /* ACK */ gpsd_report(LOG_PROG, "EverMore command %02X ACK\n", getub(buf2, 2)); return ONLINE_SET; default: gpsd_report(LOG_WARN, "unknown EverMore packet id 0x%02x, length %d: %s\n", buf2[0], datalen, gpsd_hexdump(buf2, datalen)); return 0; } }
//Update status int update_status() { getbtns(); getsw(); }