00001 #include <stdio.h>
00002 #include <inttypes.h>
00003 #include <math.h>
00004
00005 #include <avr/pgmspace.h>
00006
00007 #include "shvars.h"
00008 #include "hpgl.h"
00009 #include "scale.h"
00010
00011
00012 int8_t pstate, nstate;
00013
00014 uint8_t etxchar;
00015
00016 void hpgl_init() {
00017 pstate = STATE_EXP1;
00018 etxchar = 003;
00019 }
00020
00021 int8_t hpgl_char(char c, STEPPER_COORD* x, STEPPER_COORD* y, uint8_t* lb) {
00022 static uint8_t i, si;
00023 static uint8_t numpad_idx;
00024 static int8_t cmd = CMD_ERR;
00025 static float fx, fy;
00026
00027 *x = *y = -1;
00028 *lb = 0;
00029
00030 lolbel:
00031 switch (pstate) {
00032 case STATE_EXP1:
00033 cmd = CMD_CONT;
00034 si = 0;
00035
00036 switch (c) {
00037 case ' ': case '\n': case '\r' : case '\t':
00038 break;
00039 case 'P': pstate = STATE_EXP_P;
00040 break;
00041 case 'S': pstate = STATE_EXP_S;
00042 break;
00043 case 'I': pstate = STATE_EXP_I;
00044 break;
00045 case 'A': pstate = STATE_EXP_A;
00046 break;
00047 case 'L': pstate = STATE_EXP_L;
00048 break;
00049 case 'D': pstate = STATE_EXP_D;
00050 break;
00051 default: pstate = STATE_SKIP_END;
00052 break;
00053 }
00054 break;
00055
00056 case STATE_SKIP_END:
00057 if (c == ';') {
00058 pstate = STATE_EXP1;
00059 cmd = CMD_ERR;
00060 }
00061 break;
00062
00063 case STATE_EXP_A:
00064 switch (c) {
00065 case ' ': case '\n': case '\r' : case '\t':
00066 break;
00067 case 'A':
00068 numpad_idx = 0;
00069 pstate = STATE_EXP4;
00070 nstate = STATE_ARC;
00071 break;
00072 }
00073 break;
00074
00075 case STATE_EXP_P:
00076
00077 si = 0;
00078
00079 switch (c) {
00080 case 'U': cmd = CMD_PU;
00081 pstate = STATE_X;
00082 break;
00083 case 'D': cmd = CMD_PD;
00084 pstate = STATE_X;
00085 break;
00086 case 'A': cmd = CMD_PA;
00087 pstate = STATE_X;
00088 break;
00089 case 'G':
00090 *x = *y = 0;
00091 user_loc.x = user_loc.y = 0;
00092 cmd = CMD_PU;
00093 pstate = STATE_SKIP_END;
00094 break;
00095 case 'R':
00096 case 'W':
00097 default: cmd = CMD_ERR;
00098 pstate = STATE_SKIP_END;
00099 break;
00100 }
00101 break;
00102
00103 case STATE_EXP_S:
00104 switch (c) {
00105 case 'P': pstate = STATE_SP;
00106 break;
00107 case 'C': nstate = STATE_SC;
00108 pstate = STATE_EXP4;
00109 numpad_idx = 0;
00110 break;
00111 case 'I': nstate = STATE_SI;
00112 pstate = STATE_EXP4;
00113 numpad_idx = 0;
00114 break;
00115 case 'R': nstate = STATE_SR;
00116 pstate = STATE_EXP4;
00117 numpad_idx = 0;
00118 break;
00119 default:
00120 pstate = STATE_SKIP_END;
00121 break;
00122 }
00123 break;
00124
00125 case STATE_EXP_I:
00126 switch (c) {
00127 case 'P':
00128 nstate = STATE_IP;
00129 pstate = STATE_EXP4;
00130 numpad_idx = 0;
00131 break;
00132 case 'N':
00133 pstate = STATE_SKIP_END;
00134 cmd = CMD_INIT;
00135 break;
00136 case 'H':
00137 pstate = STATE_SKIP_END;
00138 cmd = CMD_SEEK0;
00139 break;
00140 default:
00141 pstate = STATE_SKIP_END;
00142 break;
00143 }
00144 break;
00145
00146 case STATE_EXP_L:
00147 switch (c) {
00148 case 'B':
00149 pstate = STATE_LB;
00150 cmd = CMD_LB0;
00151 break;
00152 default:
00153 pstate = STATE_SKIP_END;
00154 break;
00155 }
00156 break;
00157
00158 case STATE_EXP_D:
00159 switch (c) {
00160 case 'T':
00161 pstate = STATE_DT;
00162 break;
00163 case 'I':
00164 pstate = STATE_EXP4;
00165 nstate = STATE_DI;
00166 numpad_idx = 0;
00167 break;
00168 default:
00169 pstate = STATE_SKIP_END;
00170 break;
00171 }
00172 break;
00173
00174 case STATE_SP:
00175 switch (c) {
00176 case ';': pstate = STATE_EXP1;
00177 break;
00178 case '0':
00179 *x = *y = 0;
00180 user_loc.x = user_loc.y = 0;
00181 cmd = CMD_PU;
00182 pstate = STATE_SKIP_END;
00183 break;
00184 }
00185 break;
00186
00187 case STATE_IP:
00188 for (i = 0; i < 4; i++) ip_pad[i] = (int32_t)round(numpad[i]);
00189 pstate = STATE_EXP1;
00190 break;
00191
00192 case STATE_SC:
00193 for (i = 0; i < 4; i++) sc_pad[i] = (int32_t)round(numpad[i]);
00194 translate_scale();
00195 pstate = STATE_EXP1;
00196 break;
00197
00198 case STATE_SI:
00199 cmd = CMD_SI;
00200 pstate = STATE_EXP1;
00201 break;
00202
00203 case STATE_SR:
00204 cmd = CMD_SR;
00205 pstate = STATE_EXP1;
00206 break;
00207
00208 case STATE_X:
00209 switch (c) {
00210 case ' ':
00211 case '\n':
00212 case '\r':
00213 case '\t': break;
00214 case ',': scratchpad[si++] = 0;
00215 sscanf_P(scratchpad, PSTR("%f"), &fx);
00216 si = 0;
00217 pstate = STATE_Y;
00218 break;
00219 case ';': cmd = CMD_ERR;
00220 pstate = STATE_EXP1;
00221 break;
00222 default: scratchpad[si++] = c;
00223 break;
00224 }
00225 break;
00226
00227 case STATE_Y:
00228 switch (c) {
00229 case ' ': case '\n': case '\r': case '\t':
00230 break;
00231 case ',':
00232 case ';': scratchpad[si++] = 0;
00233 sscanf_P(scratchpad, PSTR("%f"), &fy);
00234 si = 0;
00235 userscale(fx, fy, x, y, &user_loc.x, &user_loc.y);
00236 break;
00237 default: scratchpad[si++] = c;
00238 break;
00239 }
00240
00241 switch (c) {
00242 case ',': pstate = STATE_X;
00243 break;
00244 case ';': pstate = STATE_EXP1;
00245 break;
00246 }
00247 break;
00248
00249 case STATE_EXP4:
00250 switch (c) {
00251 case ' ': case '\n': case '\r': case '\t':
00252 break;
00253 case ';':
00254 case ',': scratchpad[si++] = 0;
00255 sscanf_P(scratchpad,PSTR("%f"),&fx);
00256 si = 0;
00257 numpad[numpad_idx] = fx;
00258 numpad_idx++;
00259 if (numpad_idx == 4 || c == ';') {
00260 pstate = nstate;
00261 goto lolbel;
00262 }
00263 break;
00264 default: scratchpad[si++] = c;
00265 break;
00266 }
00267 break;
00268
00269 case STATE_ARC:
00270
00271 cmd = CMD_ARCABS;
00272 if (numpad_idx == 3) {
00273 numpad[3] = 5.0;
00274 }
00275 *x = *y = -1;
00276 pstate = STATE_EXP1;
00277
00278 break;
00279
00280 case STATE_LB:
00281
00282 cmd = CMD_LB;
00283 if (c == etxchar) {
00284 pstate = STATE_EXP1;
00285 *lb = 000;
00286 } else {
00287 *x = *y = -1;
00288 *lb = c;
00289 }
00290 break;
00291
00292 case STATE_DT:
00293 etxchar = c;
00294 pstate = STATE_EXP1;
00295 break;
00296
00297 case STATE_DI:
00298
00299 cmd = CMD_DI;
00300 pstate = STATE_EXP1;
00301 break;
00302 }
00303
00304 return cmd;
00305 }
00306