00001 #include <inttypes.h>
00002 #include <math.h>
00003
00004 #include <avr/pgmspace.h>
00005 #include <stdio.h>
00006
00007 #include "configs.h"
00008 #include "scale.h"
00009 #include "shvars.h"
00010
00011 static double user_xscale, user_yscale, user_translate_x, user_translate_y;
00012
00013 void translate_init() {
00014 user_xscale = user_yscale = 1;
00015 user_translate_x = user_translate_y = 0;
00016 ip_pad[0] = 0;
00017 ip_pad[1] = 0;
00018 ip_pad[2] = 9500;
00019 ip_pad[3] = 7000;
00020 sc_pad[0] = 0;
00021 sc_pad[1] = 9500;
00022 sc_pad[2] = 0;
00023 sc_pad[3] = 7000;
00024 }
00025
00026
00027 void translate_scale() {
00028 int32_t ipxrange = ip_pad[2] - ip_pad[0];
00029 int32_t ipyrange = ip_pad[3] - ip_pad[1];
00030 int32_t scxrange = sc_pad[1] - sc_pad[0];
00031 int32_t scyrange = sc_pad[3] - sc_pad[2];
00032
00033 user_xscale = ((double)ipxrange)/((double)scxrange);
00034 user_yscale = ((double)ipyrange)/((double)scyrange);
00035
00036
00037 user_translate_x = -sc_pad[0]*user_xscale;
00038 user_translate_y = -sc_pad[2]*user_yscale;
00039
00040 printf_P(PSTR("Scale set to: (%f,%f) translate (%f,%f)"), user_xscale, user_yscale, user_translate_x, user_translate_y);
00041 }
00042
00043 void userprescale(double absx, double absy, double *ox, double *oy) {
00044 *ox = absx/user_xscale;
00045 *oy = absy/user_yscale;
00046 }
00047
00048 void userscale(double fx, double fy, int16_t* x, int16_t* y, double* ox, double* oy) {
00049 *x = (int)round(fx*STEPSCALE_X*user_xscale);
00050 *y = (int)round(fy*STEPSCALE_Y*user_yscale);
00051
00052 *ox = (*x)/(user_xscale*STEPSCALE_X);
00053 *oy = (*y)/(user_yscale*STEPSCALE_Y);
00054 }
00055
00056 USER_POINT scale_P1P2() {
00057 USER_POINT p;
00058 p.x = ip_pad[2] - ip_pad[0];
00059 p.y = ip_pad[3] - ip_pad[1];
00060
00061 return p;
00062 }
00063