Moved Grbl Sim to its own repo.

This commit is contained in:
Sonny Jeon 2014-08-07 06:45:09 -06:00
parent fc0c4f4332
commit 48faf81c40
33 changed files with 0 additions and 1922 deletions

2
sim/.gitignore vendored
View File

@ -1,2 +0,0 @@
grbl_sim.exe
*.dat

View File

@ -1,323 +0,0 @@
( Made using CamBam - http://www.cambam.co.uk )
( Untitled 2/13/2012 2:54:50 PM )
( T0 : 0.0394 )
G20 G90 G64 G40
G0 Z0.125
( T0 : 0.0394 )
T0 M6
( Engrave1 )
G17
M3 S1000
G0 X-3.0 Y-0.0451
G1 F10.0 Z-0.001
G1 F60.0 X-2.8845 Y-0.035
G3 X-2.8723 Y-0.0943 I0.3244 J0.0363
G3 X-2.8467 Y-0.1492 I0.2072 J0.0631
G3 X-2.805 Y-0.1917 I0.1471 J0.1027
G3 X-2.7533 Y-0.2212 I0.1578 J0.2169
G3 X-2.6114 Y-0.2483 I0.1366 J0.3297
G3 X-2.4877 Y-0.2275 I0.006 J0.3418
G3 X-2.4438 Y-0.2048 I-0.0766 J0.2022
G3 X-2.4082 Y-0.1707 I-0.0792 J0.1182
G3 X-2.3817 Y-0.0912 I-0.1063 J0.0796
G3 X-2.4069 Y-0.0155 I-0.1191 J0.0024
G3 X-2.4449 Y0.0175 I-0.1101 J-0.0883
G3 X-2.4902 Y0.0394 I-0.1379 J-0.2279
G3 X-2.572 Y0.0637 I-0.3019 J-0.8663
G3 X-2.6549 Y0.0842 I-1.0468 J-4.0562
G2 X-2.7457 Y0.1086 I0.3878 J1.6213
G2 X-2.8334 Y0.1422 I0.1472 J0.5158
G2 X-2.8886 Y0.1787 I0.1401 J0.2718
G2 X-2.9325 Y0.2281 I0.1404 J0.1692
G2 X-2.9647 Y0.3435 I0.1821 J0.1129
G2 X-2.9249 Y0.4741 I0.2336 J0.0003
G2 X-2.8088 Y0.5669 I0.2044 J-0.1368
G2 X-2.6391 Y0.5984 I0.1639 J-0.4097
G2 X-2.5469 Y0.5908 I0.0024 J-0.5372
G2 X-2.458 Y0.565 I-0.0669 J-0.395
G2 X-2.3369 Y0.4678 I-0.0947 J-0.2421
G2 X-2.2915 Y0.3221 I-0.2346 J-0.1531
G1 X-2.4088 Y0.3132
G3 X-2.4277 Y0.386 I-0.236 J-0.0223
G3 X-2.4732 Y0.4457 I-0.1488 J-0.0662
G3 X-2.5498 Y0.4817 I-0.1158 J-0.1469
G3 X-2.6341 Y0.4905 I-0.08 J-0.3586
G3 X-2.7184 Y0.4829 I-0.0045 J-0.4232
G3 X-2.7962 Y0.4495 I0.0315 J-0.1804
G3 X-2.8331 Y0.4066 I0.0864 J-0.1118
G3 X-2.8467 Y0.3517 I0.1005 J-0.0539
G3 X-2.8107 Y0.2697 I0.1052 J-0.0028
G3 X-2.7679 Y0.2452 I0.1001 J0.125
G3 X-2.698 Y0.2215 I0.2359 J0.583
G3 X-2.6265 Y0.2034 I0.3957 J1.414
G2 X-2.5228 Y0.1782 I-0.5539 J-2.5053
G2 X-2.4215 Y0.1448 I-0.1803 J-0.7161
G2 X-2.3553 Y0.1057 I-0.1442 J-0.3193
G2 X-2.3022 Y0.0501 I-0.1407 J-0.1878
G2 X-2.2637 Y-0.0811 I-0.19 J-0.127
G2 X-2.306 Y-0.2205 I-0.2532 J0.0006
G2 X-2.4278 Y-0.3221 I-0.2339 J0.1566
G2 X-2.6057 Y-0.3581 I-0.1712 J0.3891
G2 X-2.7129 Y-0.3503 I-0.0037 J0.6909
G2 X-2.8164 Y-0.3215 I0.0637 J0.4292
G2 X-2.9495 Y-0.2117 I0.1147 J0.2747
G2 X-3.0 Y-0.0451 I0.265 J0.1712
G0 Z0.125
G0 X-2.111
G1 F10.0 Z-0.001
G1 F60.0 Y0.5826
G1 X-1.9975
G1 Y0.2508
G2 X-1.9077 Y0.3198 I0.2024 J-0.1703
G2 X-1.7969 Y0.3429 I0.1077 J-0.2394
G2 X-1.6675 Y0.3132 I0.0063 J-0.2692
G2 X-1.5893 Y0.2325 I-0.0755 J-0.1515
G2 X-1.5698 Y0.1586 I-0.2396 J-0.1028
G2 X-1.5653 Y0.0823 I-0.5851 J-0.0725
G1 Y-0.3423
G1 X-1.6789
G1 Y0.0823
G3 X-1.6859 Y0.1476 I-0.2729 J0.0036
G3 X-1.7161 Y0.206 I-0.1238 J-0.027
G3 X-1.764 Y0.2366 I-0.0845 J-0.0794
G3 X-1.8202 Y0.2451 I-0.0537 J-0.1649
G3 X-1.9155 Y0.2186 I-0.0001 J-0.1841
G3 X-1.9786 Y0.1479 I0.072 J-0.1278
G3 X-1.9938 Y0.087 I0.221 J-0.0878
G3 X-1.9975 Y0.0243 I0.4875 J-0.0599
G1 Y-0.3423
G1 X-2.111
G1 Y-0.0451
G0 Z0.125
G0 X-1.4292 Y-0.1385
G1 F10.0 Z-0.001
G2 F60.0 X-1.4088 Y-0.076 I0.182 J-0.0249
G2 X-1.3502 Y-0.0104 I0.1662 J-0.0896
G2 X-1.2681 Y0.0268 I0.1554 J-0.2334
G2 X-1.1672 Y0.0438 I0.1926 J-0.8334
G3 X-1.065 Y0.0586 I-0.2128 J1.8303
G3 X-0.9647 Y0.0829 I-0.1109 J0.6767
G3 X-0.9641 Y0.1126 I-1.9501 J0.0563
G3 X-0.97 Y0.1648 I-0.2046 J0.003
G3 X-0.9962 Y0.2104 I-0.0883 J-0.0204
G3 X-1.0574 Y0.2412 I-0.0943 J-0.111
G3 X-1.1256 Y0.2489 I-0.0647 J-0.2692
G3 X-1.187 Y0.2436 I-0.0032 J-0.3217
G3 X-1.2442 Y0.2205 I0.0237 J-0.141
G3 X-1.2805 Y0.1756 I0.0774 J-0.0998
G3 X-1.3003 Y0.1214 I0.2336 J-0.1162
G1 X-1.4114 Y0.1366
G2 X-1.3931 Y0.1969 I0.337 J-0.0694
G2 X-1.3615 Y0.2514 I0.2096 J-0.0848
G2 X-1.3162 Y0.2923 I0.1453 J-0.1155
G2 X-1.2612 Y0.3189 I0.1409 J-0.221
G2 X-1.1092 Y0.3429 I0.1442 J-0.4206
G2 X-1.0386 Y0.3388 I0.0029 J-0.5642
G2 X-0.9697 Y0.3227 I-0.0351 J-0.3052
G2 X-0.927 Y0.3022 I-0.0865 J-0.2354
G2 X-0.8909 Y0.2716 I-0.0727 J-0.1224
G2 X-0.8555 Y0.1946 I-0.1386 J-0.1102
G2 X-0.8507 Y0.1424 I-0.3836 J-0.0615
G2 X-0.8499 Y0.0899 I-1.3758 J-0.0494
G1 Y-0.0615
G3 X-0.8489 Y-0.1619 I4.6791 J-0.0068
G3 X-0.8429 Y-0.2622 I0.9512 J0.0067
G3 X-0.8139 Y-0.3423 I0.2546 J0.0469
G1 X-0.9325
G2 X-0.9552 Y-0.2596 I0.2182 J0.1044
G2 X-1.077 Y-0.3354 I-0.2823 J0.3183
G2 X-1.2019 Y-0.3574 I-0.1221 J0.3266
G2 X-1.2917 Y-0.3463 I-0.0042 J0.3355
G2 X-1.3716 Y-0.3038 I0.0496 J0.1895
G2 X-1.4309 Y-0.1656 I0.1197 J0.1332
G2 X-1.4292 Y-0.1385 I0.1837 J0.0022
G0 Z0.125
G0 X-1.3093 Y-0.1513
G1 F10.0 Z-0.001
G3 F60.0 X-1.3098 Y-0.1625 I0.0949 J-0.0101
G3 X-1.2757 Y-0.2382 I0.0971 J-0.0018
G3 X-1.228 Y-0.2624 I0.075 J0.0889
G3 X-1.1748 Y-0.2685 I0.0506 J0.2058
G3 X-1.0581 Y-0.2401 I0.0042 J0.2367
G3 X-0.983 Y-0.1612 I-0.0857 J0.1567
G3 X-0.9681 Y-0.1054 I-0.1756 J0.0768
G3 X-0.9647 Y-0.0477 I-0.4434 J0.0549
G1 Y-0.006
G2 X-1.0563 Y-0.0325 I-0.2032 J0.5301
G2 X-1.1502 Y-0.0489 I-0.2867 J1.3668
G3 X-1.2003 Y-0.0575 I0.1165 J-0.8276
G3 X-1.2492 Y-0.0716 I0.0505 J-0.2671
G3 X-1.294 Y-0.1089 I0.0375 J-0.0907
G3 X-1.3093 Y-0.1513 I0.0797 J-0.0526
G0 Z0.125
G0 X-0.6738
G1 F10.0 Z-0.001
G1 F60.0 Y0.3277
G1 X-0.5704
G1 Y0.2407
G2 X-0.4877 Y0.317 I0.2085 J-0.1428
G2 X-0.376 Y0.3429 I0.1052 J-0.2003
G2 X-0.2246 Y0.2987 I0.0049 J-0.265
G2 X-0.1256 Y0.1738 I-0.1536 J-0.2235
G2 X-0.0921 Y-0.0022 I-0.4197 J-0.1709
G2 X-0.1294 Y-0.1877 I-0.4477 J-0.0066
G2 X-0.2366 Y-0.3139 I-0.2559 J0.1088
G2 X-0.3842 Y-0.3574 I-0.1486 J0.2319
G2 X-0.4865 Y-0.3335 I-0.0033 J0.2159
G2 X-0.5603 Y-0.2729 I0.1079 J0.2068
G1 Y-0.5991
G1 X-0.6738
G1 Y-0.1513
G0 Z0.125
G0 X-0.5586 Y-0.1219
G1 F10.0 Z-0.001
G3 F60.0 X-0.5186 Y-0.2022 I0.2066 J0.0526
G3 X-0.4624 Y-0.2478 I0.1393 J0.1145
G3 X-0.3918 Y-0.2641 I0.0691 J0.1387
G3 X-0.3198 Y-0.2472 I0.0014 J0.1565
G3 X-0.2625 Y-0.2003 I-0.0865 J0.1642
G3 X-0.2186 Y-0.1056 I-0.1741 J0.1382
G3 X-0.2082 Y-0.0016 I-0.463 J0.0985
G3 X-0.2185 Y0.0988 I-0.445 J0.0051
G3 X-0.2612 Y0.1902 I-0.2152 J-0.0448
G3 X-0.3165 Y0.2368 I-0.1435 J-0.1141
G3 X-0.3868 Y0.2539 I-0.0691 J-0.1308
G3 X-0.459 Y0.2348 I-0.0004 J-0.1446
G3 X-0.5155 Y0.1858 I0.1042 J-0.1769
G3 X-0.5599 Y0.0921 I0.1824 J-0.1439
G3 X-0.571 Y-0.0111 I0.4286 J-0.0981
G3 X-0.561 Y-0.1111 I0.4541 J-0.0052
G3 X-0.5586 Y-0.1219 I0.209 J0.0418
G0 Z0.125
G0 X0.0092 Y-0.0653
G1 F10.0 Z-0.001
G2 F60.0 X0.0069 Y-0.013 I0.4635 J0.0463
G2 X0.0253 Y0.1266 I0.49 J0.0063
G2 X0.094 Y0.2495 I0.2937 J-0.0834
G2 X0.1968 Y0.3207 I0.209 J-0.1921
G2 X0.3199 Y0.3429 I0.1188 J-0.3064
G2 X0.4396 Y0.321 I0.004 J-0.3162
G2 X0.5394 Y0.2514 I-0.1055 J-0.2578
G2 X0.6066 Y0.1308 I-0.2207 J-0.202
G2 X0.6246 Y-0.006 I-0.4641 J-0.1307
G2 X0.624 Y-0.0363 I-1.1335 J0.0085
G1 X0.1243
G3 X0.1404 Y-0.1264 I0.3467 J0.0157
G3 X0.1867 Y-0.2054 I0.1984 J0.0632
G3 X0.3268 Y-0.2641 I0.1356 J0.1272
G3 X0.4334 Y-0.2312 I0.0048 J0.1741
G3 X0.4761 Y-0.184 I-0.1056 J0.1381
G3 X0.5034 Y-0.1265 I-0.2498 J0.1544
G1 X0.6208 Y-0.141
G2 X0.583 Y-0.2296 I-0.3145 J0.082
G2 X0.518 Y-0.3007 I-0.2247 J0.1403
G2 X0.4267 Y-0.3449 I-0.1599 J0.2137
G2 X0.3262 Y-0.3574 I-0.0969 J0.3673
G2 X0.1999 Y-0.337 I-0.005 J0.3687
G2 X0.0927 Y-0.2672 I0.094 J0.2616
G2 X0.0252 Y-0.1484 I0.2166 J0.2017
G2 X0.0092 Y-0.0653 I0.4475 J0.1294
G0 Z0.125
G0 X0.1306 Y0.0571
G1 F10.0 Z-0.001
G1 F60.0 X0.5047
G3 X0.4926 Y0.1236 I-0.3356 J-0.0268
G3 X0.4618 Y0.1839 I-0.1636 J-0.0456
G3 X0.3211 Y0.2495 I-0.1362 J-0.1084
G3 X0.1893 Y0.1971 I-0.0043 J-0.1815
G3 X0.1467 Y0.1326 I0.1313 J-0.1328
G3 X0.1306 Y0.0571 I0.2303 J-0.0887
G0 Z0.125
G0 X0.7412 Y0.0837
G1 F10.0 Z-0.001
G2 F60.0 X0.7407 Y0.1082 I0.5215 J0.0227
G2 X0.7673 Y0.3004 I0.6459 J0.0084
G2 X0.8643 Y0.4684 I0.405 J-0.1218
G2 X1.0099 Y0.568 I0.2954 J-0.2758
G2 X1.1836 Y0.599 I0.1677 J-0.4369
G2 X1.4145 Y0.5378 I0.0061 J-0.4431
G2 X1.5709 Y0.3669 I-0.2021 J-0.3421
G2 X1.6126 Y0.246 I-0.4508 J-0.2228
G2 X1.6252 Y0.1189 I-0.6041 J-0.1243
G2 X1.6119 Y-0.0104 I-0.6073 J-0.0028
G2 X1.5684 Y-0.1328 I-0.4911 J0.1054
G2 X1.4075 Y-0.3013 I-0.3494 J0.1726
G2 X1.1829 Y-0.3581 I-0.2218 J0.4049
G2 X1.0618 Y-0.343 I-0.0025 J0.4735
G2 X0.9495 Y-0.295 I0.1059 J0.4032
G2 X0.7937 Y-0.1227 I0.2106 J0.3471
G2 X0.7412 Y0.0837 I0.469 J0.2292
G0 Z0.125
G0 X0.867 Y0.0872
G1 F10.0 Z-0.001
G3 F60.0 X0.8863 Y-0.0342 I0.4738 J0.0131
G3 X0.9564 Y-0.1574 I0.3033 J0.091
G3 X1.1823 Y-0.2533 I0.2187 J0.2012
G3 X1.3066 Y-0.2297 I0.004 J0.318
G3 X1.4094 Y-0.1562 I-0.1146 J0.269
G3 X1.4803 Y-0.0268 I-0.2365 J0.2136
G3 X1.499 Y0.1195 I-0.5092 J0.1396
G3 X1.4904 Y0.22 I-0.5565 J0.0028
G3 X1.4605 Y0.3164 I-0.4006 J-0.0713
G3 X1.3489 Y0.447 I-0.2653 J-0.1138
G3 X1.1842 Y0.4937 I-0.1607 J-0.2531
G3 X0.9602 Y0.4041 I-0.0045 J-0.3134
G3 X0.9124 Y0.3396 I0.1696 J-0.1757
G3 X0.8761 Y0.2256 I0.3481 J-0.1739
G3 X0.8669 Y0.1063 I0.7033 J-0.1142
G3 X0.867 Y0.0872 I0.474 J-0.0059
G0 Z0.125
G0 X1.7691
G1 F10.0 Z-0.001
G1 F60.0 Y0.5826
G1 X1.8826
G1 Y0.0552
G1 X2.1514 Y0.3277
G1 X2.2984
G1 X2.0422 Y0.0792
G1 X2.3243 Y-0.3423
G1 X2.1842
G1 X1.9627 Y0.0003
G1 X1.8826 Y-0.0767
G1 Y-0.3423
G1 X1.7691
G1 Y0.0872
G0 Z0.125
G0 X2.3737 Y0.0387
G1 F10.0 Z-0.001
G2 F60.0 X2.3936 Y0.142 I0.4767 J-0.0383
G2 X2.4757 Y0.2684 I0.2668 J-0.0833
G2 X2.5741 Y0.3252 I0.1952 J-0.225
G2 X2.6864 Y0.3429 I0.109 J-0.3265
G2 X2.8089 Y0.3214 I0.0042 J-0.3359
G2 X2.9123 Y0.252 I-0.1045 J-0.2674
G2 X2.9809 Y0.1358 I-0.2103 J-0.2027
G2 X3.0 Y0.0022 I-0.4192 J-0.1278
G2 X2.9922 Y-0.102 I-0.6432 J-0.0046
G2 X2.9608 Y-0.2016 I-0.3284 J0.0487
G2 X2.8479 Y-0.3164 I-0.2422 J0.1253
G2 X2.6864 Y-0.3574 I-0.1586 J0.2861
G2 X2.563 Y-0.3364 I-0.0045 J0.3461
G2 X2.4586 Y-0.2672 I0.1004 J0.2648
G2 X2.3902 Y-0.1456 I0.2134 J0.2001
G2 X2.3722 Y-0.0073 I0.4726 J0.1318
G2 X2.3737 Y0.0387 I0.4782 J0.0077
G0 Z0.125
G0 X2.4901 Y0.0298
G1 F10.0 Z-0.001
G3 F60.0 X2.4889 Y-0.0073 I0.4225 J-0.032
G3 X2.5 Y-0.1088 I0.4249 J-0.0051
G3 X2.5451 Y-0.2003 I0.2117 J0.0474
G3 X2.6864 Y-0.2641 I0.1376 J0.1166
G3 X2.8271 Y-0.1997 I0.0032 J0.1789
G3 X2.8724 Y-0.1065 I-0.1677 J0.1391
G3 X2.8832 Y-0.0035 I-0.432 J0.0977
G3 X2.8719 Y0.0957 I-0.3951 J0.0049
G3 X2.8265 Y0.1845 I-0.2065 J-0.0494
G3 X2.6864 Y0.2489 I-0.1372 J-0.1139
G3 X2.5451 Y0.1852 I-0.0037 J-0.1803
G3 X2.4999 Y0.0939 I0.164 J-0.1379
G3 X2.4901 Y0.0298 I0.4127 J-0.0961
G0 Z0.125
M5
M30

View File

@ -1,50 +0,0 @@
# Part of Grbl Simulator
#
# Copyright (c) 2012 Jens Geisler
#
# Grbl is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Grbl is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Grbl. If not, see <http://www.gnu.org/licenses/>.
PLATFORM = WINDOWS
OBJECTS = main.o simulator.o serial.o ../main.o ../protocol.o ../planner.o ../settings.o ../print.o ../nuts_bolts.o eeprom.o ../serial.o avr/pgmspace.o avr/interrupt.o avr/io.o util/delay.o util/floatunsisf.o ../stepper.o ../gcode.o ../spindle_control.o ../motion_control.o ../limits.o ../report.o ../coolant_control.o ../probe.o ../system.o platform_$(PLATFORM).o
CLOCK = 16000000
EXE_NAME = grbl_sim.exe
COMPILE = $(CC) -Wall -g -DF_CPU=$(CLOCK) -include config.h -I. -DPLAT_$(PLATFORM)
LINUX_LIBRARIES = -lrt -pthread
WINDOWS_LIBRARIES =
# symbolic targets:
all: main
new: clean main
clean:
rm -f $(EXE_NAME) $(OBJECTS)
# file targets:
main: $(OBJECTS)
$(COMPILE) -o $(EXE_NAME) $(OBJECTS) -lm $($(PLATFORM)_LIBRARIES)
%.o: %.c
$(COMPILE) -c $< -o $@
../planner.o: ../planner.c
$(COMPILE) -include planner_inject_accessors.c -c $< -o $@
../serial.o: ../serial.c
$(COMPILE) -include serial_hooks.h -c $< -o $@
../main.o: ../main.c
$(COMPILE) -include rename_main.h -c $< -o $@

View File

@ -1,18 +0,0 @@
GRBL SIM : by Jens Geisler
This directory contains an experimental Grbl simulator that compiles the main Grbl source code into a wrapped executable for use on a computer. No Arduino required. When the executable is run, the user should be able to interact with the Grbl simulator as if connected to an Arduino with Grbl.
WARNING: Grbl Sim is under heavy development. So many things may not work, or respond in ways unexpected. At the moment, this code is a proof-of-concept.
What can you do with Grbl Sim?
- Simply checking out how Grbl works without needing an Arduino.
- Visualize a g-code program by having the simulator parse and execute to a GUI. Fluctuations in feed rates by the acceleration planner can be viewed as well.
- A powerful debugging tool for development.
- Each of the AVR functions are replaced with dummy functions, like the stepper ISR. These could be written to whatever you need. For example, output simulated step pulses over time and examine its performance.
Realtime modifications by Adam Shelly:
Simulates Atmel hardware in separate thread. Runs in aproximate realtime.
On Linux, use `socat PTY,raw,link=/dev/ttyFAKE,echo=0 "EXEC:'./grbl_sim.exe -n -s step.out -b block.out',pty,raw,echo=0"` to create a fake serial port connected to the simulator. This is useful for testing grbl interface software.

View File

@ -1,154 +0,0 @@
/*
interrupt.c - replacement for the avr library of the same name to provide
dummy register variables
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#include "interrupt.h"
#include "io.h"
#include "wdt.h"
//pseudo-Interrupt vector table
isr_fp compa_vect[6]={0};
isr_fp compb_vect[6]={0};
isr_fp ovf_vect[6]={0};
isr_fp wdt_vect = 0;
isr_fp pc_vect = 0;
void sei() {io.sreg|=SEI;}
void cli() {io.sreg&=~SEI;}
int16_t sim_scaling[8]={0,1,8,64,256,1024,1,1}; //clock scalars
//Timer/Counter modes: these are incomplete, but enough for this application
enum sim_wgm_mode {
wgm_NORMAL,
wgm_CTC,
wgm_FAST_PWM,
wgm_PHASE_PWM,
wgm_PH_F_PWM,
wgm_RESERVED
};
//3-bit wgm table for 8-bit timers
enum sim_wgm_mode sim_wgm_3[] = {wgm_NORMAL,wgm_PHASE_PWM,wgm_CTC,wgm_FAST_PWM,
wgm_RESERVED,wgm_PHASE_PWM, wgm_RESERVED, wgm_FAST_PWM};
//4-bit wgm modes for 16-bit timers
enum sim_wgm_mode sim_wgm_4[16] = {wgm_NORMAL,wgm_PHASE_PWM,wgm_PHASE_PWM,wgm_PHASE_PWM,
wgm_CTC, wgm_FAST_PWM, wgm_FAST_PWM, wgm_FAST_PWM,
wgm_PH_F_PWM, wgm_PH_F_PWM, wgm_PHASE_PWM, wgm_PHASE_PWM,
wgm_CTC, wgm_RESERVED, wgm_FAST_PWM, wgm_FAST_PWM};
static const uint16_t timer_bitdepth[SIM_N_TIMERS] = {
0xFF,0xFFFF,0xFF,
//0xFFFF,0xFFFF,0xFFFF 3 more for mega
};
void timer_interrupts() {
int i;
uint8_t ien = io.sreg&SEI; //interrupts enabled?
io.prescaler++;
//all clocks
for (i=0;i<SIM_N_TIMERS;i++){
uint8_t cs = io.tccrb[i]&7; //clock select bits
int16_t increment = sim_scaling[cs];
uint16_t bitmask = timer_bitdepth[i];
//check scaling to see if timer fires
if (increment && (io.prescaler&(increment-1))==0) {
//select waveform generation mode
enum sim_wgm_mode mode;
if (i==0 || i==2) { //(T0 and T2 use only 3 wgm bits)
uint8_t wgm = ((io.tccrb[i]&0x08)>>1) | (io.tccra[i]&3);
mode = sim_wgm_3[wgm];
}
else {
uint8_t wgm = ((io.tccrb[i]&0x18)>>1) | (io.tccra[i]&3); //4 wgm bits
mode = sim_wgm_4[wgm];
}
//tick
if (io.tifr[i]&(1<<SIM_ROLL)) { //handle CTC mode rollover
io.tcnt[i]=0;
io.tifr[i]&=~(1<<SIM_ROLL);
}
else {
io.tcnt[i]++;
}
io.tcnt[i]&=bitmask; //limit the 8 bit timers
switch (mode) {
case wgm_NORMAL: //Normal mode, ovf on rollover
if (io.tcnt[i]==0) io.tifr[i]|=(1<<SIM_TOV); //overflow
break;
case wgm_CTC: //CTC mode, ovf at TOP, 0 next tick
if (io.tcnt[i]==(io.ocra[i]&bitmask)) {
io.tifr[i]|=(1<<SIM_TOV)|(1<<SIM_ROLL); //overflow
}
break;
default: //unsupported
break;
}
//comparators
if ((io.timsk[i]&(1<<SIM_OCA)) && io.tcnt[i]==(io.ocra[i]&bitmask)) io.tifr[i]|=(1<<SIM_OCA);
if ((io.timsk[i]&(1<<SIM_OCB)) && io.tcnt[i]==(io.ocrb[i]&bitmask)) io.tifr[i]|=(1<<SIM_OCB);
if ((io.timsk[i]&(1<<SIM_OCC)) && io.tcnt[i]==(io.ocrc[i]&bitmask)) io.tifr[i]|=(1<<SIM_OCC);
//call any triggered interupts
if (ien && io.tifr[i]) {
if (compa_vect[i] && (io.tifr[i]&(1<<SIM_OCA))) {
compa_vect[i]();
io.tifr[i]&=~(1<<SIM_OCA);
//TODO: insert port_monitor call here
}
if (compb_vect[i] && (io.tifr[i]&(1<<SIM_OCB))) {
compb_vect[i]();
io.tifr[i]&=~(1<<SIM_OCB);
}
if (ovf_vect[i] && (io.tifr[i]&(1<<SIM_TOV))) {
ovf_vect[i]();
io.tifr[i]&=~(1<<SIM_TOV);
}
}
}
}
//// TODO for more complete timer sim.
// pwm modes. (only used for variable spindle, I think).
// -- would require fixing wgm mode for Timers1..5
// -- phase correct modes need updown counter.
// output pins (also only for variable spindle, I think).
//// Other chip features not needed yet for grbl:
// writes to TCNT0 prevent compare match (need write detector.)
// force output compare (unused)
// input capture (unused and how would we signal it?)
// define the other output compare registers.
// usercode can clear unhandled interrupt flags by writing 1.
// --(this may be impossible, since bit was 1 before the write.)
// prescaler reset.
// maybe need to cli on interrupt entry
}

View File

@ -1,58 +0,0 @@
/*
interrupt.h - replacement for the avr include of the same name to provide
dummy register variables and macros
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef interrupt_h
#define interrupt_h
// macros to turn avr interrupts into regular functions
//#define TIMER1_COMPA_vect
#define ISR(a) void interrupt_ ## a ()
// Stubs of the hardware interrupt functions we are using
void interrupt_TIMER0_COMPA_vect();
void interrupt_TIMER1_COMPA_vect();
void interrupt_TIMER0_OVF_vect();
void interrupt_SERIAL_UDRE();
void interrupt_SERIAL_RX();
void interrupt_LIMIT_INT_vect();
void interrupt_WDT_vect();
//pseudo-Interrupt vector table
typedef void(*isr_fp)(void);
extern isr_fp compa_vect[6];
extern isr_fp compb_vect[6];
extern isr_fp ovf_vect[6];
extern isr_fp wdt_vect;
extern isr_fp pc_vect; //pin change
// enable interrupts now does something in the simulation environment
#define SEI 0x80
void sei();
void cli();
//simulate timer operation
void timer_interrupts();
#endif

View File

@ -1,4 +0,0 @@
#include "io.h"
// dummy register variables
volatile io_sim_t io={{0}};

View File

@ -1,224 +0,0 @@
/*
interrupt.h - replacement for the avr include of the same name to provide
dummy register variables and macros
Part of Grbl Simulator
Copyright (c) 2012-2104 Jens Geisler, Adam Shelly
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef io_h
#define io_h
#include <inttypes.h>
union hilo16 {
uint16_t w;
struct {
uint8_t l; //TODO: check that these are right order on x86. Doesn't matter for current usage, but might someday
uint8_t h;
};
};
enum {
SIM_A, SIM_B, SIM_C, SIM_D, SIM_E,
SIM_F, SIM_G, SIM_H, SIM_J, SIM_K, SIM_L,
SIM_PORT_COUNT
};
#define SIM_N_TIMERS 3 //328p has 3, Mega has 6
// dummy register variables
typedef struct io_sim {
uint8_t ddr[SIM_PORT_COUNT];
uint8_t port[SIM_PORT_COUNT];
uint8_t pin[SIM_PORT_COUNT];
uint8_t timsk[SIM_N_TIMERS];
uint16_t ocra[SIM_N_TIMERS];
uint16_t ocrb[SIM_N_TIMERS];
uint16_t ocrc[SIM_N_TIMERS];
uint16_t tcnt[SIM_N_TIMERS]; //tcint0 is really only 8bit
uint8_t tccra[SIM_N_TIMERS];
uint8_t tccrb[SIM_N_TIMERS];
uint8_t tifr[SIM_N_TIMERS];
uint8_t pcicr;
uint8_t pcmsk[3];
uint8_t ucsr0[3];
uint8_t udr[3];
uint8_t gpior[3];
uint8_t mcusr;
uint8_t wdtcsr;
union hilo16 ubrr0;
uint16_t prescaler; //continuously running
uint8_t sreg;
} io_sim_t;
volatile extern io_sim_t io;
// dummy macros for interrupt related registers
#define PORTA io.port[SIM_A]
#define PORTB io.port[SIM_B]
#define PORTC io.port[SIM_C]
#define PORTD io.port[SIM_D]
#define PORTE io.port[SIM_E]
#define PORTF io.port[SIM_F]
#define PORTG io.port[SIM_G]
#define PORTH io.port[SIM_H]
#define PORTJ io.port[SIM_J]
#define PORTK io.port[SIM_K]
#define PORTL io.port[SIM_L]
#define DDRA io.ddr[SIM_A]
#define DDRB io.ddr[SIM_B]
#define DDRC io.ddr[SIM_C]
#define DDRD io.ddr[SIM_D]
#define DDRE io.ddr[SIM_E]
#define DDRF io.ddr[SIM_F]
#define DDRG io.ddr[SIM_G]
#define DDRH io.ddr[SIM_H]
#define DDRJ io.ddr[SIM_J]
#define DDRK io.ddr[SIM_K]
#define DDRL io.ddr[SIM_L]
#define PINA io.pin[SIM_A]
#define PINB io.pin[SIM_B]
#define PINC io.pin[SIM_C]
#define PIND io.pin[SIM_D]
#define PINE io.pin[SIM_E]
#define PINF io.pin[SIM_F]
#define PING io.pin[SIM_G]
#define PINH io.pin[SIM_H]
#define PINJ io.pin[SIM_J]
#define PINK io.pin[SIM_K]
#define PINL io.pin[SIM_L]
#define TIMSK0 io.timsk[0]
#define TIMSK1 io.timsk[1]
#define TIMSK2 io.timsk[2]
#define TIMSK3 io.timsk[3]
#define TIMSK4 io.timsk[4]
#define TIMSK5 io.timsk[5]
#define SIM_TOV 0
#define SIM_OCA 1
#define SIM_OCB 2
#define SIM_OCC 3
#define SIM_ICI 5
#define SIM_ROLL 7 //stealing reserved TIFR bit
#define OCIE0A SIM_OCA
#define OCIE0B SIM_OCB
#define TOIE0 SIM_TOV
#define ICIE1 SIM_ICI
#define OCIE1C SIM_OCC
#define OCIE1B SIM_OCB
#define OCIE1A SIM_OCA
#define TOIE1 SIM_ICI
#define ICIE2 SIM_ICI
#define OCIE2C SIM_OCC
#define OCIE2B SIM_OCB
#define OCIE2A SIM_OCA
#define TOIE2 SIM_TOV
#define OCR0A io.ocra[0]
#define OCR1A io.ocra[1]
#define OCR2A io.ocra[2]
//There are more..
#define TCNT0 io.tcnt[0]
#define TCNT1 io.tcnt[1]
#define TCNT2 io.tcnt[2]
#define TCCR0A io.tccra[0]
#define TCCR0B io.tccrb[0]
#define TCCR1A io.tccra[1]
#define TCCR1B io.tccrb[1]
#define TCCR2A io.tccra[2]
#define TCCR2B io.tccrb[2]
#define CS00 0
#define CS01 1
#define CS12 2
#define CS11 1
#define CS10 0
#define CS21 1
#define WGM13 4
#define WGM12 3
#define WGM11 1
#define WGM10 0
#define WGM21 1
#define COM1A1 7
#define COM1A0 6
#define COM1B1 5
#define COM1B0 4
#define COM1C1 3
#define COM1C0 2
#define PCICR io.pcicr
#define PCIE0 0
#define PCIE1 1
#define PCIE2 2
//serial channel
#define UCSR0A io.ucsr0[SIM_A]
#define UCSR0B io.ucsr0[SIM_B]
#define UDR0 io.udr[0]
#define UDRIE0 0
#define RXCIE0 1
#define RXEN0 2
#define TXEN0 3
#define U2X0 4
#define UBRR0H io.ubrr0.h
#define UBRR0L io.ubrr0.l
#define PCMSK0 io.pcmsk[0]
#define PCMSK1 io.pcmsk[1]
#define PCMSK2 io.pcmsk[2]
//GPIO
#define GPIOR0 io.gpior[0]
#define GPIOR1 io.gpior[1]
#define GPIOR2 io.gpior[2]
//MCU Status
#define MCUSR io.mcusr
#define PORF 0
#define EXTRF 1
#define BORF 2
#define WDRF 3
#define JTRF 4
//Interrupt Status
#define SREG io.sreg
#endif

View File

@ -1,26 +0,0 @@
/*
pgmspace.c - replacement for the avr library of the same name to provide
dummy functions
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
// this is not really ever called in the simulation
char pgm_read_byte_near(const char* s) {
return s[0];
}

View File

@ -1,30 +0,0 @@
/*
pgmspace.h - replacement for the avr include of the same name to provide
dummy functions andd macros
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef pgmspace_h
#define pgmspace_h
#define PSTR(s) s
char pgm_read_byte_near(const char* s);
#endif

View File

@ -1,21 +0,0 @@
/*
sleep.h - dummy replacement for the avr include of the same name
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/

View File

@ -1,11 +0,0 @@
#define WDTCSR wdt
#define WDP0 0
#define WDP1 1
#define WDP2 2
#define WDE 3
#define WDCE 4
#define WDP3 5
#define WDIE 6
#define WDIF 7
uint16_t wdt;

View File

@ -1,28 +0,0 @@
/*
config.h - replacement for the include of the same name in grbl
to define dummy registers
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef config_h
#include "../config.h"
#include <inttypes.h>
#define AUTO_REPORT_MOVE_DONE
#endif

View File

@ -1,95 +0,0 @@
/*
eeprom.c - replacement for the avr library of the same name to provide
dummy functions
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
// These are never called in the simulator
#include <stdio.h>
#define MAX_EEPROM_SIZE 4096 //4KB EEPROM in Mega
FILE* eeprom_create_empty_file(){
FILE* fp = fopen("EEPROM.DAT","w+b");
int i;
if (fp){
for(i=0;i<MAX_EEPROM_SIZE;i++){
fputc(0,fp);
}
fseek(fp,0,SEEK_SET);
}
return fp;
}
FILE* eeprom_fp(){
static FILE* EEPROM_FP = NULL;
static int tried= 0;
if (!EEPROM_FP && !tried){
tried = 1;
EEPROM_FP = fopen("EEPROM.DAT","r+b");
if (!EEPROM_FP) {
EEPROM_FP = eeprom_create_empty_file();
}
}
return EEPROM_FP;
}
void eeprom_close(){
FILE* fp = eeprom_fp();
fclose(fp);
}
unsigned char eeprom_get_char( unsigned int addr ) {
FILE* fp = eeprom_fp();
if (fseek(fp,addr,SEEK_SET)) { return 0; } //no such address
return fgetc(fp);
}
void eeprom_put_char( unsigned int addr, unsigned char new_value ) {
FILE* fp = eeprom_fp();
if (fseek(fp,addr,SEEK_SET)) { return; } //no such address
fputc(new_value, fp);
}
// Extensions added as part of Grbl
// KEEP IN SYNC WITH ../eeprom.c
void memcpy_to_eeprom_with_checksum(unsigned int destination, char *source, unsigned int size) {
unsigned char checksum = 0;
for(; size > 0; size--) {
checksum = (checksum << 1) || (checksum >> 7);
checksum += *source;
eeprom_put_char(destination++, *(source++));
}
eeprom_put_char(destination, checksum);
}
int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size) {
unsigned char data, checksum = 0;
for(; size > 0; size--) {
data = eeprom_get_char(source++);
checksum = (checksum << 1) || (checksum >> 7);
checksum += data;
*(destination++) = data;
}
return(checksum == eeprom_get_char(source));
}
// end of file

View File

@ -1,3 +0,0 @@
#include "../eeprom.h"
void eeprom_close();

View File

@ -1,6 +0,0 @@
t_= NaN
x_= NaN
y_= NaN
z_= NaN
splot 'HelloWorldSteps.dat' u 2:3:4:(dx= $2-x_,x_=$2,dy=$3-y_,y_=$3,dz=$4-z_,z_=$4,dt=$1-t_,t_=$1,sqrt(dx*dx+dy*dy+dz*dz)/(dt<0.01?0.01:dt)) title "Simulated steps with speed dependent coloring" with lines palette

View File

@ -1,166 +0,0 @@
/*
main.c - main grbl simulator program
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include "../planner.h"
#include "../stepper.h"
#include "../gcode.h"
#include "../protocol.h"
#include "../nuts_bolts.h"
#include "../settings.h"
#include "../spindle_control.h"
#include "../limits.h"
#include "../coolant_control.h"
#include "simulator.h"
arg_vars_t args;
const char* progname;
int usage(const char* badarg){
if (badarg){
printf("Unrecognized option %s\n",badarg);
}
printf("Usage: \n"
"%s [options] [time_step] [block_file]\n"
" Options:\n"
" -r <report time> : minimum time step for printing stepper values. Default=0=no print.\n"
" -t <time factor> : multiplier to realtime clock. Default=1. (needs work)\n"
" -g <response file> : file to report responses from grbl. default = stdout\n"
" -b <block file> : file to report each block executed. default = stdout\n"
" -s <step file> : file to report each step executed. default = stderr\n"
" -c<comment_char> : character to print before each line from grbl. default = '#'\n"
" -n : no comments before grbl response lines.\n"
" -h : this help.\n"
"\n <time_step> and <block_file> can be specifed with option flags or positional parameters\n"
"\n ^-F to shutdown cleanly\n\n",
progname);
return -1;
}
//prototype for renamed original main function
int avr_main(void);
//wrapper for thread interface
PLAT_THREAD_FUNC(avr_main_thread,exit){
avr_main();
return NULL;
}
int main(int argc, char *argv[]) {
uint32_t tick_rate=1;
int positional_args=0;
//defaults
args.step_out_file = stderr;
args.block_out_file = stdout;
args.grbl_out_file = stdout;
args.comment_char = '#';
args.step_time = 0.0;
// Get the minimum time step for printing stepper values.
// If not given or the command line cannot be parsed to a float than
// step_time= 0.0; This means to not print stepper values at all
progname = argv[0];
while (argc>1) {
argv++;argc--;
if (argv[0][0] == '-'){
switch(argv[0][1]){
case 'c': //set Comment char
args.comment_char = argv[0][2];
break;
case 'n': //No comment char on grbl responses
args.comment_char = 0;
break;
case 't': //Tick rate
argv++;argc--;
tick_rate = atof(*argv);
break;
case 'b': //Block file
argv++;argc--;
args.block_out_file = fopen(*argv,"w");
break;
case 's': //Step out file.
argv++;argc--;
args.step_out_file = fopen(*argv,"w");
break;
case 'g': //Grbl output
argv++;argc--;
args.grbl_out_file = fopen(*argv,"w");
break;
case 'r': //step_time for Reporting
argv++;argc--;
args.step_time= atof(*argv);
break;
case 'h':
return usage(NULL);
default:
return usage(*argv);
}
}
else { //handle old positional argument interface
positional_args++;
switch(positional_args){
case 1:
args.step_time= atof(*argv);
break;
case 2: //block out and grbl out to same file, like before.
args.block_out_file = fopen(*argv,"w");
args.grbl_out_file = args.block_out_file;
break;
default:
return usage(*argv);
}
}
}
// Make sure the output streams are flushed immediately.
// This is important when using the simulator inside another application in parallel
// to the real grbl.
// Theoretically flushing could be limited to complete lines. Unfortunately Windows
// does not know line buffered streams. So for now we stick to flushing every character.
//setvbuf(stdout, NULL, _IONBF, 1);
//setvbuf(stderr, NULL, _IONBF, 1);
//( Files are now closed cleanly when sim gets EOF or CTRL-F.)
platform_init();
init_simulator(tick_rate);
//launch a thread with the original grbl code.
plat_thread_t*th = platform_start_thread(avr_main_thread);
if (!th){
printf("Fatal: Unable to start hardware thread.\n");
exit(-5);
}
//All the stream io and interrupt happen in this thread.
sim_loop();
platform_kill_thread(th); //need force kill since original main has no return.
// Graceful exit
shutdown_simulator(0);
platform_terminate();
exit(EXIT_SUCCESS);
}

View File

@ -1,10 +0,0 @@
#include "../planner.h"
static plan_block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instructions
plan_block_t *get_block_buffer() { return block_buffer; }
static uint8_t block_buffer_head; // Index of the next block to be pushed
uint8_t get_block_buffer_head() { return block_buffer_head; }
static uint8_t block_buffer_tail; // Index of the next block to be pushed
uint8_t get_block_buffer_tail() { return block_buffer_tail; }

View File

@ -1,23 +0,0 @@
#ifndef platform_h
#ifdef PLAT_LINUX
#include "platform_linux.h"
#else
#include "platform_windows.h"
#endif
#define platform_h
void platform_init();
void platform_terminate();
plat_thread_t* platform_start_thread(plat_threadfunc_t func);
void platform_stop_thread(plat_thread_t* thread);
void platform_kill_thread(plat_thread_t* thread);
uint32_t platform_ns(); //monotonically increasing nanoseconds since program start.
void platform_sleep(long microsec); //sleep for suggested time in microsec.
uint8_t platform_poll_stdin(); //non-blocking stdin read - returns 0 if no char present, 0xFF for EOF
#endif

View File

@ -1,116 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <time.h>
#include <sys/time.h>
#include "platform.h"
#define MS_PER_SEC 1000000
//any platform-specific setup that must be done before sim starts here
void platform_init()
{
}
//cleanup int here;
void platform_terminate()
{
}
//returns a free-running 32 bit nanosecond counter which rolls over
uint32_t platform_ns()
{
static uint32_t gTimeBase = 0;
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC,&ts);
if (gTimeBase== 0){gTimeBase=ts.tv_nsec;}
return ts.tv_nsec-gTimeBase;
}
//sleep in microseconds
void platform_sleep(long microsec)
{
struct timespec ts={0};
while (microsec >= MS_PER_SEC){
ts.tv_sec++;
microsec-=MS_PER_SEC;
}
ts.tv_nsec = microsec*1000;
nanosleep(&ts,NULL);
}
#define SIM_ECHO_TERMINAL 1 //use this to make grbl_sim act like a serial terminal with local echo on.
//set terminal to allow kbhit detection
void enable_kbhit(int dir)
{
static struct termios oldt, newt;
if ( dir == 1 )
{
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON );
if (!SIM_ECHO_TERMINAL) {
newt.c_lflag &= ~( ECHO );
}
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
}
else
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
//detect key pressed
int kbhit (void)
{
struct timeval tv={0};
fd_set rdfs={{0}};
int retval;
/* tv.tv_sec = 0; */
/* tv.tv_usec = 0; */
/* FD_ZERO(&rdfs); */
FD_SET (STDIN_FILENO, &rdfs);
select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
retval = FD_ISSET(STDIN_FILENO, &rdfs);
return retval;
}
plat_thread_t* platform_start_thread(plat_threadfunc_t threadfunc) {
plat_thread_t* th = malloc(sizeof(plat_thread_t));
if (pthread_create(&th->tid, NULL, threadfunc, &th->exit)){
free(th);
return NULL;
}
return th;
}
//ask thread to exit nicely, wait
void platform_stop_thread(plat_thread_t* th){
th->exit = 1;
pthread_join(th->tid,NULL);
}
//force-kill thread
void platform_kill_thread(plat_thread_t* th){
th->exit = 1;
pthread_cancel(th->tid);
}
//return char if one available.
uint8_t platform_poll_stdin() {
uint8_t char_in=0;
enable_kbhit(1);
if ( kbhit()) {
char_in = getchar();
}
enable_kbhit(0);
return char_in;
}

