/*
   baudcheck.c
   Mar, 2013 by Bill Westfield (WestfW@yahoo.com)
   Exercises in executing arithmetic code on a system that we can't count
   on having the usual languages or tools installed.

   This little "C program" is run through the C preprocessor using the same
   arguments as our "real" target (which should assure that it gets the
   same values for clock speed and desired baud rate), and produces as
   output a shell script that can be run through bash, and THAT in turn
   writes the desired output...

   Note that the C-style comments are stripped by the C preprocessor.

   Copyright 2013-2015 by Bill Westfield.
   This software is licensed under version 2 of the Gnu Public Licence.
   See optiboot.c for details.
*/

/*
   First strip any trailing "L" from the defined constants.  To do this
   we need to make the constants into shell variables first.
*/
bpsx = BAUD_RATE
       bps = $ {bpsx / L / }
             bps = $ {bps / U / }
                   fcpux = F_CPU
                           fcpu = $ {fcpux / L / }
                                  fcpu = $ {fcpu / U / }

                                      // echo f_cpu = $fcpu, baud = $bps
                                      /*
                                         Compute the divisor
                                      */
#ifdef SINGLESPEED
  BAUD_SETTING = $(((($fcpu + $bps * 8) / (($bps * 16))) - 1))
#else
  BAUD_SETTING = $(((($fcpu + $bps * 4) / (($bps * 8))) - 1))
#endif
                                      // echo baud setting = $BAUD_SETTING

                                      /*
                                         Based on the computer divisor, calculate the actual bitrate,
                                         And the error.  Since we're all integers, we have to calculate
                                         the tenths part of the error separately.
                                      */
#ifdef SINGLESPEED
  BAUD_ACTUAL = $((($fcpu / (16 * (($BAUD_SETTING) + 1)))))
#else
  BAUD_ACTUAL = $((($fcpu / (8 * (($BAUD_SETTING) + 1)))))
#endif
                                      BAUD_ERROR = $((((100 * ($BAUD_ACTUAL - $bps)) / $bps)))
                                          ERR_TS = $(((((1000 * ($BAUD_ACTUAL - $bps)) / $bps) - $BAUD_ERROR * 10)))
                                              ERR_TENTHS = $((ERR_TS > 0 ? ERR_TS : -ERR_TS))

                                                  /*
                                                     Print a nice message containing the info we've calculated
                                                  */
                                                  echo BAUD RATE CHECK: Desired: $bps,  Real: $BAUD_ACTUAL, UBRRL = $BAUD_SETTING, Difference = $BAUD_ERROR.$ERR_TENTHS\ %
