From 535194bcb45ca8e7ce3a511fd544554992fe41ff Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Sun, 24 Jan 2016 21:30:35 +0100 Subject: [PATCH] add lookup table --- examples/osd/arduino-roller/Makefile | 2 +- examples/osd/arduino-roller/sketch.pde | 4 +- examples/osd/arduino-roller/tools/1.c | 1040 +++++++++++++++++ examples/osd/arduino-roller/tools/1.h | 15 + examples/osd/arduino-roller/tools/README | 15 + examples/osd/arduino-roller/tools/example.csv | 1029 ++++++++++++++++ examples/osd/arduino-roller/tools/example.ods | Bin 0 -> 33474 bytes .../osd/arduino-roller/tools/lookuptable.py | 176 +++ examples/osd/arduino-roller/tools/test2.csv | 1029 ++++++++++++++++ 9 files changed, 3308 insertions(+), 2 deletions(-) create mode 100644 examples/osd/arduino-roller/tools/1.c create mode 100644 examples/osd/arduino-roller/tools/1.h create mode 100644 examples/osd/arduino-roller/tools/README create mode 100644 examples/osd/arduino-roller/tools/example.csv create mode 100644 examples/osd/arduino-roller/tools/example.ods create mode 100644 examples/osd/arduino-roller/tools/lookuptable.py create mode 100644 examples/osd/arduino-roller/tools/test2.csv diff --git a/examples/osd/arduino-roller/Makefile b/examples/osd/arduino-roller/Makefile index 7dc5c26a1..2cfdbdc83 100644 --- a/examples/osd/arduino-roller/Makefile +++ b/examples/osd/arduino-roller/Makefile @@ -15,7 +15,7 @@ CONTIKI_WITH_IPV6 = 1 CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" -PROJECT_SOURCEFILES += ${SKETCH}.cpp +PROJECT_SOURCEFILES += ${SKETCH}.cpp klin.c # automatically build RESTful resources REST_RESOURCES_DIR = ./resources diff --git a/examples/osd/arduino-roller/sketch.pde b/examples/osd/arduino-roller/sketch.pde index 81f4930f1..f57204e09 100644 --- a/examples/osd/arduino-roller/sketch.pde +++ b/examples/osd/arduino-roller/sketch.pde @@ -13,6 +13,7 @@ extern "C" { #include "rest-engine.h" #include "dev/servo.h" +#include "klin.h" // linera values lookup table extern resource_t res_poti, res_battery; uint8_t poti_pin = A5; @@ -54,6 +55,7 @@ void loop (void) int value; poti_voltage = analogRead(poti_pin); value=scale (345,868,servo_min,servo_max,poti_voltage); - servo_set(1,value); + uint16_t lookup_Daumengas(uint16_t i); + servo_set(1,lookup_Daumengas(value)); printf("%d,%d\n",poti_voltage,value); } diff --git a/examples/osd/arduino-roller/tools/1.c b/examples/osd/arduino-roller/tools/1.c new file mode 100644 index 000000000..1dd9e74ca --- /dev/null +++ b/examples/osd/arduino-roller/tools/1.c @@ -0,0 +1,1040 @@ +#include "1.h" + +/** autogenerated lookup table */ +const uint16_t g_LOOKUP_MyFavoriteSensor[] PROGMEM = +{ + /* 0 */ 5, + /* 1 */ 6, + /* 2 */ 7, + /* 3 */ 8, + /* 4 */ 9, + /* 5 */ 10, + /* 6 */ 11, + /* 7 */ 12, + /* 8 */ 13, + /* 9 */ 14, + /* 10 */ 15, + /* 11 */ 16, + /* 12 */ 17, + /* 13 */ 18, + /* 14 */ 19, + /* 15 */ 20, + /* 16 */ 21, + /* 17 */ 22, + /* 18 */ 23, + /* 19 */ 24, + /* 20 */ 25, + /* 21 */ 26, + /* 22 */ 27, + /* 23 */ 28, + /* 24 */ 29, + /* 25 */ 30, + /* 26 */ 31, + /* 27 */ 32, + /* 28 */ 33, + /* 29 */ 34, + /* 30 */ 35, + /* 31 */ 36, + /* 32 */ 37, + /* 33 */ 38, + /* 34 */ 39, + /* 35 */ 40, + /* 36 */ 41, + /* 37 */ 42, + /* 38 */ 43, + /* 39 */ 44, + /* 40 */ 45, + /* 41 */ 46, + /* 42 */ 47, + /* 43 */ 48, + /* 44 */ 49, + /* 45 */ 50, + /* 46 */ 51, + /* 47 */ 52, + /* 48 */ 53, + /* 49 */ 54, + /* 50 */ 55, + /* 51 */ 56, + /* 52 */ 57, + /* 53 */ 58, + /* 54 */ 59, + /* 55 */ 60, + /* 56 */ 61, + /* 57 */ 62, + /* 58 */ 63, + /* 59 */ 64, + /* 60 */ 65, + /* 61 */ 66, + /* 62 */ 67, + /* 63 */ 68, + /* 64 */ 69, + /* 65 */ 70, + /* 66 */ 71, + /* 67 */ 72, + /* 68 */ 73, + /* 69 */ 74, + /* 70 */ 75, + /* 71 */ 76, + /* 72 */ 77, + /* 73 */ 78, + /* 74 */ 79, + /* 75 */ 80, + /* 76 */ 81, + /* 77 */ 82, + /* 78 */ 83, + /* 79 */ 84, + /* 80 */ 85, + /* 81 */ 86, + /* 82 */ 87, + /* 83 */ 88, + /* 84 */ 89, + /* 85 */ 90, + /* 86 */ 91, + /* 87 */ 92, + /* 88 */ 93, + /* 89 */ 94, + /* 90 */ 95, + /* 91 */ 96, + /* 92 */ 97, + /* 93 */ 98, + /* 94 */ 99, + /* 95 */ 100, + /* 96 */ 101, + /* 97 */ 102, + /* 98 */ 103, + /* 99 */ 104, + /* 100 */ 105, + /* 101 */ 106, + /* 102 */ 107, + /* 103 */ 108, + /* 104 */ 109, + /* 105 */ 110, + /* 106 */ 111, + /* 107 */ 112, + /* 108 */ 113, + /* 109 */ 114, + /* 110 */ 115, + /* 111 */ 116, + /* 112 */ 117, + /* 113 */ 118, + /* 114 */ 119, + /* 115 */ 120, + /* 116 */ 121, + /* 117 */ 122, + /* 118 */ 123, + /* 119 */ 124, + /* 120 */ 125, + /* 121 */ 126, + /* 122 */ 127, + /* 123 */ 128, + /* 124 */ 129, + /* 125 */ 130, + /* 126 */ 131, + /* 127 */ 132, + /* 128 */ 133, + /* 129 */ 134, + /* 130 */ 135, + /* 131 */ 136, + /* 132 */ 137, + /* 133 */ 138, + /* 134 */ 139, + /* 135 */ 140, + /* 136 */ 141, + /* 137 */ 142, + /* 138 */ 143, + /* 139 */ 144, + /* 140 */ 145, + /* 141 */ 146, + /* 142 */ 147, + /* 143 */ 148, + /* 144 */ 149, + /* 145 */ 150, + /* 146 */ 151, + /* 147 */ 152, + /* 148 */ 153, + /* 149 */ 154, + /* 150 */ 155, + /* 151 */ 156, + /* 152 */ 157, + /* 153 */ 158, + /* 154 */ 159, + /* 155 */ 160, + /* 156 */ 161, + /* 157 */ 162, + /* 158 */ 163, + /* 159 */ 164, + /* 160 */ 165, + /* 161 */ 166, + /* 162 */ 167, + /* 163 */ 168, + /* 164 */ 169, + /* 165 */ 170, + /* 166 */ 171, + /* 167 */ 172, + /* 168 */ 173, + /* 169 */ 174, + /* 170 */ 175, + /* 171 */ 176, + /* 172 */ 177, + /* 173 */ 178, + /* 174 */ 179, + /* 175 */ 180, + /* 176 */ 181, + /* 177 */ 182, + /* 178 */ 183, + /* 179 */ 184, + /* 180 */ 185, + /* 181 */ 186, + /* 182 */ 187, + /* 183 */ 188, + /* 184 */ 189, + /* 185 */ 190, + /* 186 */ 191, + /* 187 */ 192, + /* 188 */ 193, + /* 189 */ 194, + /* 190 */ 195, + /* 191 */ 196, + /* 192 */ 197, + /* 193 */ 198, + /* 194 */ 199, + /* 195 */ 200, + /* 196 */ 201, + /* 197 */ 202, + /* 198 */ 203, + /* 199 */ 204, + /* 200 */ 205, + /* 201 */ 206, + /* 202 */ 207, + /* 203 */ 208, + /* 204 */ 209, + /* 205 */ 210, + /* 206 */ 211, + /* 207 */ 212, + /* 208 */ 213, + /* 209 */ 214, + /* 210 */ 215, + /* 211 */ 216, + /* 212 */ 217, + /* 213 */ 218, + /* 214 */ 219, + /* 215 */ 220, + /* 216 */ 221, + /* 217 */ 222, + /* 218 */ 223, + /* 219 */ 224, + /* 220 */ 225, + /* 221 */ 226, + /* 222 */ 227, + /* 223 */ 228, + /* 224 */ 229, + /* 225 */ 230, + /* 226 */ 231, + /* 227 */ 232, + /* 228 */ 233, + /* 229 */ 234, + /* 230 */ 235, + /* 231 */ 236, + /* 232 */ 237, + /* 233 */ 238, + /* 234 */ 239, + /* 235 */ 240, + /* 236 */ 241, + /* 237 */ 242, + /* 238 */ 243, + /* 239 */ 244, + /* 240 */ 245, + /* 241 */ 246, + /* 242 */ 247, + /* 243 */ 248, + /* 244 */ 249, + /* 245 */ 250, + /* 246 */ 251, + /* 247 */ 252, + /* 248 */ 253, + /* 249 */ 254, + /* 250 */ 255, + /* 251 */ 256, + /* 252 */ 257, + /* 253 */ 258, + /* 254 */ 259, + /* 255 */ 260, + /* 256 */ 261, + /* 257 */ 262, + /* 258 */ 263, + /* 259 */ 264, + /* 260 */ 265, + /* 261 */ 266, + /* 262 */ 267, + /* 263 */ 268, + /* 264 */ 269, + /* 265 */ 270, + /* 266 */ 271, + /* 267 */ 272, + /* 268 */ 273, + /* 269 */ 274, + /* 270 */ 275, + /* 271 */ 276, + /* 272 */ 277, + /* 273 */ 278, + /* 274 */ 279, + /* 275 */ 280, + /* 276 */ 281, + /* 277 */ 282, + /* 278 */ 283, + /* 279 */ 284, + /* 280 */ 285, + /* 281 */ 286, + /* 282 */ 287, + /* 283 */ 288, + /* 284 */ 289, + /* 285 */ 290, + /* 286 */ 291, + /* 287 */ 292, + /* 288 */ 293, + /* 289 */ 294, + /* 290 */ 295, + /* 291 */ 296, + /* 292 */ 297, + /* 293 */ 298, + /* 294 */ 299, + /* 295 */ 300, + /* 296 */ 301, + /* 297 */ 302, + /* 298 */ 303, + /* 299 */ 304, + /* 300 */ 305, + /* 301 */ 306, + /* 302 */ 307, + /* 303 */ 308, + /* 304 */ 309, + /* 305 */ 310, + /* 306 */ 311, + /* 307 */ 312, + /* 308 */ 313, + /* 309 */ 314, + /* 310 */ 315, + /* 311 */ 316, + /* 312 */ 317, + /* 313 */ 318, + /* 314 */ 319, + /* 315 */ 320, + /* 316 */ 321, + /* 317 */ 322, + /* 318 */ 323, + /* 319 */ 324, + /* 320 */ 325, + /* 321 */ 326, + /* 322 */ 327, + /* 323 */ 328, + /* 324 */ 329, + /* 325 */ 330, + /* 326 */ 331, + /* 327 */ 332, + /* 328 */ 333, + /* 329 */ 334, + /* 330 */ 335, + /* 331 */ 336, + /* 332 */ 337, + /* 333 */ 338, + /* 334 */ 339, + /* 335 */ 340, + /* 336 */ 341, + /* 337 */ 342, + /* 338 */ 343, + /* 339 */ 344, + /* 340 */ 345, + /* 341 */ 346, + /* 342 */ 347, + /* 343 */ 348, + /* 344 */ 349, + /* 345 */ 350, + /* 346 */ 351, + /* 347 */ 352, + /* 348 */ 353, + /* 349 */ 354, + /* 350 */ 355, + /* 351 */ 356, + /* 352 */ 357, + /* 353 */ 358, + /* 354 */ 359, + /* 355 */ 360, + /* 356 */ 361, + /* 357 */ 362, + /* 358 */ 363, + /* 359 */ 364, + /* 360 */ 365, + /* 361 */ 366, + /* 362 */ 367, + /* 363 */ 368, + /* 364 */ 369, + /* 365 */ 370, + /* 366 */ 371, + /* 367 */ 372, + /* 368 */ 373, + /* 369 */ 374, + /* 370 */ 375, + /* 371 */ 376, + /* 372 */ 377, + /* 373 */ 378, + /* 374 */ 379, + /* 375 */ 380, + /* 376 */ 381, + /* 377 */ 382, + /* 378 */ 383, + /* 379 */ 384, + /* 380 */ 385, + /* 381 */ 386, + /* 382 */ 387, + /* 383 */ 388, + /* 384 */ 389, + /* 385 */ 390, + /* 386 */ 391, + /* 387 */ 392, + /* 388 */ 393, + /* 389 */ 394, + /* 390 */ 395, + /* 391 */ 396, + /* 392 */ 397, + /* 393 */ 398, + /* 394 */ 399, + /* 395 */ 400, + /* 396 */ 401, + /* 397 */ 402, + /* 398 */ 403, + /* 399 */ 404, + /* 400 */ 405, + /* 401 */ 406, + /* 402 */ 407, + /* 403 */ 408, + /* 404 */ 409, + /* 405 */ 410, + /* 406 */ 411, + /* 407 */ 412, + /* 408 */ 413, + /* 409 */ 414, + /* 410 */ 415, + /* 411 */ 416, + /* 412 */ 417, + /* 413 */ 418, + /* 414 */ 419, + /* 415 */ 420, + /* 416 */ 421, + /* 417 */ 422, + /* 418 */ 423, + /* 419 */ 424, + /* 420 */ 425, + /* 421 */ 426, + /* 422 */ 427, + /* 423 */ 428, + /* 424 */ 429, + /* 425 */ 430, + /* 426 */ 431, + /* 427 */ 432, + /* 428 */ 433, + /* 429 */ 434, + /* 430 */ 435, + /* 431 */ 436, + /* 432 */ 437, + /* 433 */ 438, + /* 434 */ 439, + /* 435 */ 440, + /* 436 */ 441, + /* 437 */ 442, + /* 438 */ 443, + /* 439 */ 444, + /* 440 */ 445, + /* 441 */ 446, + /* 442 */ 447, + /* 443 */ 448, + /* 444 */ 449, + /* 445 */ 450, + /* 446 */ 451, + /* 447 */ 452, + /* 448 */ 453, + /* 449 */ 454, + /* 450 */ 455, + /* 451 */ 456, + /* 452 */ 457, + /* 453 */ 458, + /* 454 */ 459, + /* 455 */ 460, + /* 456 */ 461, + /* 457 */ 462, + /* 458 */ 463, + /* 459 */ 464, + /* 460 */ 465, + /* 461 */ 466, + /* 462 */ 467, + /* 463 */ 468, + /* 464 */ 469, + /* 465 */ 470, + /* 466 */ 471, + /* 467 */ 472, + /* 468 */ 473, + /* 469 */ 474, + /* 470 */ 475, + /* 471 */ 476, + /* 472 */ 477, + /* 473 */ 478, + /* 474 */ 479, + /* 475 */ 480, + /* 476 */ 481, + /* 477 */ 482, + /* 478 */ 483, + /* 479 */ 484, + /* 480 */ 485, + /* 481 */ 486, + /* 482 */ 487, + /* 483 */ 488, + /* 484 */ 489, + /* 485 */ 490, + /* 486 */ 491, + /* 487 */ 492, + /* 488 */ 493, + /* 489 */ 494, + /* 490 */ 495, + /* 491 */ 496, + /* 492 */ 497, + /* 493 */ 498, + /* 494 */ 499, + /* 495 */ 500, + /* 496 */ 501, + /* 497 */ 502, + /* 498 */ 503, + /* 499 */ 504, + /* 500 */ 505, + /* 501 */ 506, + /* 502 */ 507, + /* 503 */ 508, + /* 504 */ 509, + /* 505 */ 510, + /* 506 */ 511, + /* 507 */ 512, + /* 508 */ 513, + /* 509 */ 514, + /* 510 */ 515, + /* 511 */ 516, + /* 512 */ 517, + /* 513 */ 518, + /* 514 */ 519, + /* 515 */ 520, + /* 516 */ 521, + /* 517 */ 522, + /* 518 */ 523, + /* 519 */ 524, + /* 520 */ 525, + /* 521 */ 526, + /* 522 */ 527, + /* 523 */ 528, + /* 524 */ 529, + /* 525 */ 530, + /* 526 */ 531, + /* 527 */ 532, + /* 528 */ 533, + /* 529 */ 534, + /* 530 */ 535, + /* 531 */ 536, + /* 532 */ 537, + /* 533 */ 538, + /* 534 */ 539, + /* 535 */ 540, + /* 536 */ 541, + /* 537 */ 542, + /* 538 */ 543, + /* 539 */ 544, + /* 540 */ 545, + /* 541 */ 546, + /* 542 */ 547, + /* 543 */ 548, + /* 544 */ 549, + /* 545 */ 550, + /* 546 */ 551, + /* 547 */ 552, + /* 548 */ 553, + /* 549 */ 554, + /* 550 */ 555, + /* 551 */ 556, + /* 552 */ 557, + /* 553 */ 558, + /* 554 */ 559, + /* 555 */ 560, + /* 556 */ 561, + /* 557 */ 562, + /* 558 */ 563, + /* 559 */ 564, + /* 560 */ 565, + /* 561 */ 566, + /* 562 */ 567, + /* 563 */ 568, + /* 564 */ 569, + /* 565 */ 570, + /* 566 */ 571, + /* 567 */ 572, + /* 568 */ 573, + /* 569 */ 574, + /* 570 */ 575, + /* 571 */ 576, + /* 572 */ 577, + /* 573 */ 578, + /* 574 */ 579, + /* 575 */ 580, + /* 576 */ 581, + /* 577 */ 582, + /* 578 */ 583, + /* 579 */ 584, + /* 580 */ 585, + /* 581 */ 586, + /* 582 */ 587, + /* 583 */ 588, + /* 584 */ 589, + /* 585 */ 590, + /* 586 */ 591, + /* 587 */ 592, + /* 588 */ 593, + /* 589 */ 594, + /* 590 */ 595, + /* 591 */ 596, + /* 592 */ 597, + /* 593 */ 598, + /* 594 */ 599, + /* 595 */ 600, + /* 596 */ 601, + /* 597 */ 602, + /* 598 */ 603, + /* 599 */ 604, + /* 600 */ 605, + /* 601 */ 606, + /* 602 */ 607, + /* 603 */ 608, + /* 604 */ 609, + /* 605 */ 610, + /* 606 */ 611, + /* 607 */ 612, + /* 608 */ 613, + /* 609 */ 614, + /* 610 */ 615, + /* 611 */ 616, + /* 612 */ 617, + /* 613 */ 618, + /* 614 */ 619, + /* 615 */ 620, + /* 616 */ 621, + /* 617 */ 622, + /* 618 */ 623, + /* 619 */ 624, + /* 620 */ 625, + /* 621 */ 626, + /* 622 */ 627, + /* 623 */ 628, + /* 624 */ 629, + /* 625 */ 630, + /* 626 */ 631, + /* 627 */ 632, + /* 628 */ 633, + /* 629 */ 634, + /* 630 */ 635, + /* 631 */ 636, + /* 632 */ 637, + /* 633 */ 638, + /* 634 */ 639, + /* 635 */ 640, + /* 636 */ 641, + /* 637 */ 642, + /* 638 */ 643, + /* 639 */ 644, + /* 640 */ 645, + /* 641 */ 646, + /* 642 */ 647, + /* 643 */ 648, + /* 644 */ 649, + /* 645 */ 650, + /* 646 */ 651, + /* 647 */ 652, + /* 648 */ 653, + /* 649 */ 654, + /* 650 */ 655, + /* 651 */ 656, + /* 652 */ 657, + /* 653 */ 658, + /* 654 */ 659, + /* 655 */ 660, + /* 656 */ 661, + /* 657 */ 662, + /* 658 */ 663, + /* 659 */ 664, + /* 660 */ 665, + /* 661 */ 666, + /* 662 */ 667, + /* 663 */ 668, + /* 664 */ 669, + /* 665 */ 670, + /* 666 */ 671, + /* 667 */ 672, + /* 668 */ 673, + /* 669 */ 674, + /* 670 */ 675, + /* 671 */ 676, + /* 672 */ 677, + /* 673 */ 678, + /* 674 */ 679, + /* 675 */ 680, + /* 676 */ 681, + /* 677 */ 682, + /* 678 */ 683, + /* 679 */ 684, + /* 680 */ 685, + /* 681 */ 686, + /* 682 */ 687, + /* 683 */ 688, + /* 684 */ 689, + /* 685 */ 690, + /* 686 */ 691, + /* 687 */ 692, + /* 688 */ 693, + /* 689 */ 694, + /* 690 */ 695, + /* 691 */ 696, + /* 692 */ 697, + /* 693 */ 698, + /* 694 */ 699, + /* 695 */ 700, + /* 696 */ 701, + /* 697 */ 702, + /* 698 */ 703, + /* 699 */ 704, + /* 700 */ 705, + /* 701 */ 706, + /* 702 */ 707, + /* 703 */ 708, + /* 704 */ 709, + /* 705 */ 710, + /* 706 */ 711, + /* 707 */ 712, + /* 708 */ 713, + /* 709 */ 714, + /* 710 */ 715, + /* 711 */ 716, + /* 712 */ 717, + /* 713 */ 718, + /* 714 */ 719, + /* 715 */ 720, + /* 716 */ 721, + /* 717 */ 722, + /* 718 */ 723, + /* 719 */ 724, + /* 720 */ 725, + /* 721 */ 726, + /* 722 */ 727, + /* 723 */ 728, + /* 724 */ 729, + /* 725 */ 730, + /* 726 */ 731, + /* 727 */ 732, + /* 728 */ 733, + /* 729 */ 734, + /* 730 */ 735, + /* 731 */ 736, + /* 732 */ 737, + /* 733 */ 738, + /* 734 */ 739, + /* 735 */ 740, + /* 736 */ 741, + /* 737 */ 742, + /* 738 */ 743, + /* 739 */ 744, + /* 740 */ 745, + /* 741 */ 746, + /* 742 */ 747, + /* 743 */ 748, + /* 744 */ 749, + /* 745 */ 750, + /* 746 */ 751, + /* 747 */ 752, + /* 748 */ 753, + /* 749 */ 754, + /* 750 */ 755, + /* 751 */ 756, + /* 752 */ 757, + /* 753 */ 758, + /* 754 */ 759, + /* 755 */ 760, + /* 756 */ 761, + /* 757 */ 762, + /* 758 */ 763, + /* 759 */ 764, + /* 760 */ 765, + /* 761 */ 766, + /* 762 */ 767, + /* 763 */ 768, + /* 764 */ 769, + /* 765 */ 770, + /* 766 */ 771, + /* 767 */ 772, + /* 768 */ 773, + /* 769 */ 774, + /* 770 */ 775, + /* 771 */ 776, + /* 772 */ 777, + /* 773 */ 778, + /* 774 */ 779, + /* 775 */ 780, + /* 776 */ 781, + /* 777 */ 782, + /* 778 */ 783, + /* 779 */ 784, + /* 780 */ 785, + /* 781 */ 786, + /* 782 */ 787, + /* 783 */ 788, + /* 784 */ 789, + /* 785 */ 790, + /* 786 */ 791, + /* 787 */ 792, + /* 788 */ 793, + /* 789 */ 794, + /* 790 */ 795, + /* 791 */ 796, + /* 792 */ 797, + /* 793 */ 798, + /* 794 */ 799, + /* 795 */ 800, + /* 796 */ 801, + /* 797 */ 802, + /* 798 */ 803, + /* 799 */ 804, + /* 800 */ 805, + /* 801 */ 806, + /* 802 */ 807, + /* 803 */ 808, + /* 804 */ 809, + /* 805 */ 810, + /* 806 */ 811, + /* 807 */ 812, + /* 808 */ 813, + /* 809 */ 814, + /* 810 */ 815, + /* 811 */ 816, + /* 812 */ 817, + /* 813 */ 818, + /* 814 */ 819, + /* 815 */ 820, + /* 816 */ 821, + /* 817 */ 822, + /* 818 */ 823, + /* 819 */ 824, + /* 820 */ 825, + /* 821 */ 826, + /* 822 */ 827, + /* 823 */ 828, + /* 824 */ 829, + /* 825 */ 830, + /* 826 */ 831, + /* 827 */ 832, + /* 828 */ 833, + /* 829 */ 834, + /* 830 */ 835, + /* 831 */ 836, + /* 832 */ 837, + /* 833 */ 838, + /* 834 */ 839, + /* 835 */ 840, + /* 836 */ 841, + /* 837 */ 842, + /* 838 */ 843, + /* 839 */ 844, + /* 840 */ 845, + /* 841 */ 846, + /* 842 */ 847, + /* 843 */ 848, + /* 844 */ 849, + /* 845 */ 850, + /* 846 */ 851, + /* 847 */ 852, + /* 848 */ 853, + /* 849 */ 854, + /* 850 */ 855, + /* 851 */ 856, + /* 852 */ 857, + /* 853 */ 858, + /* 854 */ 859, + /* 855 */ 860, + /* 856 */ 861, + /* 857 */ 862, + /* 858 */ 863, + /* 859 */ 864, + /* 860 */ 865, + /* 861 */ 866, + /* 862 */ 867, + /* 863 */ 868, + /* 864 */ 869, + /* 865 */ 870, + /* 866 */ 871, + /* 867 */ 872, + /* 868 */ 873, + /* 869 */ 874, + /* 870 */ 875, + /* 871 */ 876, + /* 872 */ 877, + /* 873 */ 878, + /* 874 */ 879, + /* 875 */ 880, + /* 876 */ 881, + /* 877 */ 882, + /* 878 */ 883, + /* 879 */ 884, + /* 880 */ 885, + /* 881 */ 886, + /* 882 */ 887, + /* 883 */ 888, + /* 884 */ 889, + /* 885 */ 890, + /* 886 */ 891, + /* 887 */ 892, + /* 888 */ 893, + /* 889 */ 894, + /* 890 */ 895, + /* 891 */ 896, + /* 892 */ 897, + /* 893 */ 898, + /* 894 */ 899, + /* 895 */ 900, + /* 896 */ 901, + /* 897 */ 902, + /* 898 */ 903, + /* 899 */ 904, + /* 900 */ 905, + /* 901 */ 906, + /* 902 */ 907, + /* 903 */ 908, + /* 904 */ 909, + /* 905 */ 910, + /* 906 */ 911, + /* 907 */ 912, + /* 908 */ 913, + /* 909 */ 914, + /* 910 */ 915, + /* 911 */ 916, + /* 912 */ 917, + /* 913 */ 918, + /* 914 */ 919, + /* 915 */ 920, + /* 916 */ 921, + /* 917 */ 922, + /* 918 */ 923, + /* 919 */ 924, + /* 920 */ 925, + /* 921 */ 926, + /* 922 */ 927, + /* 923 */ 928, + /* 924 */ 929, + /* 925 */ 930, + /* 926 */ 931, + /* 927 */ 932, + /* 928 */ 933, + /* 929 */ 934, + /* 930 */ 935, + /* 931 */ 936, + /* 932 */ 937, + /* 933 */ 938, + /* 934 */ 939, + /* 935 */ 940, + /* 936 */ 941, + /* 937 */ 942, + /* 938 */ 943, + /* 939 */ 944, + /* 940 */ 945, + /* 941 */ 946, + /* 942 */ 947, + /* 943 */ 948, + /* 944 */ 949, + /* 945 */ 950, + /* 946 */ 951, + /* 947 */ 952, + /* 948 */ 953, + /* 949 */ 954, + /* 950 */ 955, + /* 951 */ 956, + /* 952 */ 957, + /* 953 */ 958, + /* 954 */ 959, + /* 955 */ 960, + /* 956 */ 961, + /* 957 */ 962, + /* 958 */ 963, + /* 959 */ 964, + /* 960 */ 965, + /* 961 */ 966, + /* 962 */ 967, + /* 963 */ 968, + /* 964 */ 969, + /* 965 */ 970, + /* 966 */ 971, + /* 967 */ 972, + /* 968 */ 973, + /* 969 */ 974, + /* 970 */ 975, + /* 971 */ 976, + /* 972 */ 977, + /* 973 */ 978, + /* 974 */ 979, + /* 975 */ 980, + /* 976 */ 981, + /* 977 */ 982, + /* 978 */ 983, + /* 979 */ 984, + /* 980 */ 985, + /* 981 */ 986, + /* 982 */ 987, + /* 983 */ 988, + /* 984 */ 989, + /* 985 */ 990, + /* 986 */ 991, + /* 987 */ 992, + /* 988 */ 993, + /* 989 */ 994, + /* 990 */ 995, + /* 991 */ 996, + /* 992 */ 997, + /* 993 */ 998, + /* 994 */ 999, + /* 995 */ 1000, + /* 996 */ 1001, + /* 997 */ 1002, + /* 998 */ 1003, + /* 999 */ 1004, + /* 1000 */ 1005, + /* 1001 */ 1006, + /* 1002 */ 1007, + /* 1003 */ 1008, + /* 1004 */ 1009, + /* 1005 */ 1010, + /* 1006 */ 1011, + /* 1007 */ 1012, + /* 1008 */ 1013, + /* 1009 */ 1014, + /* 1010 */ 1015, + /* 1011 */ 1016, + /* 1012 */ 1017, + /* 1013 */ 1018, + /* 1014 */ 1019, + /* 1015 */ 1020, + /* 1016 */ 1021, + /* 1017 */ 1022, + /* 1018 */ 1023, + /* 1019 */ 1024, + /* 1020 */ 1025, + /* 1021 */ 1026, + /* 1022 */ 1027, + /* 1023 */ 1028, +}; + +uint16_t lookup_MyFavoriteSensor(uint16_t i) +{ + if (i <= 1023) + return pgm_read_word(&g_LOOKUP_MyFavoriteSensor[i]); + else + return 6666; /* #HighValue */ +} + + diff --git a/examples/osd/arduino-roller/tools/1.h b/examples/osd/arduino-roller/tools/1.h new file mode 100644 index 000000000..221b3af79 --- /dev/null +++ b/examples/osd/arduino-roller/tools/1.h @@ -0,0 +1,15 @@ +#ifndef 1_h_ +#define 1_h_ + +#include +#include + +/** + * autogenerated lookup function for MyFavoriteSensor + * @param i x value + * @return f(i), or 6666 if i is out of range + */ +uint16_t lookup_MyFavoriteSensor(uint16_t i); + +#endif /* 1_h_ */ + diff --git a/examples/osd/arduino-roller/tools/README b/examples/osd/arduino-roller/tools/README new file mode 100644 index 000000000..509f6ae85 --- /dev/null +++ b/examples/osd/arduino-roller/tools/README @@ -0,0 +1,15 @@ + + +Hallo , + +Für ein ähnliches Problem habe ich einen csv zu C Konverter in Python +geschrieben. +Aus dem csv im Anhang habe ich mit + +python lookuptable.py example.csv 1.h 1.c + +das .c und .h erzeugt. Ohne Gewähr, evtl. hilft es. + +link: + +http://www.mikrocontroller.net/topic/232722 diff --git a/examples/osd/arduino-roller/tools/example.csv b/examples/osd/arduino-roller/tools/example.csv new file mode 100644 index 000000000..4175536f1 --- /dev/null +++ b/examples/osd/arduino-roller/tools/example.csv @@ -0,0 +1,1029 @@ +"#LowValue";12345 +"#HighValue";6666 +"#DataType";"uint16_t" +"#IndexType";"uint16_t" +"#ArrayName";"MyFavoriteSensor" +0;5 +1;6 +2;7 +3;8 +4;9 +5;10 +6;11 +7;12 +8;13 +9;14 +10;15 +11;16 +12;17 +13;18 +14;19 +15;20 +16;21 +17;22 +18;23 +19;24 +20;25 +21;26 +22;27 +23;28 +24;29 +25;30 +26;31 +27;32 +28;33 +29;34 +30;35 +31;36 +32;37 +33;38 +34;39 +35;40 +36;41 +37;42 +38;43 +39;44 +40;45 +41;46 +42;47 +43;48 +44;49 +45;50 +46;51 +47;52 +48;53 +49;54 +50;55 +51;56 +52;57 +53;58 +54;59 +55;60 +56;61 +57;62 +58;63 +59;64 +60;65 +61;66 +62;67 +63;68 +64;69 +65;70 +66;71 +67;72 +68;73 +69;74 +70;75 +71;76 +72;77 +73;78 +74;79 +75;80 +76;81 +77;82 +78;83 +79;84 +80;85 +81;86 +82;87 +83;88 +84;89 +85;90 +86;91 +87;92 +88;93 +89;94 +90;95 +91;96 +92;97 +93;98 +94;99 +95;100 +96;101 +97;102 +98;103 +99;104 +100;105 +101;106 +102;107 +103;108 +104;109 +105;110 +106;111 +107;112 +108;113 +109;114 +110;115 +111;116 +112;117 +113;118 +114;119 +115;120 +116;121 +117;122 +118;123 +119;124 +120;125 +121;126 +122;127 +123;128 +124;129 +125;130 +126;131 +127;132 +128;133 +129;134 +130;135 +131;136 +132;137 +133;138 +134;139 +135;140 +136;141 +137;142 +138;143 +139;144 +140;145 +141;146 +142;147 +143;148 +144;149 +145;150 +146;151 +147;152 +148;153 +149;154 +150;155 +151;156 +152;157 +153;158 +154;159 +155;160 +156;161 +157;162 +158;163 +159;164 +160;165 +161;166 +162;167 +163;168 +164;169 +165;170 +166;171 +167;172 +168;173 +169;174 +170;175 +171;176 +172;177 +173;178 +174;179 +175;180 +176;181 +177;182 +178;183 +179;184 +180;185 +181;186 +182;187 +183;188 +184;189 +185;190 +186;191 +187;192 +188;193 +189;194 +190;195 +191;196 +192;197 +193;198 +194;199 +195;200 +196;201 +197;202 +198;203 +199;204 +200;205 +201;206 +202;207 +203;208 +204;209 +205;210 +206;211 +207;212 +208;213 +209;214 +210;215 +211;216 +212;217 +213;218 +214;219 +215;220 +216;221 +217;222 +218;223 +219;224 +220;225 +221;226 +222;227 +223;228 +224;229 +225;230 +226;231 +227;232 +228;233 +229;234 +230;235 +231;236 +232;237 +233;238 +234;239 +235;240 +236;241 +237;242 +238;243 +239;244 +240;245 +241;246 +242;247 +243;248 +244;249 +245;250 +246;251 +247;252 +248;253 +249;254 +250;255 +251;256 +252;257 +253;258 +254;259 +255;260 +256;261 +257;262 +258;263 +259;264 +260;265 +261;266 +262;267 +263;268 +264;269 +265;270 +266;271 +267;272 +268;273 +269;274 +270;275 +271;276 +272;277 +273;278 +274;279 +275;280 +276;281 +277;282 +278;283 +279;284 +280;285 +281;286 +282;287 +283;288 +284;289 +285;290 +286;291 +287;292 +288;293 +289;294 +290;295 +291;296 +292;297 +293;298 +294;299 +295;300 +296;301 +297;302 +298;303 +299;304 +300;305 +301;306 +302;307 +303;308 +304;309 +305;310 +306;311 +307;312 +308;313 +309;314 +310;315 +311;316 +312;317 +313;318 +314;319 +315;320 +316;321 +317;322 +318;323 +319;324 +320;325 +321;326 +322;327 +323;328 +324;329 +325;330 +326;331 +327;332 +328;333 +329;334 +330;335 +331;336 +332;337 +333;338 +334;339 +335;340 +336;341 +337;342 +338;343 +339;344 +340;345 +341;346 +342;347 +343;348 +344;349 +345;350 +346;351 +347;352 +348;353 +349;354 +350;355 +351;356 +352;357 +353;358 +354;359 +355;360 +356;361 +357;362 +358;363 +359;364 +360;365 +361;366 +362;367 +363;368 +364;369 +365;370 +366;371 +367;372 +368;373 +369;374 +370;375 +371;376 +372;377 +373;378 +374;379 +375;380 +376;381 +377;382 +378;383 +379;384 +380;385 +381;386 +382;387 +383;388 +384;389 +385;390 +386;391 +387;392 +388;393 +389;394 +390;395 +391;396 +392;397 +393;398 +394;399 +395;400 +396;401 +397;402 +398;403 +399;404 +400;405 +401;406 +402;407 +403;408 +404;409 +405;410 +406;411 +407;412 +408;413 +409;414 +410;415 +411;416 +412;417 +413;418 +414;419 +415;420 +416;421 +417;422 +418;423 +419;424 +420;425 +421;426 +422;427 +423;428 +424;429 +425;430 +426;431 +427;432 +428;433 +429;434 +430;435 +431;436 +432;437 +433;438 +434;439 +435;440 +436;441 +437;442 +438;443 +439;444 +440;445 +441;446 +442;447 +443;448 +444;449 +445;450 +446;451 +447;452 +448;453 +449;454 +450;455 +451;456 +452;457 +453;458 +454;459 +455;460 +456;461 +457;462 +458;463 +459;464 +460;465 +461;466 +462;467 +463;468 +464;469 +465;470 +466;471 +467;472 +468;473 +469;474 +470;475 +471;476 +472;477 +473;478 +474;479 +475;480 +476;481 +477;482 +478;483 +479;484 +480;485 +481;486 +482;487 +483;488 +484;489 +485;490 +486;491 +487;492 +488;493 +489;494 +490;495 +491;496 +492;497 +493;498 +494;499 +495;500 +496;501 +497;502 +498;503 +499;504 +500;505 +501;506 +502;507 +503;508 +504;509 +505;510 +506;511 +507;512 +508;513 +509;514 +510;515 +511;516 +512;517 +513;518 +514;519 +515;520 +516;521 +517;522 +518;523 +519;524 +520;525 +521;526 +522;527 +523;528 +524;529 +525;530 +526;531 +527;532 +528;533 +529;534 +530;535 +531;536 +532;537 +533;538 +534;539 +535;540 +536;541 +537;542 +538;543 +539;544 +540;545 +541;546 +542;547 +543;548 +544;549 +545;550 +546;551 +547;552 +548;553 +549;554 +550;555 +551;556 +552;557 +553;558 +554;559 +555;560 +556;561 +557;562 +558;563 +559;564 +560;565 +561;566 +562;567 +563;568 +564;569 +565;570 +566;571 +567;572 +568;573 +569;574 +570;575 +571;576 +572;577 +573;578 +574;579 +575;580 +576;581 +577;582 +578;583 +579;584 +580;585 +581;586 +582;587 +583;588 +584;589 +585;590 +586;591 +587;592 +588;593 +589;594 +590;595 +591;596 +592;597 +593;598 +594;599 +595;600 +596;601 +597;602 +598;603 +599;604 +600;605 +601;606 +602;607 +603;608 +604;609 +605;610 +606;611 +607;612 +608;613 +609;614 +610;615 +611;616 +612;617 +613;618 +614;619 +615;620 +616;621 +617;622 +618;623 +619;624 +620;625 +621;626 +622;627 +623;628 +624;629 +625;630 +626;631 +627;632 +628;633 +629;634 +630;635 +631;636 +632;637 +633;638 +634;639 +635;640 +636;641 +637;642 +638;643 +639;644 +640;645 +641;646 +642;647 +643;648 +644;649 +645;650 +646;651 +647;652 +648;653 +649;654 +650;655 +651;656 +652;657 +653;658 +654;659 +655;660 +656;661 +657;662 +658;663 +659;664 +660;665 +661;666 +662;667 +663;668 +664;669 +665;670 +666;671 +667;672 +668;673 +669;674 +670;675 +671;676 +672;677 +673;678 +674;679 +675;680 +676;681 +677;682 +678;683 +679;684 +680;685 +681;686 +682;687 +683;688 +684;689 +685;690 +686;691 +687;692 +688;693 +689;694 +690;695 +691;696 +692;697 +693;698 +694;699 +695;700 +696;701 +697;702 +698;703 +699;704 +700;705 +701;706 +702;707 +703;708 +704;709 +705;710 +706;711 +707;712 +708;713 +709;714 +710;715 +711;716 +712;717 +713;718 +714;719 +715;720 +716;721 +717;722 +718;723 +719;724 +720;725 +721;726 +722;727 +723;728 +724;729 +725;730 +726;731 +727;732 +728;733 +729;734 +730;735 +731;736 +732;737 +733;738 +734;739 +735;740 +736;741 +737;742 +738;743 +739;744 +740;745 +741;746 +742;747 +743;748 +744;749 +745;750 +746;751 +747;752 +748;753 +749;754 +750;755 +751;756 +752;757 +753;758 +754;759 +755;760 +756;761 +757;762 +758;763 +759;764 +760;765 +761;766 +762;767 +763;768 +764;769 +765;770 +766;771 +767;772 +768;773 +769;774 +770;775 +771;776 +772;777 +773;778 +774;779 +775;780 +776;781 +777;782 +778;783 +779;784 +780;785 +781;786 +782;787 +783;788 +784;789 +785;790 +786;791 +787;792 +788;793 +789;794 +790;795 +791;796 +792;797 +793;798 +794;799 +795;800 +796;801 +797;802 +798;803 +799;804 +800;805 +801;806 +802;807 +803;808 +804;809 +805;810 +806;811 +807;812 +808;813 +809;814 +810;815 +811;816 +812;817 +813;818 +814;819 +815;820 +816;821 +817;822 +818;823 +819;824 +820;825 +821;826 +822;827 +823;828 +824;829 +825;830 +826;831 +827;832 +828;833 +829;834 +830;835 +831;836 +832;837 +833;838 +834;839 +835;840 +836;841 +837;842 +838;843 +839;844 +840;845 +841;846 +842;847 +843;848 +844;849 +845;850 +846;851 +847;852 +848;853 +849;854 +850;855 +851;856 +852;857 +853;858 +854;859 +855;860 +856;861 +857;862 +858;863 +859;864 +860;865 +861;866 +862;867 +863;868 +864;869 +865;870 +866;871 +867;872 +868;873 +869;874 +870;875 +871;876 +872;877 +873;878 +874;879 +875;880 +876;881 +877;882 +878;883 +879;884 +880;885 +881;886 +882;887 +883;888 +884;889 +885;890 +886;891 +887;892 +888;893 +889;894 +890;895 +891;896 +892;897 +893;898 +894;899 +895;900 +896;901 +897;902 +898;903 +899;904 +900;905 +901;906 +902;907 +903;908 +904;909 +905;910 +906;911 +907;912 +908;913 +909;914 +910;915 +911;916 +912;917 +913;918 +914;919 +915;920 +916;921 +917;922 +918;923 +919;924 +920;925 +921;926 +922;927 +923;928 +924;929 +925;930 +926;931 +927;932 +928;933 +929;934 +930;935 +931;936 +932;937 +933;938 +934;939 +935;940 +936;941 +937;942 +938;943 +939;944 +940;945 +941;946 +942;947 +943;948 +944;949 +945;950 +946;951 +947;952 +948;953 +949;954 +950;955 +951;956 +952;957 +953;958 +954;959 +955;960 +956;961 +957;962 +958;963 +959;964 +960;965 +961;966 +962;967 +963;968 +964;969 +965;970 +966;971 +967;972 +968;973 +969;974 +970;975 +971;976 +972;977 +973;978 +974;979 +975;980 +976;981 +977;982 +978;983 +979;984 +980;985 +981;986 +982;987 +983;988 +984;989 +985;990 +986;991 +987;992 +988;993 +989;994 +990;995 +991;996 +992;997 +993;998 +994;999 +995;1000 +996;1001 +997;1002 +998;1003 +999;1004 +1000;1005 +1001;1006 +1002;1007 +1003;1008 +1004;1009 +1005;1010 +1006;1011 +1007;1012 +1008;1013 +1009;1014 +1010;1015 +1011;1016 +1012;1017 +1013;1018 +1014;1019 +1015;1020 +1016;1021 +1017;1022 +1018;1023 +1019;1024 +1020;1025 +1021;1026 +1022;1027 +1023;1028 diff --git a/examples/osd/arduino-roller/tools/example.ods b/examples/osd/arduino-roller/tools/example.ods new file mode 100644 index 0000000000000000000000000000000000000000..3b867dde6f6946aa4a6d780db03807e8a7866a5d GIT binary patch literal 33474 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 Nh5{A_2Aet%4*;pZ)ztt1 literal 0 HcmV?d00001 diff --git a/examples/osd/arduino-roller/tools/lookuptable.py b/examples/osd/arduino-roller/tools/lookuptable.py new file mode 100644 index 000000000..531313509 --- /dev/null +++ b/examples/osd/arduino-roller/tools/lookuptable.py @@ -0,0 +1,176 @@ +#!/usr/bin/python + + +""" + Benutzung: +python lookuptable.py bla.csv bla.h bla.c +liest bla.csv aus, interpoliert das ganze und schreibt eine tabelle in bla.c und bla.h +Achtung, bla.c und bla.h werden brutal ueberschrieben! + +Das csv muss tabs, kommas oder semikolons als trenner haben und folgende felder enthalten: + +#LowValue + wird als y fuer alle x-werte, die kleiner als der kleinste x-Wert im csv sind, benutzt +#HighValue + wird als y fuer alle x-werte, die groesser als der groesste x-Wert im csv sind, benutzt +#DataType + Datentyp der y-Werte (uint16_t oder uint8_t) +#IndexType + Datentyp der x-Werte (uint16_t oder uint8_t) +#ArrayName + Name des Arrays + +Siehe example.csv!! + + +Benutzung auf eigene Gefahr. +""" + + +import fileinput +import re +import os +import sys + +# bei bedarf ergaezen. +AdditionalIncludes = [ '', '' ] + + +def create_printable_table(table, dataType, arrayName): + """ returns a string with the table in *.c format """ + result = '/** autogenerated lookup table */\n' + result += 'const ' + dataType + " g_LOOKUP_" + arrayName + '[] PROGMEM =\n' + result += '{\n' + for x in sorted(table.keys()): + y = table[x] + result += ' /* ' + repr(x).rjust(12) + ' */ ' + repr(y).rjust(12) + ',\n' + result += '};' + return result + + +def create_lookup_function(dataType, indexType, arrayName, biggestKey, highValue): + header = '' + body = '' + + header += '/**\n' + header += ' * autogenerated lookup function for ' + arrayName + "\n" + header += ' * @param i x value\n' + header += ' * @return f(i), or ' + str(highValue) + ' if i is out of range\n' + header += ' */\n' + header += dataType + ' lookup_' + arrayName + '(' + indexType + ' i);' + + body += dataType + ' lookup_' + arrayName + '(' + indexType + ' i)\n' + body += '{\n' + body += ' if (i <= ' + str(biggestKey) + ')\n' + body += ' return ' + if dataType == 'uint16_t': + body += 'pgm_read_word(&g_LOOKUP_' + arrayName + '[i]);\n' + elif dataType == 'uint8_t': + body += 'pgm_read_byte(&g_LOOKUP_' + arrayName + '[i]);\n' + else: + body += 'ERROR: no suitable datatype\n' + body += ' else\n' + body += ' return ' + str(highValue) + '; /* #HighValue */\n' + body += '}\n' + return header, body + + +def interpolate_lookup_table(table, lowValue): + #sortieren, durchgehen und interpolieren. + oldX = 0 + for nextX in sorted(table.keys()): + if not oldX in table.keys(): + if oldX == 0: + startY = lowValue + nextY = lowValue + else: + startY = table[oldX] + nextY = table[nextX] + for thisX in range(oldX, nextX): # die punkte zwischen den stuetzstellen durchgehen + thisY = startY + (nextY - startY) * (thisX - oldX) / (nextX - oldX) # lin. interpol. + table[thisX] = thisY + oldX = nextX + return table + + +def parse_csv(filename): + dataType = 'uint16_t' + indexType = 'uint8_t' + arrayName = 'TestArray' + lowestKey = 'ERROR' + biggestKey = 'ERROR' + highValue = 'ERROR' + lowValue = 'ERROR' + data = {} + csvFile = open(filename, 'r') + for line in csvFile: + zeile = line.strip().strip('"') + if re.match('\#', zeile): + myLine = re.split('[\t ;,]+', zeile) + if re.match('\#LowValue', myLine[0]): + lowValue = int(myLine[1].strip('"')) + elif re.match('\#HighValue', myLine[0]): + highValue = int(myLine[1].strip('"')) + elif re.match('\#DataType', myLine[0]): + dataType = str(myLine[1].strip('"')) + elif re.match('\#IndexType', myLine[0]): + indexType = str(myLine[1].strip('"')) + elif re.match('\#ArrayName', myLine[0]): + arrayName = str(myLine[1].strip('"')) + elif re.match('[0-9]+[,;\t]+[0-9]+', zeile): + myLine = re.split('[\t ;,]+', zeile) + data[int(myLine[0])] = int(myLine[1]) + lowestKey = min(data.keys()); + biggestKey = max(data.keys()); + return dataType, indexType, arrayName, biggestKey, lowestKey, highValue, lowValue, data + + +def write_header_file(filename, content, additionalIncludes): + headerfile = open(filename, 'w') + includeGuard = re.sub('\.', '_', filename) + '_' + headerfile.write('#ifndef ' + includeGuard + '\n') + headerfile.write('#define ' + includeGuard + '\n\n') + for h in additionalIncludes: + headerfile.write('#include ' + h + '\n') + headerfile.write('\n') + headerfile.write(content) + headerfile.write('\n\n#endif /* ' + includeGuard + ' */\n\n') + headerfile.close() + return + + +def write_body_file(bodyFileName, headerFileName, table, funct): + bodyfile = open(bodyFileName, 'w') + bodyfile.write('#include "' + headerFileName + '"\n\n') + bodyfile.write(table) + bodyfile.write('\n\n') + bodyfile.write(funct) + bodyfile.write('\n\n') + bodyfile.close() + return + + +def print_usage(): + print "MOEP: Benutzung python", sys.argv[0], "bla.csv bla.h bla.c" + print "bla.csv muss existieren, bla.h und bla.c werden ueberschrieben" + + + +if len(sys.argv) < 4: + print_usage() + sys.exit() + + +csvFile = sys.argv[1] +headerFileName = sys.argv[2] +bodyFileName = sys.argv[3] + + +dataType, indexType, arrayName, biggestKey, lowestKey, highValue, lowValue, data = parse_csv(csvFile) +fullTable = interpolate_lookup_table(data, lowValue) +header, body = create_lookup_function(dataType, indexType, arrayName, biggestKey, highValue) + +write_header_file(headerFileName, header, AdditionalIncludes) +write_body_file(bodyFileName, headerFileName, create_printable_table(fullTable, dataType, arrayName), body) + +sys.exit() diff --git a/examples/osd/arduino-roller/tools/test2.csv b/examples/osd/arduino-roller/tools/test2.csv new file mode 100644 index 000000000..61668b156 --- /dev/null +++ b/examples/osd/arduino-roller/tools/test2.csv @@ -0,0 +1,1029 @@ +"#LowValue";12345 +"#HighValue";6666 +"#DataType";"uint16_t" +"#IndexType";"uint16_t" +"#ArrayName";"Daumengas" +0;0 +1;1 +2;2 +3;3 +4;4 +5;5 +6;6 +7;7 +8;8 +9;9 +10;10 +11;11 +12;12 +13;13 +14;14 +15;15 +16;16 +17;17 +18;18 +19;19 +20;20 +21;21 +22;22 +23;23 +24;24 +25;25 +26;26 +27;27 +28;28 +29;29 +30;30 +31;31 +32;32 +33;33 +34;34 +35;35 +36;36 +37;37 +38;38 +39;39 +40;40 +41;41 +42;42 +43;43 +44;44 +45;45 +46;46 +47;47 +48;48 +49;49 +50;50 +51;51 +52;52 +53;53 +54;54 +55;55 +56;56 +57;57 +58;58 +59;59 +60;60 +61;61 +62;62 +63;63 +64;64 +65;65 +66;66 +67;67 +68;68 +69;69 +70;70 +71;71 +72;72 +73;73 +74;74 +75;75 +76;76 +77;77 +78;78 +79;79 +80;80 +81;81 +82;82 +83;83 +84;84 +85;85 +86;86 +87;87 +88;88 +89;89 +90;90 +91;91 +92;92 +93;93 +94;94 +95;95 +96;96 +97;97 +98;98 +99;99 +100;100 +101;101 +102;102 +103;103 +104;104 +105;105 +106;106 +107;107 +108;108 +109;109 +110;110 +111;111 +112;112 +113;113 +114;114 +115;115 +116;116 +117;117 +118;118 +119;119 +120;120 +121;121 +122;122 +123;123 +124;124 +125;125 +126;126 +127;127 +128;128 +129;129 +130;130 +131;131 +132;132 +133;133 +134;134 +135;135 +136;136 +137;137 +138;138 +139;139 +140;140 +141;141 +142;142 +143;143 +144;144 +145;145 +146;146 +147;147 +148;148 +149;149 +150;150 +151;151 +152;152 +153;153 +154;154 +155;155 +156;156 +157;157 +158;158 +159;159 +160;160 +161;161 +162;162 +163;163 +164;164 +165;165 +166;166 +167;167 +168;168 +169;169 +170;170 +171;171 +172;172 +173;173 +174;174 +175;175 +176;176 +177;177 +178;178 +179;179 +180;180 +181;181 +182;182 +183;183 +184;184 +185;185 +186;186 +187;187 +188;188 +189;189 +190;190 +191;191 +192;192 +193;193 +194;194 +195;195 +196;196 +197;197 +198;198 +199;199 +200;200 +201;201 +202;202 +203;203 +204;204 +205;205 +206;206 +207;207 +208;208 +209;209 +210;210 +211;211 +212;212 +213;213 +214;214 +215;215 +216;216 +217;217 +218;218 +219;219 +220;220 +221;221 +222;222 +223;223 +224;224 +225;225 +226;226 +227;227 +228;228 +229;229 +230;230 +231;231 +232;232 +233;233 +234;234 +235;235 +236;236 +237;237 +238;238 +239;239 +240;240 +241;241 +242;242 +243;243 +244;244 +245;245 +246;246 +247;247 +248;248 +249;249 +250;250 +251;251 +252;252 +253;253 +254;254 +255;255 +256;256 +257;257 +258;258 +259;259 +260;260 +261;261 +262;262 +263;263 +264;264 +265;265 +266;266 +267;267 +268;268 +269;269 +270;270 +271;271 +272;272 +273;273 +274;274 +275;275 +276;276 +277;277 +278;278 +279;279 +280;280 +281;281 +282;282 +283;283 +284;284 +285;285 +286;286 +287;287 +288;288 +289;289 +290;290 +291;291 +292;292 +293;293 +294;294 +295;295 +296;296 +297;297 +298;298 +299;299 +300;300 +301;301 +302;302 +303;303 +304;304 +305;305 +306;306 +307;307 +308;308 +309;309 +310;310 +311;311 +312;312 +313;313 +314;314 +315;315 +316;316 +317;317 +318;318 +319;319 +320;320 +321;321 +322;322 +323;323 +324;324 +325;325 +326;326 +327;327 +328;328 +329;329 +330;330 +331;331 +332;332 +333;333 +334;334 +335;335 +336;336 +337;337 +338;338 +339;339 +340;340 +341;341 +342;342 +343;343 +344;344 +345;345 +346;346 +347;347 +348;348 +349;349 +350;350 +351;351 +352;352 +353;353 +354;354 +355;355 +356;356 +357;357 +358;358 +359;359 +360;360 +361;361 +362;362 +363;363 +364;364 +365;365 +366;366 +367;367 +368;368 +369;369 +370;370 +371;371 +372;372 +373;373 +374;374 +375;375 +376;376 +377;377 +378;378 +379;379 +380;380 +381;381 +382;382 +383;383 +384;384 +385;385 +386;386 +387;387 +388;388 +389;389 +390;390 +391;391 +392;392 +393;393 +394;394 +395;395 +396;396 +397;397 +398;398 +399;399 +400;400 +401;401 +402;402 +403;403 +404;404 +405;405 +406;406 +407;407 +408;408 +409;409 +410;410 +411;411 +412;412 +413;413 +414;414 +415;415 +416;416 +417;417 +418;418 +419;419 +420;420 +421;421 +422;422 +423;423 +424;424 +425;425 +426;426 +427;427 +428;428 +429;429 +430;430 +431;431 +432;432 +433;433 +434;434 +435;435 +436;436 +437;437 +438;438 +439;439 +440;440 +441;441 +442;442 +443;443 +444;444 +445;445 +446;446 +447;447 +448;448 +449;449 +450;450 +451;451 +452;452 +453;453 +454;454 +455;455 +456;456 +457;457 +458;458 +459;459 +460;460 +461;461 +462;462 +463;463 +464;464 +465;465 +466;466 +467;467 +468;468 +469;469 +470;470 +471;471 +472;472 +473;473 +474;474 +475;475 +476;476 +477;477 +478;478 +479;479 +480;480 +481;481 +482;482 +483;483 +484;484 +485;485 +486;486 +487;487 +488;488 +489;489 +490;490 +491;491 +492;492 +493;493 +494;494 +495;495 +496;496 +497;497 +498;498 +499;499 +500;500 +501;501 +502;502 +503;503 +504;504 +505;505 +506;506 +507;507 +508;508 +509;509 +510;510 +511;511 +512;512 +513;513 +514;514 +515;515 +516;516 +517;517 +518;518 +519;519 +520;520 +521;521 +522;522 +523;523 +524;524 +525;525 +526;526 +527;527 +528;528 +529;529 +530;530 +531;531 +532;532 +533;533 +534;534 +535;535 +536;536 +537;537 +538;538 +539;539 +540;540 +541;541 +542;542 +543;543 +544;544 +545;545 +546;546 +547;547 +548;548 +549;549 +550;550 +551;551 +552;552 +553;553 +554;554 +555;555 +556;556 +557;557 +558;558 +559;559 +560;560 +561;561 +562;562 +563;563 +564;564 +565;565 +566;566 +567;567 +568;568 +569;569 +570;570 +571;571 +572;572 +573;573 +574;574 +575;575 +576;576 +577;577 +578;578 +579;579 +580;580 +581;581 +582;582 +583;583 +584;584 +585;585 +586;586 +587;587 +588;588 +589;589 +590;590 +591;591 +592;592 +593;593 +594;594 +595;595 +596;596 +597;597 +598;598 +599;599 +600;600 +601;601 +602;602 +603;603 +604;604 +605;605 +606;606 +607;607 +608;608 +609;609 +610;610 +611;611 +612;612 +613;613 +614;614 +615;615 +616;616 +617;617 +618;618 +619;619 +620;620 +621;621 +622;622 +623;623 +624;624 +625;625 +626;626 +627;627 +628;628 +629;629 +630;630 +631;631 +632;632 +633;633 +634;634 +635;635 +636;636 +637;637 +638;638 +639;639 +640;640 +641;641 +642;642 +643;643 +644;644 +645;645 +646;646 +647;647 +648;648 +649;649 +650;650 +651;651 +652;652 +653;653 +654;654 +655;655 +656;656 +657;657 +658;658 +659;659 +660;660 +661;661 +662;662 +663;663 +664;664 +665;665 +666;666 +667;667 +668;668 +669;669 +670;670 +671;671 +672;672 +673;673 +674;674 +675;675 +676;676 +677;677 +678;678 +679;679 +680;680 +681;681 +682;682 +683;683 +684;684 +685;685 +686;686 +687;687 +688;688 +689;689 +690;690 +691;691 +692;692 +693;693 +694;694 +695;695 +696;696 +697;697 +698;698 +699;699 +700;700 +701;701 +702;702 +703;703 +704;704 +705;705 +706;706 +707;707 +708;708 +709;709 +710;710 +711;711 +712;712 +713;713 +714;714 +715;715 +716;716 +717;717 +718;718 +719;719 +720;720 +721;721 +722;722 +723;723 +724;724 +725;725 +726;726 +727;727 +728;728 +729;729 +730;730 +731;731 +732;732 +733;733 +734;734 +735;735 +736;736 +737;737 +738;738 +739;739 +740;740 +741;741 +742;742 +743;743 +744;744 +745;745 +746;746 +747;747 +748;748 +749;749 +750;750 +751;751 +752;752 +753;753 +754;754 +755;755 +756;756 +757;757 +758;758 +759;759 +760;760 +761;761 +762;762 +763;763 +764;764 +765;765 +766;766 +767;767 +768;768 +769;769 +770;770 +771;771 +772;772 +773;773 +774;774 +775;775 +776;776 +777;777 +778;778 +779;779 +780;780 +781;781 +782;782 +783;783 +784;784 +785;785 +786;786 +787;787 +788;788 +789;789 +790;790 +791;791 +792;792 +793;793 +794;794 +795;795 +796;796 +797;797 +798;798 +799;799 +800;800 +801;801 +802;802 +803;803 +804;804 +805;805 +806;806 +807;807 +808;808 +809;809 +810;810 +811;811 +812;812 +813;813 +814;814 +815;815 +816;816 +817;817 +818;818 +819;819 +820;820 +821;821 +822;822 +823;823 +824;824 +825;825 +826;826 +827;827 +828;828 +829;829 +830;830 +831;831 +832;832 +833;833 +834;834 +835;835 +836;836 +837;837 +838;838 +839;839 +840;840 +841;841 +842;842 +843;843 +844;844 +845;845 +846;846 +847;847 +848;848 +849;849 +850;850 +851;851 +852;852 +853;853 +854;854 +855;855 +856;856 +857;857 +858;858 +859;859 +860;860 +861;861 +862;862 +863;863 +864;864 +865;865 +866;866 +867;867 +868;868 +869;869 +870;870 +871;871 +872;872 +873;873 +874;874 +875;875 +876;876 +877;877 +878;878 +879;879 +880;880 +881;881 +882;882 +883;883 +884;884 +885;885 +886;886 +887;887 +888;888 +889;889 +890;890 +891;891 +892;892 +893;893 +894;894 +895;895 +896;896 +897;897 +898;898 +899;899 +900;900 +901;901 +902;902 +903;903 +904;904 +905;905 +906;906 +907;907 +908;908 +909;909 +910;910 +911;911 +912;912 +913;913 +914;914 +915;915 +916;916 +917;917 +918;918 +919;919 +920;920 +921;921 +922;922 +923;923 +924;924 +925;925 +926;926 +927;927 +928;928 +929;929 +930;930 +931;931 +932;932 +933;933 +934;934 +935;935 +936;936 +937;937 +938;938 +939;939 +940;940 +941;941 +942;942 +943;943 +944;944 +945;945 +946;946 +947;947 +948;948 +949;949 +950;950 +951;951 +952;952 +953;953 +954;954 +955;955 +956;956 +957;957 +958;958 +959;959 +960;960 +961;961 +962;962 +963;963 +964;964 +965;965 +966;966 +967;967 +968;968 +969;969 +970;970 +971;971 +972;972 +973;973 +974;974 +975;975 +976;976 +977;977 +978;978 +979;979 +980;980 +981;981 +982;982 +983;983 +984;984 +985;985 +986;986 +987;987 +988;988 +989;989 +990;990 +991;991 +992;992 +993;993 +994;994 +995;995 +996;996 +997;997 +998;998 +999;999 +1000;1000 +1001;1001 +1002;1002 +1003;1003 +1004;1004 +1005;1005 +1006;1006 +1007;1007 +1008;1008 +1009;1009 +1010;1010 +1011;1011 +1012;1012 +1013;1013 +1014;1014 +1015;1015 +1016;1016 +1017;1017 +1018;1018 +1019;1019 +1020;1020 +1021;1021 +1022;1022 +1023;1023