View File

@ -1,75 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include "platform.h"
#define NS_PER_SEC 1000000000
#define MICRO_PER_MILLI 1000
double ns_per_perfcount;
//any platform-specific setup that must be done before sim starts here
void platform_init()
{
__int64 counts_per_sec;
QueryPerformanceFrequency((LARGE_INTEGER*)&counts_per_sec);
ns_per_perfcount = (float)NS_PER_SEC / counts_per_sec;
}
//cleanup int here;
void platform_terminate()
{
}
//returns a free-running 32 bit nanosecond counter which rolls over
uint32_t platform_ns()
{
static uint32_t gTimeBase = 0;
__int64 counts;
uint32_t ns;
QueryPerformanceCounter((LARGE_INTEGER*)&counts);
ns = (counts*ns_per_perfcount);
if (gTimeBase== 0){gTimeBase=ns;}
return ns-gTimeBase;
}
//sleep in microseconds
void platform_sleep(long microsec)
{
Sleep(microsec/MICRO_PER_MILLI);
}
//create a thread
plat_thread_t* platform_start_thread(plat_threadfunc_t threadfunc) {
plat_thread_t* th = malloc(sizeof(plat_thread_t));
th->tid = CreateThread(NULL,0,threadfunc,&th->exit,0,NULL);
if (!th->tid){
free(th);
return NULL;
}
return th;
}
//ask thread to exit nicely, wait
void platform_stop_thread(plat_thread_t* th){
th->exit = 1;
WaitForSingleObject(th->tid,INFINITE);
}
//force-kill thread
void platform_kill_thread(plat_thread_t* th){
th->exit = 1;
TerminateThread(th->tid, 0);
}
//return char if one available.
uint8_t platform_poll_stdin() {
if (_kbhit()) {
return getch();
}
return 0;
}

