Chapter 10: C Structures
menu_nextstate[1].state is defined as ST_AVRBF
nput is defined as KEY_NEXT
tstate[1].nextstate is defined as ST_AVRBF_REVe can search this array of structures to find out what we need to do if we are inw all we have to do is
nd out what we need to do if our next state is ST_AVRBF_REV, which we can
ntry. We see
at there is a function defined for this state, and equate the function pointer to it.
The
part of which, depending on the
ate d to search the menu_state array. The following code snippit compares
e tate with the next state [if (nextstate != state)] and, being very
are the same. If the states differ, main() sets the
tate variable and then accesses the menu_state
ru y to change the current state to the next state.:f te != state)for (i=0; pgm_read_byte(&menu_state[i].state); i++)
{
.state) == state)
=(PGM_P)pgm_read_word(&menu_state[i].pText);
c = (PGM_VOID_P)pgm_read_word(&menu_state[i].pFunc);}
}
_REV to be the next state, so searching the array
uses the snippet to make the function pointer, pStateFunc, point to the Revision
nction.menu_nextstate[1].i
menu_nex
W
the ST_AVRBF state and the input is KEY_NEXT, we find that particular
structure and see that the next state is ST_AVRBF_REV. No
fi
do by searching the menu_state array to find the ST_AVRBF_REV e
th
n we can call that function.
Clear so far?
The main() function slorps into an infinite loop,
st , is use
th present s
reasonable, does nothing if they
global state variable to the nexts
st cture arra
i (nextsta
{
state = nextstate;
if (pgm_read_byte(&menu_state[i]
{
statetext
pStateFun
break;
}
Since we took ST_AVRBF
ca
fu