Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.
Dependencies: mbed Watchdog SDFileSystem DigoleSerialDisp
SystemState.cpp
- Committer:
- shimniok
- Date:
- 2018-11-30
- Revision:
- 25:bb5356402687
- Parent:
- 16:4c4b75824efc
File content as of revision 25:bb5356402687:
/* * SystemState.c * * Created on: Jan 1, 2014 * Author: mes */ #include "mbed.h" #include <stdlib.h> #include <string.h> #include "SystemState.h" volatile int inState = 0; // push pointer volatile int outState = 0; // pull pointer SystemState *state; SystemState mystate[SSBUF]; void state_clear( SystemState *s ) { s->millis = 0; s->current = s->voltage = 0.0; s->g[0] = s->g[1] = s->g[2] = 0; s->gyro[0] = s->gyro[1] = s->gyro[2] = 0; s->gTemp = 0; s->a[0] = s->a[1] = s->a[2] = 0; s->m[0] = s->m[1] = s->m[2] = 0; s->gHeading = s->cHeading = 0.0; s->gpsLatitude = s->gpsLongitude = s->gpsCourse_deg = s->gpsSpeed_mps = s->gpsHDOP = 0.0; s->lrEncDistance = s->rrEncDistance = 0.0; s->lrEncSpeed = s->rrEncSpeed = s->encHeading = 0.0; s->estHeading = s->estLatitude = s->estLongitude = 0.0; s->estX = s->estY = 0.0; s->nextWaypoint = 0; s->bearing = s->distance = 0.0; s->LABrg = s->LAx = s->LAy = 0.0; } bool fifo_init() { // Allocate memory for system state buffer // We're doing this to (hopefully) save some flash size //state = (SystemState *) malloc(SSBUF*sizeof(SystemState)); state = mystate; fifo_reset(); return (state != NULL); } void fifo_reset() { // initialize in/out pointers __disable_irq(); inState = outState = 0; __enable_irq(); } bool fifo_available() { return (inState != outState); } bool fifo_push(SystemState *s) { __disable_irq(); inState++; // Get next state struct in the buffer inState &= (SSBUF-1); // Wrap around __enable_irq(); memcpy((void *) &state[inState], (void *) s, sizeof(SystemState)); return (inState != outState); } SystemState *fifo_pull() { SystemState *s = NULL; if (fifo_available()) { __disable_irq(); outState++; // increment outState &= (SSBUF-1); // wrap s = fifo_last(); __enable_irq(); } return s; } SystemState *fifo_first() { return &state[inState]; } SystemState *fifo_last() { return &state[outState]; } int fifo_getInState() { return inState; } int fifo_getOutState() { return outState; }