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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', '' ] + + +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