summaryrefslogtreecommitdiff
path: root/n/avr/modules/math/fixed/test/test_fixed.c
diff options
context:
space:
mode:
Diffstat (limited to 'n/avr/modules/math/fixed/test/test_fixed.c')
-rw-r--r--n/avr/modules/math/fixed/test/test_fixed.c81
1 files changed, 79 insertions, 2 deletions
diff --git a/n/avr/modules/math/fixed/test/test_fixed.c b/n/avr/modules/math/fixed/test/test_fixed.c
index d42dda3..d19f63a 100644
--- a/n/avr/modules/math/fixed/test/test_fixed.c
+++ b/n/avr/modules/math/fixed/test/test_fixed.c
@@ -24,21 +24,98 @@
* }}} */
#include "common.h"
#include "modules/math/fixed/fixed.h"
+#include "modules/math/random/random.h"
#include "modules/uart/uart.h"
#include "modules/proto/proto.h"
+#include "modules/utils/utils.h"
#include "io.h"
void
proto_callback (uint8_t cmd, uint8_t size, uint8_t *args)
{
+ uint8_t ap, bp, as, bs;
+ uint16_t i;
+ int32_t al, bl, rl[4];
+ uint32_t patl[] = { 0xa66a6aa6, 0x5a5affff, 0xffcdffcd, 0xffffffff };
+#define patn (sizeof (patl) / sizeof (patl[0]))
+#define c(cmd, size) (cmd << 8 | size)
+ switch (c (cmd, size))
+ {
+ case c ('z', 0):
+ utils_reset ();
+ break;
+ case c ('m', 0):
+ for (ap = 0; ap < patn; ap++)
+ for (bp = 0; bp < patn; bp++)
+ for (as = 0; as < 32; as++)
+ for (bs = 0; bs < 32; bs++)
+ {
+ al = patl[ap] >> as;
+ bl = patl[bp] >> bs;
+ proto_send2d ('a', al, bl);
+ rl[0] = fixed_mul_f824 (al, bl);
+ rl[1] = fixed_mul_f824 (-al, bl);
+ rl[2] = fixed_mul_f824 (al, -bl);
+ rl[3] = fixed_mul_f824 (-al, -bl);
+ proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
+ }
+ for (i = 0; i < 64000; i++)
+ {
+ al = random_u32 ();
+ bl = random_u32 ();
+ proto_send2d ('a', al, bl);
+ rl[0] = fixed_mul_f824 (al, bl);
+ rl[1] = fixed_mul_f824 (-al, bl);
+ rl[2] = fixed_mul_f824 (al, -bl);
+ rl[3] = fixed_mul_f824 (-al, -bl);
+ proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
+ }
+ break;
+ case c ('d', 0):
+ for (ap = 0; ap < patn; ap++)
+ for (bp = 0; bp < patn; bp++)
+ for (as = 0; as < 32; as++)
+ for (bs = 0; bs < 32; bs++)
+ {
+ al = patl[ap] >> as;
+ bl = patl[bp] >> bs;
+ proto_send2d ('a', al, bl);
+ rl[0] = fixed_div_f824 (al, bl);
+ rl[1] = fixed_div_f824 (-al, bl);
+ rl[2] = fixed_div_f824 (al, -bl);
+ rl[3] = fixed_div_f824 (-al, -bl);
+ proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
+ }
+ for (i = 0; i < 64000; i++)
+ {
+ al = random_u32 ();
+ bl = random_u32 ();
+ proto_send2d ('a', al, bl);
+ rl[0] = fixed_div_f824 (al, bl);
+ rl[1] = fixed_div_f824 (-al, bl);
+ rl[2] = fixed_div_f824 (al, -bl);
+ rl[3] = fixed_div_f824 (-al, -bl);
+ proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
+ }
+ break;
+ default:
+ proto_send0 ('?');
+ return;
+ }
+ /* When no error acknoledge. */
+ proto_send (cmd, size, args);
+#undef c
}
int
main (void)
{
- volatile int32_t a = 42;
sei ();
uart0_init ();
- fixed_mul_f824 (-a, 0);
proto_send0 ('z');
+ while (1)
+ {
+ uint8_t c = uart0_getc ();
+ proto_accept (c);
+ }
}