View File

@ -1,16 +0,0 @@
#ifdef platform_h
#error "platform implementation already defined"
#else
#include <pthread.h>
typedef struct {
pthread_t tid;
int exit;
} plat_thread_t;
typedef void*(*plat_threadfunc_t)(void*);
#define PLAT_THREAD_FUNC(name,arg) void* name(void* arg)
#endif

View File

@ -1,16 +0,0 @@
#ifdef platform_h
#error "platform implementation already defined"
#else
#include <windows.h>
typedef struct {
HANDLE tid;
int exit;
} plat_thread_t;
typedef DWORD WINAPI(*plat_threadfunc_t)(LPVOID);
#define PLAT_THREAD_FUNC(name,arg) DWORD WINAPI name(LPVOID arg)
#endif

View File

@ -1 +0,0 @@
#define main avr_main

View File

@ -1,74 +0,0 @@
/*
serial.c - replacement for the modul of the same name in grbl
Make sure the simulator reads from stdin and writes to stdout.
Also print info about the last buffered block.
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#include "../serial.h"
#include <stdio.h>
#include "simulator.h"
#include <stdio.h>
//prototypes for overridden functions
uint8_t orig_serial_read();
//used to inject a sleep in grbl main loop,
// ensures hardware simulator gets some cycles in "parallel"
uint8_t serial_read() {
platform_sleep(0);
return orig_serial_read();
}
void simulate_write_interrupt(){
while (UCSR0B & (1<<UDRIE0)){
interrupt_SERIAL_UDRE();
grbl_out(UDR0);
}
}
void simulate_read_interrupt(){
uint8_t char_in = platform_poll_stdin();
if (char_in) {
UDR0 = char_in;
//EOF or CTRL-F to exit
if (UDR0 == EOF || UDR0 == 0xFF || UDR0 == 0x06 ) {
sim.exit = 1;
}
//debugging
if (UDR0 == '%') {
printf("%ld %f\n",sim.masterclock,(double)sim.sim_time);
}
interrupt_SERIAL_RX();
}
}
extern volatile uint8_t rx_buffer_head;
extern volatile uint8_t rx_buffer_tail;
void simulate_serial(){
simulate_write_interrupt();
uint8_t head = rx_buffer_head+1;
if (head==RX_BUFFER_SIZE) { head = 0; }
if (head!=rx_buffer_tail) {
simulate_read_interrupt();
}
}

View File

@ -1,2 +0,0 @@
#define serial_read orig_serial_read

View File

@ -1 +0,0 @@
grbl_sim.exe 0.01 <HelloWorld.nc >HelloWorld.dat 2> HelloWorldSteps.dat

View File

@ -1,2 +0,0 @@
./grbl_sim.exe 0.01 <HelloWorld.nc >HelloWorld.dat 2> HelloWorldSteps.dat
gnuplot -persist gnuplot.plt

View File

@ -1,228 +0,0 @@
/*
simulator.c - functions to simulate how the buffer is emptied and the
stepper interrupt is called
Part of Grbl Simulator
Copyright (c) 2012-2014 Jens Geisler, Adam Shelly
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdio.h>
#include "../stepper.h"
#include "../planner.h"
#include "../nuts_bolts.h"
#include "simulator.h"
#include "avr/interrupt.h" //for registers and isr declarations.
#include "eeprom.h"
int block_position[N_AXIS]= {0}; //step count after most recently planned block
uint32_t block_number= 0;
sim_vars_t sim={0};
//local prototypes
void print_steps(bool force);
//setup
void init_simulator(float time_multiplier) {
//register the interrupt handlers we actually use.
compa_vect[1] = interrupt_TIMER1_COMPA_vect;
ovf_vect[0] = interrupt_TIMER0_OVF_vect;
#ifdef STEP_PULSE_DELAY
compa_vect[0] = interrupt_TIMER0_COMPA_vect;
#endif
#ifdef ENABLE_SOFTWARE_DEBOUNCE
wdt_vect = interrupt_WDT_vect;
#endif
pc_vect = interrupt_LIMIT_INT_vect;
sim.next_print_time = args.step_time;
sim.speedup = time_multiplier;
sim.baud_ticks = (int)((double)F_CPU*8/BAUD_RATE); //ticks per byte
}
//shutdown simulator - close open files
int shutdown_simulator(uint8_t exitflag) {
fclose(args.block_out_file);
print_steps(1);
fclose(args.step_out_file);
fclose(args.grbl_out_file);
eeprom_close();
return 1/(!exitflag); //force exception, since avr_main() has no returns.
}
void simulate_hardware(bool do_serial){
//do one tick
sim.masterclock++;
sim.sim_time = (float)sim.masterclock/F_CPU;
timer_interrupts();
if (do_serial) simulate_serial();
//TODO:
// check limit pins, call pinchange interrupt if enabled
// can ignore pinout int vect - hw start/hold not supported
}
//runs the hardware simulator at the desired rate until sim.exit is set
void sim_loop(){
uint64_t simulated_ticks=0;
uint32_t ns_prev = platform_ns();
uint64_t next_byte_tick = F_CPU; //wait 1 sec before reading IO.
while (!sim.exit || sys.state>2 ) { //don't quit until idle
if (sim.speedup) {
//calculate how many ticks to do.
uint32_t ns_now = platform_ns();
uint32_t ns_elapsed = (ns_now-ns_prev)*sim.speedup; //todo: try multipling nsnow
simulated_ticks += F_CPU/1e9*ns_elapsed;
ns_prev = ns_now;
}
else {
simulated_ticks++; //as fast as possible
}
while (sim.masterclock < simulated_ticks){
//only read serial port as fast as the baud rate allows
bool read_serial = (sim.masterclock >= next_byte_tick);
//do low level hardware
simulate_hardware(read_serial);
//print the steps.
//For further decoupling, could maintain own counter of STEP_PORT pulses,
// print that instead of sys.position.
print_steps(0);
if (read_serial){
next_byte_tick+=sim.baud_ticks;
//recent block can only change after input, so check here.
printBlock();
}
//TODO:
// set limit pins based on position,
// set probe pin when probing.
// if VARIABLE_SPINDLE, measure pwm pin to report speed?
}
platform_sleep(0); //yield
}
}
//show current position in steps
void print_steps(bool force)
{
static plan_block_t* printed_block = NULL;
plan_block_t* current_block = plan_get_current_block();
if (sim.next_print_time == 0.0) { return; } //no printing
if (current_block != printed_block ) {
//new block.
if (block_number) { //print values from the end of prev block
fprintf(args.step_out_file, "%20.15f %d, %d, %d\n", sim.sim_time, sys.position[X_AXIS], sys.position[Y_AXIS], sys.position[Z_AXIS]);
}
printed_block = current_block;
if (current_block == NULL) { return; }
// print header
fprintf(args.step_out_file, "# block number %d\n", block_number++);
}
//print at correct interval while executing block
else if ((current_block && sim.sim_time>=sim.next_print_time) || force ) {
fprintf(args.step_out_file, "%20.15f %d, %d, %d\n", sim.sim_time, sys.position[X_AXIS], sys.position[Y_AXIS], sys.position[Z_AXIS]);
fflush(args.step_out_file);
//make sure the simulation time doesn't get ahead of next_print_time
while (sim.next_print_time<=sim.sim_time) sim.next_print_time += args.step_time;
}
}
//Functions for peeking inside planner state:
plan_block_t *get_block_buffer();
uint8_t get_block_buffer_head();
uint8_t get_block_buffer_tail();
// Returns the index of the previous block in the ring buffer
uint8_t prev_block_index(uint8_t block_index)
{
if (block_index == 0) { block_index = BLOCK_BUFFER_SIZE; }
block_index--;
return(block_index);
}
plan_block_t *plan_get_recent_block() {
if (get_block_buffer_head() == get_block_buffer_tail()) { return(NULL); }
return(get_block_buffer()+prev_block_index(get_block_buffer_head()));
}
// Print information about the most recently inserted block
// but only once!
void printBlock() {
plan_block_t *b;
static plan_block_t *last_block;
b= plan_get_recent_block();
if(b!=last_block && b!=NULL) {
int i;
for (i=0;i<N_AXIS;i++){
if(b->direction_bits & get_direction_mask(i)) block_position[i]-= b->steps[i];
else block_position[i]+= b->steps[i];
fprintf(args.block_out_file,"%d, ", block_position[i]);
}
fprintf(args.block_out_file,"%f", b->entry_speed_sqr);
fprintf(args.block_out_file,"\n");
fflush(args.block_out_file); //TODO: needed?
last_block= b;
}
}
//printer for grbl serial port output
void grbl_out(uint8_t data){
static uint8_t buf[128]={0};
static uint8_t len=0;
static bool continuation = 0;
buf[len++]=data;
if(data=='\n' || data=='\r' || len>=127) {
if (args.comment_char && !continuation){
fprintf(args.grbl_out_file,"%c ",args.comment_char);
}
buf[len]=0;
fprintf(args.grbl_out_file,"%s",buf);
continuation = (len>=128); //print comment on next line unless we are only printing to avoid buffer overflow)
len=0;
}
}

View File

@ -1,80 +0,0 @@
/*
simulator.h - functions to simulate how the buffer is emptied and the
stepper interrupt is called
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef simulator_h
#define simulator_h
#include <stdio.h>
#include "../nuts_bolts.h"
#include "../system.h"
#include "platform.h"
//simulation globals
typedef struct sim_vars {
uint64_t masterclock;
double sim_time; //current time of the simulation
uint8_t started; //don't start timers until first char recieved.
uint8_t exit;
float speedup;
int32_t baud_ticks;
double next_print_time;
} sim_vars_t;
extern sim_vars_t sim;
typedef struct arg_vars {
// Output file handles
FILE *block_out_file;
FILE *step_out_file;
FILE *grbl_out_file;
// Minimum time step for printing stepper values. //Given by user via command line
double step_time;
//char to prefix comments; default '#'
uint8_t comment_char;
} arg_vars_t;
extern arg_vars_t args;
// global system variable structure for position etc.
extern system_t sys;
// setup avr simulation
void init_simulator(float time_multiplier);
//shutdown simulator - close open files
int shutdown_simulator(uint8_t exitflag);
//simulates the hardware until sim.exit is set.
void sim_loop();
// Call the stepper interrupt until one block is finished
void simulate_serial();
// Print information about the most recently inserted block
void printBlock();
//printer for grbl serial port output
void grbl_out(uint8_t char_out);
#endif

View File

@ -1,27 +0,0 @@
/*
delay.c - replacement for the avr library of the same name to provide
dummy functions
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
// TODO: the simulation time should reflect when grbl dwells
// Maybe this becomes a no-issue when dwell is executed in a buffered block
void _delay_ms(int i) {}
void _delay_us(int i) {}

View File

@ -1,29 +0,0 @@
/*
delay.h - replacement for the avr include of the same name to provide
dummy functions
Part of Grbl Simulator
Copyright (c) 2012 Jens Geisler
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef delay_h
#define delay_h
void _delay_ms(int i);
void _delay_us(int i);
#endif

View File

@ -1,3 +0,0 @@
float __floatunsisf (unsigned long v) {
return v;
}