diff --git a/memtemp/data.txt b/memtemp/data.txt deleted file mode 100644 index 45dffd98..00000000 --- a/memtemp/data.txt +++ /dev/null @@ -1,1992 +0,0 @@ -Get LBP cookie -Set Command timeout -Set LBPstatus -Get LBP status -UnitNumberRPC -Get card name char0 -Get card name char1 -Get card name char2 -Get card name char3 -Set Reserved stuff -DiscoveryRPC -read 0x90 from 0xa584 -read 0xa2 from 0xa585 -read 0xb0 from 0xa290 -read 0xb0 from 0xa290 -read 0x0 from 0xa291 -read 0x0 from 0xa292 -read 0x0 from 0xa293 -read 0x53 from 0xa294 -read 0x74 from 0xa295 -read 0x61 from 0xa296 -read 0x6e from 0xa297 -read 0x64 from 0xa298 -read 0x61 from 0xa299 -read 0x72 from 0xa29a -read 0x64 from 0xa29b -read 0x0 from 0xa29c -read 0x9e from 0xa586 -read 0xa2 from 0xa587 -read 0xb0 from 0xa29e -read 0xb0 from 0xa29e -read 0x0 from 0xa29f -read 0x1 from 0xa2a0 -read 0x0 from 0xa2a1 -read 0x49 from 0xa2a2 -read 0x4f from 0xa2a3 -read 0x5f from 0xa2a4 -read 0x53 from 0xa2a5 -read 0x70 from 0xa2a6 -read 0x69 from 0xa2a7 -read 0x6e from 0xa2a8 -read 0x0 from 0xa2a9 -read 0xaa from 0xa588 -read 0xa2 from 0xa589 -read 0xb0 from 0xa2aa -read 0xb0 from 0xa2aa -read 0x1 from 0xa2ab -read 0x1 from 0xa2ac -read 0x0 from 0xa2ad -read 0x49 from 0xa2ae -read 0x4f from 0xa2af -read 0x5f from 0xa2b0 -read 0x41 from 0xa2b1 -read 0x6e from 0xa2b2 -read 0x61 from 0xa2b3 -read 0x5f from 0xa2b4 -read 0x53 from 0xa2b5 -read 0x70 from 0xa2b6 -read 0x69 from 0xa2b7 -read 0x6e from 0xa2b8 -read 0x0 from 0xa2b9 -read 0xba from 0xa58a -read 0xa2 from 0xa58b -read 0xb0 from 0xa2ba -read 0xb0 from 0xa2ba -read 0x2 from 0xa2bb -read 0x1 from 0xa2bc -read 0x0 from 0xa2bd -read 0x49 from 0xa2be -read 0x4f from 0xa2bf -read 0x5f from 0xa2c0 -read 0x45 from 0xa2c1 -read 0x6e from 0xa2c2 -read 0x63 from 0xa2c3 -read 0x5f from 0xa2c4 -read 0x41 from 0xa2c5 -read 0x6e from 0xa2c6 -read 0x61 from 0xa2c7 -read 0x5f from 0xa2c8 -read 0x53 from 0xa2c9 -read 0x70 from 0xa2ca -read 0x69 from 0xa2cb -read 0x6e from 0xa2cc -read 0x5f from 0xa2cd -read 0x46 from 0xa2ce -read 0x56 from 0xa2cf -read 0x0 from 0xa2d0 -read 0xd2 from 0xa58c -read 0xa2 from 0xa58d -read 0xa0 from 0xa2d2 -read 0xa0 from 0xa2d2 -read 0x20 from 0xa2d3 -read 0x1 from 0xa2d4 -read 0x0 from 0xa2d5 -read 0x0 from 0xa2d6 -read 0x0 from 0xa2d7 -read 0x0 from 0xa2d8 -read 0x0 from 0xa2d9 -read 0x0 from 0xa2da -read 0x0 from 0xa2db -read 0x0 from 0xa2dc -read 0x0 from 0xa2dd -read 0x8 from 0xa2de -read 0x8 from 0xa2df -read 0x4e from 0xa2e0 -read 0x6f from 0xa2e1 -read 0x6e from 0xa2e2 -read 0x65 from 0xa2e3 -read 0x0 from 0xa2e4 -read 0x49 from 0xa2e5 -read 0x6e from 0xa2e6 -read 0x70 from 0xa2e7 -read 0x75 from 0xa2e8 -read 0x74 from 0xa2e9 -read 0x0 from 0xa2ea -read 0xec from 0xa58e -read 0xa2 from 0xa58f -read 0xa0 from 0xa2ec -read 0xa0 from 0xa2ec -read 0x10 from 0xa2ed -read 0x1 from 0xa2ee -read 0x80 from 0xa2ef -read 0x0 from 0xa2f0 -read 0x0 from 0xa2f1 -read 0x0 from 0xa2f2 -read 0x0 from 0xa2f3 -read 0x0 from 0xa2f4 -read 0x0 from 0xa2f5 -read 0x0 from 0xa2f6 -read 0x0 from 0xa2f7 -read 0x0 from 0xa2f8 -read 0x8 from 0xa2f9 -read 0x4e from 0xa2fa -read 0x6f from 0xa2fb -read 0x6e from 0xa2fc -read 0x65 from 0xa2fd -read 0x0 from 0xa2fe -read 0x4f from 0xa2ff -read 0x75 from 0xa300 -read 0x74 from 0xa301 -read 0x70 from 0xa302 -read 0x75 from 0xa303 -read 0x74 from 0xa304 -read 0x0 from 0xa305 -read 0x6 from 0xa590 -read 0xa3 from 0xa591 -read 0xa0 from 0xa306 -read 0xa0 from 0xa306 -read 0x10 from 0xa307 -read 0x2 from 0xa308 -read 0x80 from 0xa309 -read 0x0 from 0xa30a -read 0x0 from 0xa30b -read 0x0 from 0xa30c -read 0x0 from 0xa30d -read 0x0 from 0xa30e -read 0x0 from 0xa30f -read 0xc8 from 0xa310 -read 0x42 from 0xa311 -read 0x40 from 0xa312 -read 0x8 from 0xa313 -read 0x50 from 0xa314 -read 0x65 from 0xa315 -read 0x72 from 0xa316 -read 0x63 from 0xa317 -read 0x65 from 0xa318 -read 0x6e from 0xa319 -read 0x74 from 0xa31a -read 0x0 from 0xa31b -read 0x53 from 0xa31c -read 0x70 from 0xa31d -read 0x69 from 0xa31e -read 0x6e from 0xa31f -read 0x4f from 0xa320 -read 0x75 from 0xa321 -read 0x74 from 0xa322 -read 0x0 from 0xa323 -read 0x24 from 0xa592 -read 0xa3 from 0xa593 -read 0xa0 from 0xa324 -read 0xa0 from 0xa324 -read 0x8 from 0xa325 -read 0x7 from 0xa326 -read 0x80 from 0xa327 -read 0x0 from 0xa328 -read 0x0 from 0xa329 -read 0x0 from 0xa32a -read 0x0 from 0xa32b -read 0x0 from 0xa32c -read 0x0 from 0xa32d -read 0x0 from 0xa32e -read 0x0 from 0xa32f -read 0x42 from 0xa330 -read 0x8 from 0xa331 -read 0x4e from 0xa332 -read 0x6f from 0xa333 -read 0x6e from 0xa334 -read 0x65 from 0xa335 -read 0x0 from 0xa336 -read 0x53 from 0xa337 -read 0x70 from 0xa338 -read 0x69 from 0xa339 -read 0x6e from 0xa33a -read 0x45 from 0xa33b -read 0x6e from 0xa33c -read 0x61 from 0xa33d -read 0x0 from 0xa33e -read 0x40 from 0xa594 -read 0xa3 from 0xa595 -read 0xa0 from 0xa340 -read 0xa0 from 0xa340 -read 0x8 from 0xa341 -read 0x7 from 0xa342 -read 0x80 from 0xa343 -read 0x0 from 0xa344 -read 0x0 from 0xa345 -read 0x0 from 0xa346 -read 0x0 from 0xa347 -read 0x0 from 0xa348 -read 0x0 from 0xa349 -read 0x0 from 0xa34a -read 0x0 from 0xa34b -read 0x43 from 0xa34c -read 0x8 from 0xa34d -read 0x4e from 0xa34e -read 0x6f from 0xa34f -read 0x6e from 0xa350 -read 0x65 from 0xa351 -read 0x0 from 0xa352 -read 0x53 from 0xa353 -read 0x70 from 0xa354 -read 0x69 from 0xa355 -read 0x6e from 0xa356 -read 0x44 from 0xa357 -read 0x69 from 0xa358 -read 0x72 from 0xa359 -read 0x0 from 0xa35a -read 0x5c from 0xa596 -read 0xa3 from 0xa597 -read 0xa0 from 0xa35c -read 0xa0 from 0xa35c -read 0x8 from 0xa35d -read 0x2 from 0xa35e -read 0x0 from 0xa35f -read 0x0 from 0xa360 -read 0x0 from 0xa361 -read 0x0 from 0xa362 -read 0x0 from 0xa363 -read 0x33 from 0xa364 -read 0x33 from 0xa365 -read 0x11 from 0xa366 -read 0x42 from 0xa367 -read 0x10 from 0xa368 -read 0x8 from 0xa369 -read 0x56 from 0xa36a -read 0x6f from 0xa36b -read 0x6c from 0xa36c -read 0x74 from 0xa36d -read 0x73 from 0xa36e -read 0x0 from 0xa36f -read 0x41 from 0xa370 -read 0x6e from 0xa371 -read 0x61 from 0xa372 -read 0x6c from 0xa373 -read 0x6f from 0xa374 -read 0x67 from 0xa375 -read 0x49 from 0xa376 -read 0x6e from 0xa377 -read 0x30 from 0xa378 -read 0x0 from 0xa379 -read 0x7a from 0xa598 -read 0xa3 from 0xa599 -read 0xa0 from 0xa37a -read 0xa0 from 0xa37a -read 0x8 from 0xa37b -read 0x2 from 0xa37c -read 0x0 from 0xa37d -read 0x0 from 0xa37e -read 0x0 from 0xa37f -read 0x0 from 0xa380 -read 0x0 from 0xa381 -read 0x33 from 0xa382 -read 0x33 from 0xa383 -read 0x11 from 0xa384 -read 0x42 from 0xa385 -read 0x11 from 0xa386 -read 0x8 from 0xa387 -read 0x56 from 0xa388 -read 0x6f from 0xa389 -read 0x6c from 0xa38a -read 0x74 from 0xa38b -read 0x73 from 0xa38c -read 0x0 from 0xa38d -read 0x41 from 0xa38e -read 0x6e from 0xa38f -read 0x61 from 0xa390 -read 0x6c from 0xa391 -read 0x6f from 0xa392 -read 0x67 from 0xa393 -read 0x49 from 0xa394 -read 0x6e from 0xa395 -read 0x31 from 0xa396 -read 0x0 from 0xa397 -read 0x98 from 0xa59a -read 0xa3 from 0xa59b -read 0xa0 from 0xa398 -read 0xa0 from 0xa398 -read 0x8 from 0xa399 -read 0x2 from 0xa39a -read 0x0 from 0xa39b -read 0x0 from 0xa39c -read 0x0 from 0xa39d -read 0x0 from 0xa39e -read 0x0 from 0xa39f -read 0x33 from 0xa3a0 -read 0x33 from 0xa3a1 -read 0x11 from 0xa3a2 -read 0x42 from 0xa3a3 -read 0x12 from 0xa3a4 -read 0x8 from 0xa3a5 -read 0x56 from 0xa3a6 -read 0x6f from 0xa3a7 -read 0x6c from 0xa3a8 -read 0x74 from 0xa3a9 -read 0x73 from 0xa3aa -read 0x0 from 0xa3ab -read 0x41 from 0xa3ac -read 0x6e from 0xa3ad -read 0x61 from 0xa3ae -read 0x6c from 0xa3af -read 0x6f from 0xa3b0 -read 0x67 from 0xa3b1 -read 0x49 from 0xa3b2 -read 0x6e from 0xa3b3 -read 0x32 from 0xa3b4 -read 0x0 from 0xa3b5 -read 0xb6 from 0xa59c -read 0xa3 from 0xa59d -read 0xa0 from 0xa3b6 -read 0xa0 from 0xa3b6 -read 0x8 from 0xa3b7 -read 0x2 from 0xa3b8 -read 0x0 from 0xa3b9 -read 0x0 from 0xa3ba -read 0x0 from 0xa3bb -read 0x0 from 0xa3bc -read 0x0 from 0xa3bd -read 0x33 from 0xa3be -read 0x33 from 0xa3bf -read 0x11 from 0xa3c0 -read 0x42 from 0xa3c1 -read 0x13 from 0xa3c2 -read 0x8 from 0xa3c3 -read 0x56 from 0xa3c4 -read 0x6f from 0xa3c5 -read 0x6c from 0xa3c6 -read 0x74 from 0xa3c7 -read 0x73 from 0xa3c8 -read 0x0 from 0xa3c9 -read 0x41 from 0xa3ca -read 0x6e from 0xa3cb -read 0x61 from 0xa3cc -read 0x6c from 0xa3cd -read 0x6f from 0xa3ce -read 0x67 from 0xa3cf -read 0x49 from 0xa3d0 -read 0x6e from 0xa3d1 -read 0x33 from 0xa3d2 -read 0x0 from 0xa3d3 -read 0xd4 from 0xa59e -read 0xa3 from 0xa59f -read 0xa0 from 0xa3d4 -read 0xa0 from 0xa3d4 -read 0x10 from 0xa3d5 -read 0x2 from 0xa3d6 -read 0x0 from 0xa3d7 -read 0x0 from 0xa3d8 -read 0x0 from 0xa3d9 -read 0x0 from 0xa3da -read 0x0 from 0xa3db -read 0x33 from 0xa3dc -read 0x33 from 0xa3dd -read 0x11 from 0xa3de -read 0x42 from 0xa3df -read 0x18 from 0xa3e0 -read 0xa from 0xa3e1 -read 0x56 from 0xa3e2 -read 0x6f from 0xa3e3 -read 0x6c from 0xa3e4 -read 0x74 from 0xa3e5 -read 0x73 from 0xa3e6 -read 0x0 from 0xa3e7 -read 0x46 from 0xa3e8 -read 0x69 from 0xa3e9 -read 0x65 from 0xa3ea -read 0x6c from 0xa3eb -read 0x64 from 0xa3ec -read 0x56 from 0xa3ed -read 0x6f from 0xa3ee -read 0x6c from 0xa3ef -read 0x74 from 0xa3f0 -read 0x61 from 0xa3f1 -read 0x67 from 0xa3f2 -read 0x65 from 0xa3f3 -read 0x0 from 0xa3f4 -read 0xf6 from 0xa5a0 -read 0xa3 from 0xa5a1 -read 0xa0 from 0xa3f6 -read 0xa0 from 0xa3f6 -read 0x8 from 0xa3f7 -read 0x8 from 0xa3f8 -read 0x0 from 0xa3f9 -read 0x0 from 0xa3fa -read 0x0 from 0xa3fb -read 0x0 from 0xa3fc -read 0x0 from 0xa3fd -read 0x0 from 0xa3fe -read 0x0 from 0xa3ff -read 0x0 from 0xa400 -read 0x0 from 0xa401 -read 0xa0 from 0xa402 -read 0x9 from 0xa403 -read 0x43 from 0xa404 -read 0x6f from 0xa405 -read 0x75 from 0xa406 -read 0x6e from 0xa407 -read 0x74 from 0xa408 -read 0x73 from 0xa409 -read 0x0 from 0xa40a -read 0x45 from 0xa40b -read 0x6e from 0xa40c -read 0x63 from 0xa40d -read 0x30 from 0xa40e -read 0x0 from 0xa40f -read 0x10 from 0xa5a2 -read 0xa4 from 0xa5a3 -read 0xa0 from 0xa410 -read 0xa0 from 0xa410 -read 0x8 from 0xa411 -read 0x8 from 0xa412 -read 0x0 from 0xa413 -read 0x0 from 0xa414 -read 0x0 from 0xa415 -read 0x0 from 0xa416 -read 0x0 from 0xa417 -read 0x0 from 0xa418 -read 0x0 from 0xa419 -read 0x0 from 0xa41a -read 0x0 from 0xa41b -read 0xa2 from 0xa41c -read 0x9 from 0xa41d -read 0x43 from 0xa41e -read 0x6f from 0xa41f -read 0x75 from 0xa420 -read 0x6e from 0xa421 -read 0x74 from 0xa422 -read 0x73 from 0xa423 -read 0x0 from 0xa424 -read 0x45 from 0xa425 -read 0x6e from 0xa426 -read 0x63 from 0xa427 -read 0x31 from 0xa428 -read 0x0 from 0xa429 -read 0x2a from 0xa5a4 -read 0xa4 from 0xa5a5 -read 0xa0 from 0xa42a -read 0xa0 from 0xa42a -read 0x10 from 0xa42b -read 0x2 from 0xa42c -read 0x80 from 0xa42d -read 0x0 from 0xa42e -read 0x0 from 0xa42f -read 0x0 from 0xa430 -read 0x0 from 0xa431 -read 0x0 from 0xa432 -read 0x0 from 0xa433 -read 0x0 from 0xa434 -read 0x0 from 0xa435 -read 0x5c from 0xa436 -read 0x9 from 0xa437 -read 0x4e from 0xa438 -read 0x6f from 0xa439 -read 0x6e from 0xa43a -read 0x65 from 0xa43b -read 0x0 from 0xa43c -read 0x53 from 0xa43d -read 0x77 from 0xa43e -read 0x52 from 0xa43f -read 0x65 from 0xa440 -read 0x76 from 0xa441 -read 0x69 from 0xa442 -read 0x73 from 0xa443 -read 0x69 from 0xa444 -read 0x6f from 0xa445 -read 0x6e from 0xa446 -read 0x0 from 0xa447 -read 0x48 from 0xa5a6 -read 0xa4 from 0xa5a7 -read 0xa0 from 0xa448 -read 0xa0 from 0xa448 -read 0x10 from 0xa449 -read 0x2 from 0xa44a -read 0x80 from 0xa44b -read 0x0 from 0xa44c -read 0x0 from 0xa44d -read 0x0 from 0xa44e -read 0x0 from 0xa44f -read 0x0 from 0xa450 -read 0x0 from 0xa451 -read 0x0 from 0xa452 -read 0x0 from 0xa453 -read 0x74 from 0xa454 -read 0x9 from 0xa455 -read 0x4e from 0xa456 -read 0x6f from 0xa457 -read 0x6e from 0xa458 -read 0x65 from 0xa459 -read 0x0 from 0xa45a -read 0x48 from 0xa45b -read 0x77 from 0xa45c -read 0x52 from 0xa45d -read 0x65 from 0xa45e -read 0x76 from 0xa45f -read 0x69 from 0xa460 -read 0x73 from 0xa461 -read 0x69 from 0xa462 -read 0x6f from 0xa463 -read 0x6e from 0xa464 -read 0x0 from 0xa465 -read 0x66 from 0xa5a8 -read 0xa4 from 0xa5a9 -read 0xa0 from 0xa466 -read 0xa0 from 0xa466 -read 0x10 from 0xa467 -read 0x4 from 0xa468 -read 0x40 from 0xa469 -read 0x0 from 0xa46a -read 0x0 from 0xa46b -read 0x0 from 0xa46c -read 0x0 from 0xa46d -read 0x0 from 0xa46e -read 0x0 from 0xa46f -read 0x0 from 0xa470 -read 0x0 from 0xa471 -read 0x0 from 0xa472 -read 0x0 from 0xa473 -read 0x4e from 0xa474 -read 0x6f from 0xa475 -read 0x6e from 0xa476 -read 0x65 from 0xa477 -read 0x0 from 0xa478 -read 0x4e from 0xa479 -read 0x56 from 0xa47a -read 0x42 from 0xa47b -read 0x61 from 0xa47c -read 0x75 from 0xa47d -read 0x64 from 0xa47e -read 0x52 from 0xa47f -read 0x61 from 0xa480 -read 0x74 from 0xa481 -read 0x65 from 0xa482 -read 0x0 from 0xa483 -read 0x84 from 0xa5aa -read 0xa4 from 0xa5ab -read 0xa0 from 0xa484 -read 0xa0 from 0xa484 -read 0x20 from 0xa485 -read 0x4 from 0xa486 -read 0x0 from 0xa487 -read 0x0 from 0xa488 -read 0x0 from 0xa489 -read 0x0 from 0xa48a -read 0x0 from 0xa48b -read 0x0 from 0xa48c -read 0x0 from 0xa48d -read 0x0 from 0xa48e -read 0x0 from 0xa48f -read 0x78 from 0xa490 -read 0x0 from 0xa491 -read 0x4e from 0xa492 -read 0x6f from 0xa493 -read 0x6e from 0xa494 -read 0x65 from 0xa495 -read 0x0 from 0xa496 -read 0x4e from 0xa497 -read 0x56 from 0xa498 -read 0x55 from 0xa499 -read 0x6e from 0xa49a -read 0x69 from 0xa49b -read 0x74 from 0xa49c -read 0x4e from 0xa49d -read 0x75 from 0xa49e -read 0x6d from 0xa49f -read 0x62 from 0xa4a0 -read 0x65 from 0xa4a1 -read 0x72 from 0xa4a2 -read 0x0 from 0xa4a3 -read 0xa4 from 0xa5ac -read 0xa4 from 0xa5ad -read 0xa0 from 0xa4a4 -read 0xa0 from 0xa4a4 -read 0x10 from 0xa4a5 -read 0x4 from 0xa4a6 -read 0x0 from 0xa4a7 -read 0x0 from 0xa4a8 -read 0x0 from 0xa4a9 -read 0x0 from 0xa4aa -read 0x0 from 0xa4ab -read 0x0 from 0xa4ac -read 0x0 from 0xa4ad -read 0x0 from 0xa4ae -read 0x0 from 0xa4af -read 0x38 from 0xa4b0 -read 0x0 from 0xa4b1 -read 0x4e from 0xa4b2 -read 0x6f from 0xa4b3 -read 0x6e from 0xa4b4 -read 0x65 from 0xa4b5 -read 0x0 from 0xa4b6 -read 0x4e from 0xa4b7 -read 0x56 from 0xa4b8 -read 0x57 from 0xa4b9 -read 0x61 from 0xa4ba -read 0x74 from 0xa4bb -read 0x63 from 0xa4bc -read 0x68 from 0xa4bd -read 0x44 from 0xa4be -read 0x6f from 0xa4bf -read 0x67 from 0xa4c0 -read 0x54 from 0xa4c1 -read 0x69 from 0xa4c2 -read 0x6d from 0xa4c3 -read 0x65 from 0xa4c4 -read 0x6f from 0xa4c5 -read 0x75 from 0xa4c6 -read 0x74 from 0xa4c7 -read 0x0 from 0xa4c8 -read 0xca from 0xa5ae -read 0xa4 from 0xa5af -read 0xa0 from 0xa4ca -read 0xa0 from 0xa4ca -read 0x10 from 0xa4cb -read 0x2 from 0xa4cc -read 0x0 from 0xa4cd -read 0x0 from 0xa4ce -read 0x0 from 0xa4cf -read 0x0 from 0xa4d0 -read 0x0 from 0xa4d1 -read 0x0 from 0xa4d2 -read 0x0 from 0xa4d3 -read 0x0 from 0xa4d4 -read 0x0 from 0xa4d5 -read 0x98 from 0xa4d6 -read 0x9 from 0xa4d7 -read 0x4e from 0xa4d8 -read 0x6f from 0xa4d9 -read 0x6e from 0xa4da -read 0x65 from 0xa4db -read 0x0 from 0xa4dc -read 0x45 from 0xa4dd -read 0x6e from 0xa4de -read 0x63 from 0xa4df -read 0x4d from 0xa4e0 -read 0x6f from 0xa4e1 -read 0x64 from 0xa4e2 -read 0x65 from 0xa4e3 -read 0x30 from 0xa4e4 -read 0x0 from 0xa4e5 -read 0xe6 from 0xa5b0 -read 0xa4 from 0xa5b1 -read 0xa0 from 0xa4e6 -read 0xa0 from 0xa4e6 -read 0x10 from 0xa4e7 -read 0x2 from 0xa4e8 -read 0x0 from 0xa4e9 -read 0x0 from 0xa4ea -read 0x0 from 0xa4eb -read 0x0 from 0xa4ec -read 0x0 from 0xa4ed -read 0x0 from 0xa4ee -read 0x0 from 0xa4ef -read 0x0 from 0xa4f0 -read 0x0 from 0xa4f1 -read 0x9a from 0xa4f2 -read 0x9 from 0xa4f3 -read 0x4e from 0xa4f4 -read 0x6f from 0xa4f5 -read 0x6e from 0xa4f6 -read 0x65 from 0xa4f7 -read 0x0 from 0xa4f8 -read 0x45 from 0xa4f9 -read 0x6e from 0xa4fa -read 0x63 from 0xa4fb -read 0x4d from 0xa4fc -read 0x6f from 0xa4fd -read 0x64 from 0xa4fe -read 0x65 from 0xa4ff -read 0x31 from 0xa500 -read 0x0 from 0xa501 -read 0x2 from 0xa5b2 -read 0xa5 from 0xa5b3 -read 0xa0 from 0xa502 -read 0xa0 from 0xa502 -read 0x10 from 0xa503 -read 0x4 from 0xa504 -read 0x0 from 0xa505 -read 0x0 from 0xa506 -read 0x0 from 0xa507 -read 0x0 from 0xa508 -read 0x0 from 0xa509 -read 0x0 from 0xa50a -read 0x0 from 0xa50b -read 0x0 from 0xa50c -read 0x0 from 0xa50d -read 0x3a from 0xa50e -read 0x0 from 0xa50f -read 0x4e from 0xa510 -read 0x6f from 0xa511 -read 0x6e from 0xa512 -read 0x65 from 0xa513 -read 0x0 from 0xa514 -read 0x4e from 0xa515 -read 0x56 from 0xa516 -read 0x45 from 0xa517 -read 0x6e from 0xa518 -read 0x63 from 0xa519 -read 0x4d from 0xa51a -read 0x6f from 0xa51b -read 0x64 from 0xa51c -read 0x65 from 0xa51d -read 0x30 from 0xa51e -read 0x0 from 0xa51f -read 0x20 from 0xa5b4 -read 0xa5 from 0xa5b5 -read 0xa0 from 0xa520 -read 0xa0 from 0xa520 -read 0x10 from 0xa521 -read 0x4 from 0xa522 -read 0x0 from 0xa523 -read 0x0 from 0xa524 -read 0x0 from 0xa525 -read 0x0 from 0xa526 -read 0x0 from 0xa527 -read 0x0 from 0xa528 -read 0x0 from 0xa529 -read 0x0 from 0xa52a -read 0x0 from 0xa52b -read 0x3c from 0xa52c -read 0x0 from 0xa52d -read 0x4e from 0xa52e -read 0x6f from 0xa52f -read 0x6e from 0xa530 -read 0x65 from 0xa531 -read 0x0 from 0xa532 -read 0x4e from 0xa533 -read 0x56 from 0xa534 -read 0x45 from 0xa535 -read 0x6e from 0xa536 -read 0x63 from 0xa537 -read 0x4d from 0xa538 -read 0x6f from 0xa539 -read 0x64 from 0xa53a -read 0x65 from 0xa53b -read 0x31 from 0xa53c -read 0x0 from 0xa53d -read 0x0 from 0xa5b6 -read 0x0 from 0xa5b7 -read 0xe from 0x95c -read 0x0 from 0x95d -Set Reserved stuff -read 0x9 0x0 from 0x0 -Set Reserved stuff -Set Reserved stuff -read 0x76 0x1 0x0 0x10 from 0x78 -Set Reserved stuff -Set Reserved stuff -read 0x32 0x0 from 0x38 -Set Reserved stuff -Set Reserved stuff -read 0x0 0x0 from 0x3a -Set Reserved stuff -Set Reserved stuff -read 0x0 0x0 from 0x3c -Set Reserved stuff -read 0x90 from 0xa53e -read 0xa2 from 0xa53f -read 0xb0 from 0xa290 -read 0xb0 from 0xa290 -read 0x0 from 0xa291 -read 0x0 from 0xa292 -read 0x0 from 0xa293 -read 0x53 from 0xa294 -read 0x74 from 0xa295 -read 0x61 from 0xa296 -read 0x6e from 0xa297 -read 0x64 from 0xa298 -read 0x61 from 0xa299 -read 0x72 from 0xa29a -read 0x64 from 0xa29b -read 0x0 from 0xa29c -read 0x9e from 0xa540 -read 0xa2 from 0xa541 -read 0xb0 from 0xa29e -read 0xb0 from 0xa29e -read 0x0 from 0xa29f -read 0x1 from 0xa2a0 -read 0x0 from 0xa2a1 -read 0x49 from 0xa2a2 -read 0x4f from 0xa2a3 -read 0x5f from 0xa2a4 -read 0x53 from 0xa2a5 -read 0x70 from 0xa2a6 -read 0x69 from 0xa2a7 -read 0x6e from 0xa2a8 -read 0x0 from 0xa2a9 -read 0xd2 from 0xa542 -read 0xa2 from 0xa543 -read 0xa0 from 0xa2d2 -read 0xa0 from 0xa2d2 -read 0x20 from 0xa2d3 -read 0x1 from 0xa2d4 -read 0x0 from 0xa2d5 -read 0x0 from 0xa2d6 -read 0x0 from 0xa2d7 -read 0x0 from 0xa2d8 -read 0x0 from 0xa2d9 -read 0x0 from 0xa2da -read 0x0 from 0xa2db -read 0x0 from 0xa2dc -read 0x0 from 0xa2dd -read 0x8 from 0xa2de -read 0x8 from 0xa2df -read 0x4e from 0xa2e0 -read 0x6f from 0xa2e1 -read 0x6e from 0xa2e2 -read 0x65 from 0xa2e3 -read 0x0 from 0xa2e4 -read 0x49 from 0xa2e5 -read 0x6e from 0xa2e6 -read 0x70 from 0xa2e7 -read 0x75 from 0xa2e8 -read 0x74 from 0xa2e9 -read 0x0 from 0xa2ea -read 0xec from 0xa544 -read 0xa2 from 0xa545 -read 0xa0 from 0xa2ec -read 0xa0 from 0xa2ec -read 0x10 from 0xa2ed -read 0x1 from 0xa2ee -read 0x80 from 0xa2ef -read 0x0 from 0xa2f0 -read 0x0 from 0xa2f1 -read 0x0 from 0xa2f2 -read 0x0 from 0xa2f3 -read 0x0 from 0xa2f4 -read 0x0 from 0xa2f5 -read 0x0 from 0xa2f6 -read 0x0 from 0xa2f7 -read 0x0 from 0xa2f8 -read 0x8 from 0xa2f9 -read 0x4e from 0xa2fa -read 0x6f from 0xa2fb -read 0x6e from 0xa2fc -read 0x65 from 0xa2fd -read 0x0 from 0xa2fe -read 0x4f from 0xa2ff -read 0x75 from 0xa300 -read 0x74 from 0xa301 -read 0x70 from 0xa302 -read 0x75 from 0xa303 -read 0x74 from 0xa304 -read 0x0 from 0xa305 -read 0x6 from 0xa546 -read 0xa3 from 0xa547 -read 0xa0 from 0xa306 -read 0xa0 from 0xa306 -read 0x10 from 0xa307 -read 0x2 from 0xa308 -read 0x80 from 0xa309 -read 0x0 from 0xa30a -read 0x0 from 0xa30b -read 0x0 from 0xa30c -read 0x0 from 0xa30d -read 0x0 from 0xa30e -read 0x0 from 0xa30f -read 0xc8 from 0xa310 -read 0x42 from 0xa311 -read 0x40 from 0xa312 -read 0x8 from 0xa313 -read 0x50 from 0xa314 -read 0x65 from 0xa315 -read 0x72 from 0xa316 -read 0x63 from 0xa317 -read 0x65 from 0xa318 -read 0x6e from 0xa319 -read 0x74 from 0xa31a -read 0x0 from 0xa31b -read 0x53 from 0xa31c -read 0x70 from 0xa31d -read 0x69 from 0xa31e -read 0x6e from 0xa31f -read 0x4f from 0xa320 -read 0x75 from 0xa321 -read 0x74 from 0xa322 -read 0x0 from 0xa323 -read 0x24 from 0xa548 -read 0xa3 from 0xa549 -read 0xa0 from 0xa324 -read 0xa0 from 0xa324 -read 0x8 from 0xa325 -read 0x7 from 0xa326 -read 0x80 from 0xa327 -read 0x0 from 0xa328 -read 0x0 from 0xa329 -read 0x0 from 0xa32a -read 0x0 from 0xa32b -read 0x0 from 0xa32c -read 0x0 from 0xa32d -read 0x0 from 0xa32e -read 0x0 from 0xa32f -read 0x42 from 0xa330 -read 0x8 from 0xa331 -read 0x4e from 0xa332 -read 0x6f from 0xa333 -read 0x6e from 0xa334 -read 0x65 from 0xa335 -read 0x0 from 0xa336 -read 0x53 from 0xa337 -read 0x70 from 0xa338 -read 0x69 from 0xa339 -read 0x6e from 0xa33a -read 0x45 from 0xa33b -read 0x6e from 0xa33c -read 0x61 from 0xa33d -read 0x0 from 0xa33e -read 0x40 from 0xa54a -read 0xa3 from 0xa54b -read 0xa0 from 0xa340 -read 0xa0 from 0xa340 -read 0x8 from 0xa341 -read 0x7 from 0xa342 -read 0x80 from 0xa343 -read 0x0 from 0xa344 -read 0x0 from 0xa345 -read 0x0 from 0xa346 -read 0x0 from 0xa347 -read 0x0 from 0xa348 -read 0x0 from 0xa349 -read 0x0 from 0xa34a -read 0x0 from 0xa34b -read 0x43 from 0xa34c -read 0x8 from 0xa34d -read 0x4e from 0xa34e -read 0x6f from 0xa34f -read 0x6e from 0xa350 -read 0x65 from 0xa351 -read 0x0 from 0xa352 -read 0x53 from 0xa353 -read 0x70 from 0xa354 -read 0x69 from 0xa355 -read 0x6e from 0xa356 -read 0x44 from 0xa357 -read 0x69 from 0xa358 -read 0x72 from 0xa359 -read 0x0 from 0xa35a -read 0x0 from 0xa54c -read 0x0 from 0xa54d -Get LBP cookie -Set Command timeout -Set LBPstatus -Get LBP status -UnitNumberRPC -Get card name char0 -Get card name char1 -Get card name char2 -Get card name char3 -Set Reserved stuff -DiscoveryRPC -ProcessDataRPC -Set Reserved stuff -Get undefined stuff -Get undefined stuff -Get config name char3 -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -Set Reserved stuff -Get LBP cookie -Set Command timeout -Set LBPstatus -Get LBP status -UnitNumberRPC -Get card name char0 -Get card name char1 -Get card name char2 -Get card name char3 -Set Reserved stuff -DiscoveryRPC -ProcessDataRPC -Set Reserved stuff -Get undefined stuff -Get undefined stuff -Get undefined stuff -Get undefined stuff -Get config name char3 -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC -ProcessDataRPC diff --git a/memtemp/memtemp.c b/memtemp/memtemp.c deleted file mode 100644 index 4bbdf225..00000000 --- a/memtemp/memtemp.c +++ /dev/null @@ -1,464 +0,0 @@ - -#include -#include -#include - -#define MEM_SIZE 1024 - -//process data -#define RECORD_TYPE_PROCESS_DATA_RECORD 0xA0 -#define DATA_TYPE_PAD 0x00 -#define DATA_TYPE_BITS 0x01 -#define DATA_TYPE_UNSIGNED 0x02 -#define DATA_TYPE_SIGNED 0x03 -#define DATA_TYPE_NONVOL_UNSIGNED 0x04 -#define DATA_TYPE_NONVOL_SIGNED 0x05 -#define DATA_TYPE_NONVOL_STREAM 0x06 -#define DATA_TYPE_NONVOL_BOOLEAN 0x07 - -#define DATA_DIRECTION_INPUT 0x00 -#define DATA_DIRECTION_BI_DIRECTIONAL 0x40 -#define DATA_DIRECTION_OUTPUT 0x80 - -//modes -#define RECORD_TYPE_MODE_DATA_RECORD 0xB0 - -#define NO_MODES 2//gtoc modes -#define NO_GPD 1//gtoc process data -#define NO_PD 4//process data - -#define IS_INPUT(pdr) (pdr->data_direction != 0x80) -#define IS_OUTPUT(pdr) (pdr->data_direction != 0x00) - -#define MAX_PD_STRLEN 32 // this is the max space for both the unit and name strings in the PD descriptors -#define MAX_PD_VAL_BYTES 64 // this should be >= the sum of the data sizes of all pd vars - -#define MEMPTR(p) ((uint32_t)&p-(uint32_t)&memory) - -#define MEMU8(ptr) (memory.bytes[ptr]) -#define MEMU16(ptr) (memory.bytes[ptr] | memory.bytes[ptr+1]<<8) -#define MEMU32(ptr) (memory.bytes[ptr] | memory.bytes[ptr+1]<<8 | memory.bytes[ptr+2]<<16 | memory.bytes[ptr+3]<<24) - -#define NUM_BYTES(bits) (bits / 8 + (bits % 8 > 0 ? 1 : 0)) - -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -#define SIGNED(pd) (pd->data_type == DATA_TYPE_SIGNED || pd->data_type == DATA_TYPE_NONVOL_SIGNED) -#define UNSIGNED(pd) (pd->data_type == DATA_TYPE_UNSIGNED || pd->data_type == DATA_TYPE_NONVOL_UNSIGNED) - - -typedef struct{ - uint8_t record_type;//0xa0 - uint8_t data_size; - uint8_t data_type; - uint8_t data_direction; - float param_min; - float param_max; - uint16_t data_addr; - char names; // we can pick up the address of that member for a memory location to write strings to. -} process_data_descriptor_t; - -typedef struct{ - uint8_t record_type;//0xb0 - uint8_t index; - uint8_t type; - uint8_t unused; - char names; -} mode_descriptor_t; - - - -typedef struct{ - uint8_t input; // these are in BITS now. I'll convert to bytes when I respond to the rpc. - uint8_t output; - uint16_t ptocp;//pointer to process data table - uint16_t gtocp;//pointer to mode data table -} discovery_rpc_t; - - -typedef union { - struct { - discovery_rpc_t discovery; - uint8_t heap[MEM_SIZE - sizeof(discovery_rpc_t)]; - }; - - uint8_t bytes[MEM_SIZE]; -} memory_t; - -typedef struct { - process_data_descriptor_t *ptr; - float range; - uint32_t bitmax; -} pd_metadata_t; - - -static memory_t memory; -static uint8_t *heap_ptr; - -process_data_descriptor_t create_pdr(uint8_t data_size_in_bits, uint8_t data_type, uint8_t data_dir, float param_min, float param_max) { - process_data_descriptor_t pd; - - pd.record_type = RECORD_TYPE_PROCESS_DATA_RECORD; - pd.data_size = data_size_in_bits; - pd.data_type = data_type; - pd.data_direction = data_dir; - pd.param_min = param_min; - pd.param_max = param_max; -// strcpy(pd.names, unit_string); -// strcpy(pd.names + strlen(unit_string) + 1, name_string); - - return pd; -} - -mode_descriptor_t create_mdr(uint8_t index, uint8_t type) { - mode_descriptor_t md; - - md.record_type = RECORD_TYPE_MODE_DATA_RECORD; - md.index = index; - md.type = type; - md.unused = 0x00; - //strcpy(md.name_string, name_string); - - return md; -} - -#define BITSLEFT(ptr) (8-ptr) - -void process_data_rpc(uint8_t *input, uint8_t *output) { - - uint16_t *ptocp = (uint16_t *)(memory.bytes + memory.discovery.ptocp); - - *(input++) = 0x00; // fault byte, just for easy recognition - *input = 0x00; // clear the next byte - - // data needs to be packed and unpacked based on its type and size - // input is a pointer to the data that gets sent back to the host - // need a bit pointer to keep track of partials - - uint8_t output_bit_ptr = 0; - uint8_t input_bit_ptr = 0; - - while(*ptocp != 0x0000) { - process_data_descriptor_t *pd = (process_data_descriptor_t *)(memory.bytes + *ptocp++); - - if (IS_INPUT(pd)) { - //printf("input pd data size is %d\n", pd->data_size); - uint16_t data_addr = pd->data_addr; - uint8_t data_size = pd->data_size; - uint8_t data_bit_ptr = 0; - - //*(input++) = MEMU8(pd->data_addr); - while(data_size > 0) { - uint8_t bits_to_pack = data_size < BITSLEFT(input_bit_ptr) ? data_size : BITSLEFT(input_bit_ptr); - if (BITSLEFT(data_bit_ptr) < bits_to_pack) { bits_to_pack = BITSLEFT(data_bit_ptr); } - - //printf("encoding partial byte, need to read %d bits from the data_val 0x%02x at bit position %d\n", bits_to_pack, MEMU8(data_addr), data_bit_ptr); - - uint8_t mask = ((1<> data_bit_ptr) << input_bit_ptr; - - //printf("*input is 0x%02x\n", *input); - input_bit_ptr += bits_to_pack; - data_bit_ptr += bits_to_pack; - data_size -= bits_to_pack; - if((input_bit_ptr %= 8) == 0) *++input = 0x00; // clear the next byte - if((data_bit_ptr %= 8) == 0) data_addr++; - } - } - if (IS_OUTPUT(pd)) { - // printf("output pd data size is %d\n", pd->data_size); - uint16_t data_addr = pd->data_addr; - uint8_t data_size = pd->data_size; - - uint8_t val_bits_remaining = 8; - uint8_t val = 0x00; - - while(data_size > 0) { - // the number of bits to unpack this iteration is the number of bits remaining in the pd, or the number of bits remaining in the output byte, - // whichever is smaller. Then, it can be even smaller if we have less room in the current val. - - uint8_t bits_to_unpack = data_size < BITSLEFT(output_bit_ptr) ? data_size : BITSLEFT(output_bit_ptr); - if (val_bits_remaining < bits_to_unpack) { bits_to_unpack = val_bits_remaining; } - - // printf("decoding partial byte, need to read %d bits from current output byte 0x%02x at bit position %d\n", bits_to_unpack, *output, output_bit_ptr); - - // create a bitmask the width of the bits to read, shifted to the position in the output byte that we're pointing to - uint8_t mask = ((1<> (output_bit_ptr)) << (8-val_bits_remaining); - - // printf("val is 0x%02x\n", val); - - val_bits_remaining -= bits_to_unpack; - data_size -= bits_to_unpack; - output_bit_ptr += bits_to_unpack; - - if((output_bit_ptr %= 8) == 0) output++; - - if(val_bits_remaining == 0 || data_size == 0) { - MEMU8(data_addr++) = val; - // printf("adding 0x%02x to data\n", val); - val_bits_remaining = 8; - val = 0x00; - } - } - // now we've finished unpacking it and storing it in memory, but we have to fix up the high bits if it wasn't a byte-aligned datasize. - // for instance, if we receive 0xFFF in a 12 bit field, that is a negative number, but we stored it as 0x0FFF in memory. - // strategy is to set the most significant n bits of the MSB to the most significant bit of the output value, iff the pd is defined as signed. - if (SIGNED(pd) && pd->data_size % 8 != 0) { - uint8_t msb_addr = pd->data_addr + NUM_BYTES(pd->data_size) - 1; - //printf("in output fixup. MSB: 0x%02x\n", MEMU8(msb_addr)); - if(MEMU8(msb_addr) & 1<<(pd->data_size%8 - 1)) { - uint8_t mask = 0xFF ^ ((1<data_size%8) - 1); - //printf("applying mask: 0x%02x\n", mask); - MEMU8(msb_addr) |= mask; - } - - //printf("fixed up val: 0x%02x\n", MEMU8(msb_addr)); - } - } - } -} - - -void dump_memory_range(uint16_t start, uint16_t end) { - start -= (start % 16); - end -= ((end+1) % 16); - printf("dump memory from 0x%04x to 0x%04x\n\n", start, end); - - printf(" "); - for(int i = 0; i < 16; i++) { - printf(" %x ", i); - } - - printf("\n---------------------------------------------------\n"); - - for(int j = start >> 4; j <= end >> 4; j++) { - printf("%03x ", j); - for (int i = 0; i < 16; i++) { - uint16_t addr = (j<<4) | i; - printf("%02x ", memory.bytes[addr]); - } - printf("\n"); - } - printf("\n"); -} - -void dump_memory() { - dump_memory_range(0, MEM_SIZE); -} - -void write_memory_to_file() { - FILE *fileptr; - uint8_t *buffer; - long filelen; - - fileptr = fopen("test.hex", "wb"); - - fwrite(memory.bytes, sizeof(uint8_t), MEM_SIZE, fileptr); - fclose(fileptr); - printf("Wrote memory out to test.hex\n"); -} - -uint16_t add_pd(char *name_string, char *unit_string, uint8_t data_size_in_bits, uint8_t data_type, uint8_t data_dir, float param_min, float param_max) { - process_data_descriptor_t pdr = create_pdr(data_size_in_bits, data_type, data_dir, param_min, param_max); - - pdr.data_addr = MEMPTR(*heap_ptr); - heap_ptr += NUM_BYTES(data_size_in_bits); - - memcpy(heap_ptr, &pdr, sizeof(process_data_descriptor_t)); - // note that we don't store the names in the struct anymore. The fixed-length struct is copied into memory, and then the nmaes go in directly behind it, so they'll read out properly - - uint16_t pd_ptr = MEMPTR(*heap_ptr); // save off the ptr to return, before we modify the heap ptr - - heap_ptr = (uint8_t *)&(((process_data_descriptor_t *)heap_ptr)->names); - - // copy the strings in after the pd - strcpy((char *)heap_ptr, unit_string); - heap_ptr += strlen(unit_string)+1; - strcpy((char *)heap_ptr, name_string); - heap_ptr += strlen(name_string)+1; - - return pd_ptr; -} - -uint16_t add_mode(char *name_string, uint8_t index, uint8_t type) { - mode_descriptor_t mdr = create_mdr(index, type); - - memcpy(heap_ptr, &mdr, sizeof(mode_descriptor_t)); - - uint16_t md_ptr = MEMPTR(*heap_ptr); - - heap_ptr = (uint8_t *)&(((mode_descriptor_t *)heap_ptr)->names); - - strcpy((char *)heap_ptr, name_string); - heap_ptr += strlen(name_string)+1; - - return md_ptr; -} - -void metadata(pd_metadata_t *pdm, process_data_descriptor_t *ptr) { - pdm->ptr = ptr; - pdm->range = ptr->data_type == DATA_TYPE_SIGNED ? MAX(ptr->param_min, ptr->param_max)*2 : ptr->param_max; - pdm->bitmax = (1<data_size)-1; -} - - -#define INDIRECT_PD(pd_ptr) ((process_data_descriptor_t *)(memory.bytes + *pd_ptr)) -#define DATA_DIR(pd_ptr) INDIRECT_PD(pd_ptr)->data_direction -#define DATA_SIZE(pd_ptr) INDIRECT_PD(pd_ptr)->data_size - -#define ADD_PROCESS_VAR(args) *ptocp = add_pd args; input_bits += IS_INPUT(INDIRECT_PD(ptocp)) ? DATA_SIZE(ptocp) : 0; output_bits += IS_OUTPUT(INDIRECT_PD(ptocp)) ? DATA_SIZE(ptocp) : 0; last_pd = INDIRECT_PD(ptocp++) -#define ADD_GLOBAL_VAR(args) *gtocp++ = add_pd args -#define ADD_MODE(args) *gtocp++ = add_mode args - -//#define SCALE_OUT(pd, val) (((float)val / (float)((1<data_size)-1) * (pd->param_max - pd->param_min)) + pd->param_min) -//#define SCALE_IN(pd, val) ((val - pd->param_min)/(pd->param_max - pd->param_min) * ((1<data_size)-1)) -//#define SCALE_IN(pd, val) (val * (pd->param_max - pd->param_min) / ((1<data_size)-1) + pd->param_min) - - - -float scale_out(pd_metadata_t pd, int32_t val) { - return val * pd.range / (float)pd.bitmax; -} - -int32_t scale_in(pd_metadata_t pd, float val) { - return CLAMP(val, pd.ptr->param_min, pd.ptr->param_max) * pd.bitmax / pd.range; -} - -int main(void) { - - heap_ptr = memory.heap; - - uint16_t input_bits = 8; // this starts at 8 bits = 1 byte for the fault byte - uint16_t output_bits = 0; - - // these are temp toc arrays that the macros will write pointers into. the tocs get copied to main memory after everything else is written in - uint16_t ptoc[32]; - uint16_t gtoc[32]; - - uint16_t *ptocp = ptoc; uint16_t *gtocp = gtoc; - process_data_descriptor_t *last_pd; - - pd_metadata_t cmd_vel; - - pd_metadata_t fb_vel; - - printf("sizeof pdr: %ld\n", sizeof(process_data_descriptor_t)); - - - ADD_PROCESS_VAR(("output_pins", "none", 4, DATA_TYPE_BITS, DATA_DIRECTION_OUTPUT, 0, 1)); - ADD_PROCESS_VAR(("cmd_vel", "rps", 12, DATA_TYPE_SIGNED, DATA_DIRECTION_OUTPUT, -1.0, 1.0)); metadata(&cmd_vel, last_pd); - ADD_PROCESS_VAR(("input_pins", "none", 4, DATA_TYPE_BITS, DATA_DIRECTION_INPUT, 0, 1)); - ADD_PROCESS_VAR(("fb_vel", "rps", 12, DATA_TYPE_SIGNED, DATA_DIRECTION_INPUT, -1.0, 1.0)); metadata(&fb_vel, last_pd); - - - printf("cmd_vel->data_addr: 0x%04x\n", cmd_vel.ptr->data_addr); - - ADD_GLOBAL_VAR(("swr", "non", 8, DATA_TYPE_UNSIGNED, DATA_DIRECTION_OUTPUT, 0, 0)); - - ADD_MODE(("foo", 0, 0)); - ADD_MODE(("io_", 1, 1)); - - - printf("input bits %d output bits %d\n", input_bits, output_bits); - if (input_bits % 8) ADD_PROCESS_VAR(("", "", 8 - (input_bits%8), DATA_TYPE_PAD, DATA_DIRECTION_INPUT, 0, 0)); - if (output_bits % 8) ADD_PROCESS_VAR(("", "", 8 - (output_bits%8), DATA_TYPE_PAD, DATA_DIRECTION_OUTPUT, 0, 0)); - - // todo: automatically create padding pds based on the mod remainder of input/output bits - - // now that all the toc entries have been added, write out the tocs to memory and set up the toc pointers - - memory.discovery.input = input_bits >> 3; - memory.discovery.output = output_bits >> 3; - - memory.discovery.ptocp = MEMPTR(*heap_ptr); - - for(uint8_t i = 0; i < ptocp - ptoc; i++) { - *heap_ptr++ = ptoc[i] & 0x00FF; - *heap_ptr++ = (ptoc[i] & 0xFF00) >> 8; - } - *heap_ptr++ = 0x00; *heap_ptr++ = 0x00; // this is the ptoc end marker - - memory.discovery.gtocp = MEMPTR(*heap_ptr); - - for(uint8_t i = 0; i < gtocp - gtoc; i++) { - *heap_ptr++ = gtoc[i] & 0x00FF; - *heap_ptr++ = (gtoc[i] & 0xFF00) >> 8; - } - *heap_ptr++ = 0x00; *heap_ptr++ = 0x00; // this is the gtoc end marker - - dump_memory_range(0, 0x100); - - - write_memory_to_file(); - - - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0x7ff)); - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0x3ff)); - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0x1ff)); - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0x000)); - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0xe01)); - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0xc01)); - printf("Scale out test: %f\n", scale_out(cmd_vel, (int16_t)0x801)); - - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, 1), (int16_t)scale_in(fb_vel, 1)); - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, 0.5), (int16_t)scale_in(fb_vel, 0.5)); - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, 0.25), (int16_t)scale_in(fb_vel, 0.5)); - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, 0), (int16_t)scale_in(fb_vel, 0)); - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, -0.25), (int16_t)scale_in(fb_vel, 0.5)); - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, -0.5), (int16_t)scale_in(fb_vel, -0.5)); - printf("Scale in test: 0x%04x (%d)\n", (int16_t)scale_in(fb_vel, -1), (int16_t)scale_in(fb_vel, -1)); - - - MEMU8(fb_vel.ptr->data_addr) = 0xFF; - MEMU8(fb_vel.ptr->data_addr + 1) = 0x07; - - uint8_t output_buf[memory.discovery.output]; - uint8_t input_buf[memory.discovery.input]; - - output_buf[0] = 0x1a; - output_buf[1] = 0xe0; - printf("incoming output bytes: "); for (uint8_t i = 0; i < memory.discovery.output; i++) { printf("0x%02x ", output_buf[i]); } printf("\n"); - process_data_rpc(input_buf, output_buf); - printf("outgoing input bytes: "); for (uint8_t i = 0; i < memory.discovery.input; i++) { printf("0x%02x ", input_buf[i]); } printf("\n"); - - - float cmd_vel_val = scale_out(cmd_vel, (int16_t)MEMU16(cmd_vel.ptr->data_addr)); - printf("cmd_vel's value is 0x%04x (%f)\n", MEMU16(cmd_vel.ptr->data_addr), cmd_vel_val); - - *((uint16_t *)&(memory.bytes[fb_vel.ptr->data_addr])) = scale_in(fb_vel, cmd_vel_val); - - printf("fb_vel's value is 0x%04x (%f)\n", MEMU16(fb_vel.ptr->data_addr), scale_out(fb_vel, (int16_t)MEMU16(fb_vel.ptr->data_addr))); - - - output_buf[0] = 0xfa; - output_buf[1] = 0x7f; - printf("incoming output bytes: "); for (uint8_t i = 0; i < memory.discovery.output; i++) { printf("0x%02x ", output_buf[i]); } printf("\n"); - process_data_rpc(input_buf, output_buf); - printf("outgoing input bytes: "); for (uint8_t i = 0; i < memory.discovery.input; i++) { printf("0x%02x ", input_buf[i]); } printf("\n"); - -/* - printf("setting fb and bidir\n"); - *fb_vel = 0xCA; - - output_buf[0] = 0x30; - output_buf[1] = 0x40; - - printf("updated vals: cmd_vel 0x%02x fb_vel 0x%02x bidir 0x%02x\n", *cmd_vel, *fb_vel, *bidir); - - printf("incoming output bytes: "); for (uint8_t i = 0; i < discovery_rpc.output; i++) { printf("0x%02x ", output_buf[i]); } printf("\n"); - process_data_rpc(input_buf, output_buf); - printf("outgoing input bytes: "); for (uint8_t i = 0; i < discovery_rpc.input; i++) { printf("0x%02x ", input_buf[i]); } printf("\n"); - - printf("updated vals: cmd_vel 0x%02x fb_vel 0x%02x bidir 0x%02x\n", *cmd_vel, *fb_vel, *bidir); - */ - - exit(0); -} \ No newline at end of file diff --git a/memtemp/sserial.sr b/memtemp/sserial.sr deleted file mode 100644 index 687d8532..00000000 Binary files a/memtemp/sserial.sr and /dev/null differ diff --git a/memtemp/tocdump.c b/memtemp/tocdump.c deleted file mode 100644 index b0433b7e..00000000 --- a/memtemp/tocdump.c +++ /dev/null @@ -1,95 +0,0 @@ -#include -#include -#include - -//#define MEMPTR(p) ((uint32_t)&p-(uint32_t)&memory) -#define RECORD_TYPE_PROCESS_DATA_RECORD 0xA0 -#define RECORD_TYPE_MODE_DATA_RECORD 0xB0 - -#define MEMU8(m, ptr) (m[ptr]) -#define MEMU16(m, ptr) (m[ptr] | m[ptr+1]<<8) -#define MEMU32(m, ptr) (m[ptr] | m[ptr+1]<<8 | m[ptr+2]<<16 | m[ptr+3]<<24) - -void print_tocs(uint8_t *m, uint16_t ptocp, uint16_t gtocp) { - uint16_t pd_ptr; - - printf("\nptoc: (at 0x%04x)\n", ptocp); - while(MEMU16(m, ptocp) != 0x0000) { - pd_ptr = MEMU16(m, ptocp); - printf("pd ptr: 0x%04x\n", pd_ptr); - - printf("\trectype: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tdatasize: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tdatatype: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tdatadir: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tparmmin: 0x%08x\n", MEMU32(m, pd_ptr)); pd_ptr += 4; - printf("\tparmmax: 0x%08x\n", MEMU32(m, pd_ptr)); pd_ptr += 4; - printf("\tdataaddr: 0x%04x\n", MEMU16(m, pd_ptr)); pd_ptr += 2; - char *unitstr = (char *)(m + pd_ptr); - printf("\tunitstr: %s\n", unitstr); - pd_ptr += strlen(unitstr) + 1; - char *namestr = (char *)(m + pd_ptr); - printf("\tnamestr: %s\n", namestr); - pd_ptr += strlen(namestr) + 1; - - ptocp += 2; - } - - printf("\ngtoc: (at 0x%04x)\n", gtocp); - while(MEMU16(m, gtocp) != 0x0000) { - pd_ptr = MEMU16(m, gtocp); - printf("pd ptr: 0x%04x\n", pd_ptr); - - uint8_t rectype = MEMU8(m, pd_ptr++); - printf("\trectype: 0x%02x\n", rectype); - switch(rectype) { - case RECORD_TYPE_PROCESS_DATA_RECORD: - printf("\tdatasize: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tdatatype: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tdatadir: 0x%02x\n", MEMU8(m, pd_ptr++)); - printf("\tparmmin: 0x%08x\n", MEMU32(m, pd_ptr)); pd_ptr += 4; - printf("\tparmmax: 0x%08x\n", MEMU32(m, pd_ptr)); pd_ptr += 4; - printf("\tdataaddr: 0x%04x\n", MEMU16(m, pd_ptr)); pd_ptr += 2; - char *unitstr = (char *)(m + pd_ptr); - printf("\tunitstr: %s\n", unitstr); - pd_ptr += strlen(unitstr) + 1; - char *namestr = (char *)(m + pd_ptr); - printf("\tnamestr: %s\n", namestr); - pd_ptr += strlen(namestr) + 1; - break; - case RECORD_TYPE_MODE_DATA_RECORD: - printf("\tindex: 0x%02x\n", pd_ptr++); - printf("\ttype: 0x%02x\n", pd_ptr++); - pd_ptr++; // skip 'unused' byte - namestr = (char *)(m + pd_ptr); - printf("\tnamestr: %s\n", namestr); - pd_ptr += strlen(namestr); - break; - } - - gtocp += 2; - } -} - -int main(void) { - - FILE *fileptr; - uint8_t *buffer; - long filelen; - - fileptr = fopen("test.hex", "rb"); // open in binary read mode - fseek(fileptr, 0, SEEK_END); // jump to the end of the file - filelen = ftell(fileptr); // get the byte offset of the end of the file - rewind(fileptr); // jump back to the beginning to start reading - - buffer = (uint8_t *)malloc((filelen)*sizeof(uint8_t)); - fread(buffer, filelen, 1, fileptr); - fclose(fileptr); - - printf("read mem.hex\n\n"); - - // MY memory dumps have the discovery_rpc struct at the beginning, so byte 0 and 1 are input and output byte counts, bytes 2/3 and 4/5 are the ptocp and gtocp. - uint16_t ptocp = buffer[2] | buffer[3]<<8; - uint16_t gtocp = buffer[4] | buffer[5]<<8; - print_tocs(buffer, ptocp, gtocp); -} \ No newline at end of file diff --git a/memtemp/tocdump.txt b/memtemp/tocdump.txt deleted file mode 100644 index 6cd7c893..00000000 --- a/memtemp/tocdump.txt +++ /dev/null @@ -1,306 +0,0 @@ -read mem.hex - - -ptoc: (at 0xa53e) -pd ptr: 0xa290 - rectype: 0xb0 - datasize: 0x00 - datatype: 0x00 - datadir: 0x00 - parmmin: 0x6e617453 - parmmax: 0x64726164 - dataaddr: 0x0000 - unitstr: ° - namestr:  -pd ptr: 0xa29e - rectype: 0xb0 - datasize: 0x00 - datatype: 0x01 - datadir: 0x00 - parmmin: 0x535f4f49 - parmmax: 0x006e6970 - dataaddr: 0x01b0 - unitstr:  - namestr: IO_Ana_Spin -pd ptr: 0xa2d2 - rectype: 0xa0 - datasize: 0x20 - datatype: 0x01 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0808 - unitstr: None - namestr: Input -pd ptr: 0xa2ec - rectype: 0xa0 - datasize: 0x10 - datatype: 0x01 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0800 - unitstr: None - namestr: Output -pd ptr: 0xa306 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x42c80000 - dataaddr: 0x0840 - unitstr: Percent - namestr: SpinOut -pd ptr: 0xa324 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x07 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0842 - unitstr: None - namestr: SpinEna -pd ptr: 0xa340 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x07 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0843 - unitstr: None - namestr: SpinDir - -gtoc: (at 0xa584) -pd ptr: 0xa290 - rectype: 0xb0 - index: 0xa291 - type: 0xa292 - namestr: Standard -pd ptr: 0xa29e - rectype: 0xb0 - index: 0xa29f - type: 0xa2a0 - namestr: IO_Spin -pd ptr: 0xa2aa - rectype: 0xb0 - index: 0xa2ab - type: 0xa2ac - namestr: IO_Ana_Spin -pd ptr: 0xa2ba - rectype: 0xb0 - index: 0xa2bb - type: 0xa2bc - namestr: IO_Enc_Ana_Spin_FV -pd ptr: 0xa2d2 - rectype: 0xa0 - datasize: 0x20 - datatype: 0x01 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0808 - unitstr: None - namestr: Input -pd ptr: 0xa2ec - rectype: 0xa0 - datasize: 0x10 - datatype: 0x01 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0800 - unitstr: None - namestr: Output -pd ptr: 0xa306 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x42c80000 - dataaddr: 0x0840 - unitstr: Percent - namestr: SpinOut -pd ptr: 0xa324 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x07 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0842 - unitstr: None - namestr: SpinEna -pd ptr: 0xa340 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x07 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0843 - unitstr: None - namestr: SpinDir -pd ptr: 0xa35c - rectype: 0xa0 - datasize: 0x08 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x42113333 - dataaddr: 0x0810 - unitstr: Volts - namestr: AnalogIn0 -pd ptr: 0xa37a - rectype: 0xa0 - datasize: 0x08 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x42113333 - dataaddr: 0x0811 - unitstr: Volts - namestr: AnalogIn1 -pd ptr: 0xa398 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x42113333 - dataaddr: 0x0812 - unitstr: Volts - namestr: AnalogIn2 -pd ptr: 0xa3b6 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x42113333 - dataaddr: 0x0813 - unitstr: Volts - namestr: AnalogIn3 -pd ptr: 0xa3d4 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x42113333 - dataaddr: 0x0a18 - unitstr: Volts - namestr: FieldVoltage -pd ptr: 0xa3f6 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x08 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x09a0 - unitstr: Counts - namestr: Enc0 -pd ptr: 0xa410 - rectype: 0xa0 - datasize: 0x08 - datatype: 0x08 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x09a2 - unitstr: Counts - namestr: Enc1 -pd ptr: 0xa42a - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x095c - unitstr: None - namestr: SwRevision -pd ptr: 0xa448 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x80 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0974 - unitstr: None - namestr: HwRevision -pd ptr: 0xa466 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x04 - datadir: 0x40 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0000 - unitstr: None - namestr: NVBaudRate -pd ptr: 0xa484 - rectype: 0xa0 - datasize: 0x20 - datatype: 0x04 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0078 - unitstr: None - namestr: NVUnitNumber -pd ptr: 0xa4a4 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x04 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0038 - unitstr: None - namestr: NVWatchDogTimeout -pd ptr: 0xa4ca - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x0998 - unitstr: None - namestr: EncMode0 -pd ptr: 0xa4e6 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x02 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x099a - unitstr: None - namestr: EncMode1 -pd ptr: 0xa502 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x04 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x003a - unitstr: None - namestr: NVEncMode0 -pd ptr: 0xa520 - rectype: 0xa0 - datasize: 0x10 - datatype: 0x04 - datadir: 0x00 - parmmin: 0x00000000 - parmmax: 0x00000000 - dataaddr: 0x003c - unitstr: None - namestr: NVEncMode1 diff --git a/sim/gp b/sim/gp deleted file mode 100644 index ed28563a..00000000 --- a/sim/gp +++ /dev/null @@ -1,5 +0,0 @@ -set term x1 -set key autotitle columnheader -#set yrange [-3:400] -#set xrange [0.245:0.4] -plot "plot" every 1 using 1:2 w l, "plot" every 1 using 1:3 w l, "plot" every 1 using 1:4 w l, "plot" every 1 using 1:5 w l, "plot" every 1 using 1:6 w l, "plot" every 1 using 1:7 w l, "plot" every 1 using 1:8 w l, "plot" every 1 using 1:9 w l, "plot" every 1 using 1:10 w l diff --git a/sim/pwm.html b/sim/pwm.html deleted file mode 100644 index b66da0fc..00000000 --- a/sim/pwm.html +++ /dev/null @@ -1,403 +0,0 @@ - - -pwm - - - - - - - not supported - - - not supported -
- std
- SVM
- flat bottom SVM
- left pwm
- right pwm
- center pwm
- A
- B
- - - - diff --git a/sim/sim.cpp b/sim/sim.cpp deleted file mode 100644 index b07afd13..00000000 --- a/sim/sim.cpp +++ /dev/null @@ -1,410 +0,0 @@ -#include "sim.h" - -// Rcpp implementation of the 1D TVD algorithm in: -// Condat, L (2012) A Direct Algorithm for 1D Total Variation Denoising -// http://hal.inria.fr/docs/00/67/50/43/PDF/condat_killer_tv.pdf -// Accessed 11 August 2014. -// [[Rcpp::export]] -void tvd_1d_condat(std::vector &y, std::vector &x, int N, float lambda) -{ - int k, k0, kn, kp, i; - float vmin, vmax, umin, umax; - - k = k0 = kn = kp = 1; - vmin = y[0] - lambda; - vmax = y[0] + lambda; - umin = lambda; - umax = -lambda; - - while (1) - { - // b - if (k == N) - { - x[k-1] = vmin + umin; - break; - } - - if (y[k] + umin < vmin - lambda) - { - // b1 - for (i = k0-1; i < kn; i++) - x[i] = vmin; - kn++; - k = k0 = kp = kn; - vmin = y[k-1]; - vmax = y[k-1] + 2*lambda; - umin = lambda; - umax = -lambda; - } - else if (y[k] + umax > vmax + lambda) - { - // b2 - for (i = k0-1; i < kp; i++) - x[i] = vmax; - kp++; - k = k0 = kn = kp; - vmin = y[k-1] - 2*lambda; - vmax = y[k-1]; - umin = lambda; - umax = -lambda; - } - else - { - // b3 - k++; - umin = umin + y[k-1] - vmin; - umax = umax + y[k-1] - vmax; - if (umin >= lambda) - { - // b31 - vmin = vmin + (umin - lambda)/((float)(k - k0 + 1)); - umin = lambda; - kn = k; - } - if (umax <= -lambda) - { - // b32 - vmax = vmax + (umax + lambda)/((float)(k - k0 + 1)); - umax = -lambda; - kp = k; - } - } - - // c - if (k == N) - { - if (umin < 0) - { - // c1 - for (i = k0-1; i < kn; i++) - x[i] = vmin; - kn++; - k = k0 = kn; - vmin = y[k-1]; - umin = lambda; - umax = y[k-1] + lambda - vmax; - } - else if (umax > 0) - { - // c2 - for (i = k0-1; i < kn; i++) - x[i] = vmax; - kp++; - k = k0 = kp; - vmax = y[k-1]; - umax = -lambda; - umin = y[k-1] - lambda - vmin; - } - else - { - // c3 - for (i = k0-1; i < N; i++) - x[i] = vmin + umin/((float)(k - k0 + 1)); - break; - } - } - } -} - - -// Rcpp implementation of the 1D TVD algorithm in: -// Condat, L (2012) A Direct Algorithm for 1D Total Variation Denoising -// http://hal.inria.fr/docs/00/67/50/43/PDF/condat_killer_tv.pdf -// Accessed 11 August 2014. -// [[Rcpp::export]] -std::vector tvd_1d_condat_worker(std::vector& y, double lambda) -{ - // NOTE: in wrapping R code, verify that y.size() <= 2^32-1. Although - // newer versions of R get around this index limit, Rcpp is still - // limited to int indices. - int N = y.size(); - int k, k0, kn, kp, i; - double vmin, vmax, umin, umax; - std::vector x(N); - - k = k0 = kn = kp = 1; - vmin = y[0] - lambda; - vmax = y[0] + lambda; - umin = lambda; - umax = -lambda; - - while (true) - { - // b - if (k == N) - { - x[k-1] = vmin + umin; - break; - } - - if (y[k] + umin < vmin - lambda) - { - // b1 - for (i = k0-1; i < kn; i++) - x[i] = vmin; - kn++; - k = k0 = kp = kn; - vmin = y[k-1]; - vmax = y[k-1] + 2*lambda; - umin = lambda; - umax = -lambda; - } - else if (y[k] + umax > vmax + lambda) - { - // b2 - for (i = k0-1; i < kp; i++) - x[i] = vmax; - kp++; - k = k0 = kn = kp; - vmin = y[k-1] - 2*lambda; - vmax = y[k-1]; - umin = lambda; - umax = -lambda; - } - else - { - // b3 - k++; - umin = umin + y[k-1] - vmin; - umax = umax + y[k-1] - vmax; - if (umin >= lambda) - { - // b31 - vmin = vmin + (umin - lambda)/(static_cast(k - k0 + 1)); - umin = lambda; - kn = k; - } - if (umax <= -lambda) - { - // b32 - vmax = vmax + (umax + lambda)/(static_cast(k - k0 + 1)); - umax = -lambda; - kp = k; - } - } - - // c - if (k == N) - { - if (umin < 0) - { - // c1 - for (i = k0-1; i < kn; i++) - x[i] = vmin; - kn++; - k = k0 = kn; - vmin = y[k-1]; - umin = lambda; - umax = y[k-1] + lambda - vmax; - } - else if (umax > 0) - { - // c2 - for (i = k0-1; i < kn; i++) - x[i] = vmax; - kp++; - k = k0 = kp; - vmax = y[k-1]; - umax = -lambda; - umin = y[k-1] - lambda - vmin; - } - else - { - // c3 - for (i = k0-1; i < N; i++) - x[i] = vmin + umin/(static_cast(k - k0 + 1)); - break; - } - } - } - - return x; -} - -int main(){ - float sim_time = 0.0; - float sim_step = 0.0001; - float sim_end_time = 0.1; - - srand(14235); - - // e240 - mot_c mot; - mot.reset(); - mot.mech_spec.max_rps = 83.3; - mot.mech_spec.mot_type = mot_c::mech_spec_s::DC; - mot.mech_spec.pole_count = 1; - mot.mech_spec.friction = 0.021;//0.021; - mot.mech_spec.damping = 0.0000426;//0.0000426; - mot.mech_spec.inertia = 0.0000268;//0.0000268; - - mot.elec_spec.max_i = 13.9; - mot.elec_spec.i = 1.9; - mot.elec_spec.nm_a = 0.135; - mot.elec_spec.r = 5.4; - mot.elec_spec.l = 0.0082; - mot.elec_spec.v_rps = 0.852; - mot.elec_spec.slip = 0; - - mot.feedback.type = mot_c::feedback_s::RES; - mot.feedback.count = 1; - mot.feedback.res_offset = 0.0; - mot.noise.sin_scale = 1.0; - mot.noise.cos_scale = 1.0; - mot.noise.sin_offset = 0.0; - mot.noise.cos_offset = 0.0; - mot.noise.var = 0.0; - - mot.load.friction = 0.0; - mot.load.load = 0.0; - mot.load.damping = 0.0; - mot.load.inertia = 0.0; - - // bautz e728 - mot_c mot2; - mot2.reset(); - mot2.mech_spec.max_rps = 50; - mot2.mech_spec.mot_type = mot_c::mech_spec_s::DC; - mot2.mech_spec.pole_count = 1; - mot2.mech_spec.friction = 0.18; - mot2.mech_spec.damping = 0.004236; - mot2.mech_spec.inertia = 0.0012; - - mot2.elec_spec.max_i = 60; - mot2.elec_spec.i = 10; - mot2.elec_spec.nm_a = 0.36; - mot2.elec_spec.r = 0.67; - mot2.elec_spec.l = 0.0011; - mot2.elec_spec.v_rps = 2.28; - mot2.elec_spec.slip = 0; - - mot2.feedback.type = mot_c::feedback_s::RES; - mot2.feedback.count = 1; - mot2.feedback.res_offset = 0.0; - mot2.noise.sin_scale = 1.0; - mot2.noise.cos_scale = 1.0; - mot2.noise.sin_offset = 0.0; - mot2.noise.cos_offset = 0.0; - mot2.noise.var = 0.0; - - mot2.load.friction = 0.0; - mot2.load.load = 0.0; - mot2.load.damping = 0.0; - mot2.load.inertia = 0.0; - - // bosch - mot_c mot3; - mot3.reset(); - mot3.mech_spec.max_rps = 16.6; - mot3.mech_spec.mot_type = mot_c::mech_spec_s::DC; - mot3.mech_spec.pole_count = 4; - mot3.mech_spec.friction = 0.065;//0.0; - mot3.mech_spec.damping = 0.0000826;//0.0; - mot3.mech_spec.inertia = 0.000141; - - mot3.elec_spec.max_i = 4; - mot3.elec_spec.i = 2.2; - mot3.elec_spec.nm_a = 0.2727; - mot3.elec_spec.r = 15.2; - mot3.elec_spec.l = 0.0082;//0.030; - mot3.elec_spec.v_rps = 3.4;//5; - mot3.elec_spec.slip = 0; - - mot3.feedback.type = mot_c::feedback_s::RES; - mot3.feedback.count = 1; - mot3.feedback.res_offset = 0.0; - mot3.noise.sin_scale = 1.0; - mot3.noise.cos_scale = 1.0; - mot3.noise.sin_offset = 0.0; - mot3.noise.cos_offset = 0.0; - mot3.noise.var = 0.01; - - mot3.load.friction = 0.0; - mot3.load.load = 0.0; - mot3.load.damping = 0.0; - mot3.load.inertia = 0.0; - - cmd_c cmd; - cmd.reset(); - cmd.periode = 2; - cmd.amplitude = 1; - cmd.wave = cmd_c::CONST; - cmd.type = cmd_c::POS; - cmd.pos_res = 0.01; - cmd.vel_res = 0.01; - cmd.acc_res = 0.01; - - drive_c drive; - drive.dc = 50; - drive.pwm_scale = 0.9; - drive.pwm_res = 8400; - drive.pid_periode = 0.001; - drive.mot = &mot3; - drive.in = &cmd; - drive.input_cmd = input_cmd; - drive.input_feedback = input_feedback_real; - drive.pid = pid; - drive.output = output; - drive.reset(); - - cout << flush << "time pos pos2 pos3" << endl; - - int count = 0; - int pid_count = drive.pid_periode / sim_step; - - double vel0 = MIN(drive.dc * (2 * drive.pwm_scale - 1) / drive.mot->elec_spec.v_rps, drive.mot->mech_spec.max_rps) * 0.7; - double ind0 = vel0 * drive.mot->elec_spec.v_rps; - double volt0 = drive.dc * (2 * drive.pwm_scale - 1); - double cur0 = (volt0 - ind0) / drive.mot->elec_spec.r; - double torq0 = cur0 * drive.mot->elec_spec.nm_a; - double acc0 = torq0 / drive.mot->mech_spec.inertia; - - double vel1 = MIN(drive.dc * (2 * drive.pwm_scale - 1) / drive.mot->elec_spec.v_rps, drive.mot->mech_spec.max_rps) * 0.3; - double ind1 = vel1 * drive.mot->elec_spec.v_rps; - double volt1 = drive.dc * (2 * drive.pwm_scale - 1); - double cur1 = (volt1 - ind1) / drive.mot->elec_spec.r; - double torq1 = cur1 * drive.mot->elec_spec.nm_a; - double acc1 = torq1 / drive.mot->mech_spec.inertia; - - double a, b, y; - - a = (acc1 - acc0) / (vel1 - vel0); - b = acc0 - a * vel0; - std::vector in,out,foo; - int i = 0; - - for(sim_time = 0.0; sim_time < sim_end_time; sim_time += sim_step){ - drive.in->step(sim_step); - if(count == 0){ - drive.step(sim_step * pid_count); - } - count++; - count %= pid_count; - //drive.state.ctr = 1; - drive.output(&drive, sim_step); - drive.mot->step(sim_step); - - in.push_back(drive.mot->get_sin()*drive.mot->get_polarity()); - out.push_back(drive.mot->get_sin()*drive.mot->get_polarity()); - foo.push_back(sin((drive.mot->state.pos + drive.mot->feedback.res_offset) * drive.mot->feedback.count)); - //e_pos = (torq - drive.est.load) / drive.est.inertia * exp(-sim_time * mot.elec_spec.v_rps / drive.est.inertia * mot.elec_spec.nm_a / mot.elec_spec.r); - //y = a * drive.mot->state.vel + b; - - //cout << sim_time << ", " << drive.in->get_pos() << ", " << drive.mot->state.pos << ", " << drive.est.pos << ", " << drive.est.sin_avg << ", " << drive.est.sin_scale << ", " << drive.est.cos_avg << ", " << drive.est.cos_scale << endl; - //cout << sim_time << ", " << drive.mot->state.pos << ", " << drive.mot->state.vel << ", " << drive.mot->state.acc << ", " << drive.est.p << ", " << drive.est.v << ", " << drive.est.a << endl;//", " << drive.state.ctr << ", " << minus_(drive.in->get_pos(), drive.est.pos) << endl; - //cout << sim_time << ", " << "-15, " << drive.in->get_pos() * 5 - 15<< ", " << drive.state.ctr * 10 << ", " << drive.mot->state.cur << ", " << drive.mot->state.vel / 5 << ", " << drive.mot->state.pos * 5 - 15 << ", " << minus_(drive.in->state.pos, drive.mot->state.pos) * (-100) - 15 << endl;//", " << drive.state.ctr << ", " << minus_(drive.in->get_pos(), drive.est.pos) << endl; - //cout << sim_time/*drive.mot->state.vel*/ << ", " << drive.est.pos << ", " << drive.mot->state.pos << endl; - } - //out = tvd_1d_condat_worker(in, 0.05); - tvd_1d_condat(in, out, in.size(),0.05); - - for(sim_time = 0.0; sim_time < sim_end_time; sim_time += sim_step){ - cout << sim_time/*drive.mot->state.vel*/ << ", " << in[i] << ", " << out[i] << ", " << foo[i] << endl; - i++; - } - - system("gnuplot --persist gp"); - - return(0); -} diff --git a/sim/sim.h b/sim/sim.h deleted file mode 100644 index 8f9b06e5..00000000 --- a/sim/sim.h +++ /dev/null @@ -1,616 +0,0 @@ -#include -#include -#include -#include - -using namespace std; - -#define ABS(a) (((a) < 0) ? -(a) : (a)) -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define DEG(a) ((a)*M_PI/180.0) -#define RAD(a) ((a)*180.0/M_PI) -#define RAD(a) ((a)*180.0/M_PI) -#define SIGN(a) (((a) < 0) ? (-1) : (((a) > 0) ? (1) : (0))) - -double grand(){ - double ret = 0; - for(int i = 0; i < 12; i++){ - ret += (float)rand() / RAND_MAX; - } - return(ret - 6.0); -} - -double prand(){ - return(rand() * 2 * M_PI / RAND_MAX - M_PI); -} - -// double mod(double pos){ -// return(fmod(pos + M_PI, 2 * M_PI) - M_PI); -// } - -double mod(double a){ - while(a < -M_PI){ - a += 2.0 * M_PI; - } - while(a > M_PI){ - a -= 2.0 * M_PI; - } - return(a); -} - -double minus_(double a, double b){ - if(ABS(a - b) < M_PI){ - return(a - b); - } - else if(a > b){ - return(a - b - 2.0 * M_PI); - } - else{ - return(a - b + 2.0 * M_PI); - } -} - -class mot_c{ -public: - struct { - double pos; - double vel; - double acc; - double u; - double v; - double w; - double t; - double cur; - double volt; - double ind; - double torq; - int res_polarity; - } state; - - struct feedback_s{ - enum{ - ENC, - RES, - NONE - } type; - int count; - double res_offset; - int enc_offset; - } feedback; - - struct { - double max_i; - double i; - double r; - double l; - double nm_a; - double v_rps; - double slip; - } elec_spec; - - struct mech_spec_s{ - double t2; // term. time const - double max_rps; - int pole_count; - - enum{ - AC_SYNC, - AC_ASYNC, - DC - } mot_type; - - double friction; - double damping; - double inertia; // inertia - } mech_spec; - - struct{ - double var; - double sin_offset; - double sin_scale; - double cos_offset; - double cos_scale; - } noise; - - struct { - double friction; // friction (torque) - double load; // asym. torque - double damping; // damping (torque / vel) - double inertia; // inertia (torque / acc) - } load; - - void reset(); - void step(double periode); - - int get_enc(); - double get_sin(); - double get_cos(); - int get_polarity(); - - void set_volt(double u, double v, double w); -}; - -void mot_c::reset(){ - state.pos = 0.0;//prand(); - state.vel = 0.0; - state.acc = 0.0; - state.u = 0.0; - state.v = 0.0; - state.w = 0.0; - state.t = 20.0; - state.cur = 0.0; - state.volt = 0.0; - state.ind = 0.0; - state.res_polarity = 1.0; - feedback.enc_offset = state.pos; -} - -void mot_c::step(double periode){ - double d; - double q; - - state.res_polarity *= -1; - - switch(mech_spec.mot_type){ - case mech_spec_s::AC_SYNC: - d = 2/3 * (cos(state.pos * mech_spec.pole_count) * state.u + cos(state.pos * mech_spec.pole_count - 2/3 * M_PI) * state.v + cos(state.pos * mech_spec.pole_count + 2/3 * M_PI) * state.w); - q = 2/3 * (-sin(state.pos * mech_spec.pole_count) * state.u - sin(state.pos * mech_spec.pole_count - 2/3 * M_PI) * state.v - sin(state.pos * mech_spec.pole_count + 2/3 * M_PI) * state.w); - state.volt = q; - break; - case mech_spec_s::AC_ASYNC: - state.volt = 0.0; - break; - case mech_spec_s::DC: - state.volt = state.u - state.v; - break; - } - - state.ind = state.vel * elec_spec.v_rps; - state.cur += (state.volt - state.ind - state.cur * elec_spec.r) / elec_spec.l * periode; - state.cur = CLAMP(state.cur, -elec_spec.max_i, elec_spec.max_i); - //state.cur = (state.volt - state.ind) / elec_spec.r; - state.torq = state.cur * elec_spec.nm_a - (mech_spec.damping + load.damping) * state.vel + load.load; - if(abs(state.torq) < mech_spec.friction + load.friction){ - state.torq = 0.0; - } - else{ - state.torq = state.torq - SIGN(state.torq) * (mech_spec.friction + load.friction); - } - - state.acc = state.torq / (mech_spec.inertia + load.inertia); - state.vel += state.acc * periode; - state.pos += state.vel * periode; - state.pos = mod(state.pos); - if(state.cur > elec_spec.max_i){ - cerr << "MOT: cur > max_i: " << state.cur << endl; - } - if(state.vel > mech_spec.max_rps){ - cerr << "MOT: vel > max_v: " << state.vel << endl; - } -} - -void mot_c::set_volt(double u, double v, double w){ - state.u = u; - state.v = v; - state.w = w; -} - -int mot_c::get_enc(){ - return((int)((state.pos - feedback.enc_offset + 2 * M_PI) * feedback.count / 2 / M_PI) % feedback.count); -} - -double mot_c::get_sin(){ - return(sin((state.pos + feedback.res_offset) * feedback.count) * noise.sin_scale * state.res_polarity + noise.sin_offset + grand() * noise.var); -} - -double mot_c::get_cos(){ - return(cos((state.pos + feedback.res_offset) * feedback.count) * noise.cos_scale * state.res_polarity + noise.cos_offset + grand() * noise.var); -} - -int mot_c::get_polarity(){ - return(state.res_polarity); -} - -class cmd_c{ -public: - struct { - double time; - double pos; - double vel; - double acc; - } state; - - enum{ - POS, - POS_VEL, - POS_VEL_ACC, - VEL, - VEL_ACC - } type; - - enum{ - SINE, - SQUARE, - RAMP, - CONST - } wave; - - double periode; - double amplitude; - double max_vel; - double max_acc; - - double pos_res; - double vel_res; - double acc_res; - - void reset(); - void step(double periode); - - double get_pos(); - double get_vel(); - double get_acc(); -}; - -void cmd_c::reset(){ - state.time = 0.0; - state.pos = 0.0; - state.vel = 0.0; - state.acc = 0.0; -} - -void cmd_c::step(double s){ - state.time += s; - - switch(wave){ - case SINE: - state.pos = mod(sin(state.time / periode * 2 * M_PI) * amplitude); - state.vel = cos(state.time / periode * 2 * M_PI) * amplitude; - state.acc = -sin(state.time / periode * 2 * M_PI) * amplitude; - break; - case SQUARE: - state.pos = mod(((int)(state.time / periode * 2) % 2) * amplitude); - state.vel = 0; - state.acc = 0; - break; - case RAMP: - state.pos = mod(state.time * amplitude); - state.vel = 0; - state.acc = 0; - break; - case CONST: - state.pos = mod(amplitude); - state.vel = 0; - state.acc = 0; - break; - } -} - -double cmd_c::get_pos(){ - return((int)(state.pos / pos_res) * pos_res); -} - -double cmd_c::get_vel(){ - return((int)(state.vel / vel_res) * vel_res); -} - -double cmd_c::get_acc(){ - return((int)(state.acc / acc_res) * acc_res); -} - - -class drive_c{ -public: - struct cmd_s{ - double pos; - double vel; - double acc; - } cmd; - - double dc; - double pwm_scale; - int pwm_res; - double pid_periode; - - struct { - double offset; - double sin_scale; - double sin_avg; - double cos_scale; - double cos_avg; - double res_var; - - double pos; - double vel; - double acc; - double cur; - - double friction; - double load; - double damping; - double inertia; - - double p; - double v; - double a; - } est; - - struct { - double mag_pos; - double mag_vel; - double ctr; - } state; - - mot_c* mot; - cmd_c* in; - - void reset(); - void step(double periode); - - void (*input_cmd)(drive_c* drv, double periode); - void (*input_feedback)(drive_c* drv, double periode); - void (*pid)(drive_c* drv, double periode); - void (*output)(drive_c* drv, double periode); - - void set_pos(double pos); - void set_pos_vel(double pos, double vel); - void set_pos_vel_acc(double pos, double vel, double acc); - void set_vel(double pos); - void set_vel_acc(double pos, double acc); -}; - -void drive_c::reset(){ - cmd.pos = 0.0; - cmd.vel = 0.0; - cmd.acc = 0.0; - - est.offset = 0.0; - est.sin_scale = 1.0; - est.cos_scale = 1.0; - est.sin_avg = 0.0; - est.cos_avg = 0.0; - est.res_var = 0.0; - - est.friction = mot->mech_spec.friction; - est.load = 0.0; - est.damping = mot->mech_spec.damping; - est.inertia = mot->mech_spec.inertia; - - est.pos = 0.0; - est.vel = 0.0; - est.acc = 0.0; - est.cur = 0.0; - - state.mag_pos = 0.0; - state.mag_vel = 0.0; - state.ctr = 0.0; -} - -void drive_c::step(double periode){ - input_cmd(this, periode); - input_feedback(this, periode); - pid(this, periode); - output(this, periode); -} - -void input_cmd(drive_c* drv, double periode){ - double tp, tv; - - tp = drv->cmd.pos; - tv = drv->cmd.vel; - - switch(drv->in->type){ - case cmd_c::POS: - drv->cmd.pos = drv->in->get_pos(); - drv->cmd.vel = (drv->cmd.pos - tp) / periode; - drv->cmd.acc = (drv->cmd.vel - tv) / periode; - break; - case cmd_c::POS_VEL: - drv->cmd.pos = drv->in->get_pos(); - drv->cmd.vel = drv->in->get_vel();; - drv->cmd.acc = (drv->cmd.vel - tv) / periode; - break; - case cmd_c::POS_VEL_ACC: - drv->cmd.pos = drv->in->get_pos(); - drv->cmd.vel = drv->in->get_vel();; - drv->cmd.acc = drv->in->get_acc(); - break; - case cmd_c::VEL: - drv->cmd.pos = drv->cmd.pos + drv->cmd.vel * periode; - drv->cmd.vel = drv->in->get_vel();; - drv->cmd.acc = (drv->cmd.vel - tv) / periode; - break; - case cmd_c::VEL_ACC: - drv->cmd.pos = drv->cmd.pos + drv->cmd.vel * periode; - drv->cmd.vel = drv->in->get_vel();; - drv->cmd.acc = drv->in->get_acc(); - break; - } -} - -void input_feedback(drive_c* drv, double periode){ - double t1, t2; - static double sin_avg_amp = 1.0; - static double cos_avg_amp = 1.0; - static double r = 1.0; - double dpos = 0.0; - double v = 0.0; - static double i_sum; - double p = 0.05; - double i = 1 * periode; - double vlo = 0.0 * periode; - - static int point = 0; - const int hist_size = 10; - static double pos_hist[hist_size]; - static double vel_hist[hist_size]; - static double acc_hist[hist_size]; - - t1 = drv->est.pos; - - switch(drv->mot->feedback.type){ - case mot_c::feedback_s::ENC: - drv->est.pos = mod(drv->mot->get_enc() * 2 * M_PI / drv->mot->feedback.count - drv->est.offset); - break; - case mot_c::feedback_s::RES: - drv->est.sin_avg = 0.995 * drv->est.sin_avg + 0.005 * drv->mot->get_sin(); - drv->est.cos_avg = 0.995 * drv->est.cos_avg + 0.005 * drv->mot->get_cos(); - // sin_avg_amp = 0.5 * sin_avg_amp + 0.5 * (drv->mot->get_sin() - drv->est.sin_avg) / drv->est.sin_scale * drv->mot->get_polarity(); - // cos_avg_amp = 0.5 * cos_avg_amp + 0.5 * (drv->mot->get_cos() - drv->est.cos_avg) / drv->est.cos_scale * drv->mot->get_polarity(); - // - // r = 0.99 * r + 0.01 * (sin_avg_amp * sin_avg_amp + cos_avg_amp * cos_avg_amp); - // - // if(ABS(sin_avg_amp) < 0.01){ - // drv->est.cos_scale -= 0.001 * SIGN(1 - cos_avg_amp); - // } - // - // if(ABS(cos_avg_amp) < 0.01){ - // drv->est.sin_scale -= 0.001 * SIGN(1 - sin_avg_amp); - // } - // - // if(ABS(r - 1.0) > 0.6){ - // //cerr << "res error r: " << r << endl; - // } - - - dpos = (drv->mot->get_sin() - drv->est.sin_avg) / drv->est.sin_scale * drv->mot->get_polarity() * cos(drv->est.pos + drv->est.offset) - (drv->mot->get_cos() - drv->est.cos_avg) / drv->est.cos_scale * drv->mot->get_polarity() * sin(drv->est.pos + drv->est.offset); - i_sum += dpos * i + vlo * (drv->state.ctr * drv->dc - drv->est.vel * drv->mot->elec_spec.v_rps) / drv->mot->elec_spec.r * drv->mot->elec_spec.nm_a * periode; - dpos = p * dpos + i_sum; - drv->est.pos += dpos; - drv->est.pos = mod(drv->est.pos); - pos_hist[point] = drv->est.pos; - vel_hist[point] = minus_(pos_hist[(point) % hist_size], pos_hist[(point + hist_size - 2) % hist_size]) / (2 * periode); - acc_hist[point] = minus_(vel_hist[(point) % hist_size], vel_hist[(point + hist_size - 2) % hist_size]) / (2 * periode); - point++; - - point %= hist_size; - //drv->est.vel = i_sum / periode; - drv->est.pos = mod(atan2((drv->mot->get_sin() - drv->est.sin_avg) / drv->est.sin_scale * drv->mot->get_polarity(), (drv->mot->get_cos() - drv->est.cos_avg) / drv->est.cos_scale * drv->mot->get_polarity()) - drv->est.offset); - break; - case mot_c::feedback_s::NONE: - break; - } - - double a = 0.0; - v = 0.0; - p = 0.0; - double x = 0.0; - - for(int j = 0; j < hist_size; j++){ - a += acc_hist[(point + j) % hist_size]; - } - a /= hist_size; - a *= 0.5; - - for(int j = 0; j < hist_size; j++){ - x = (j - hist_size / 2.0) * periode; - v += vel_hist[(point + j) % hist_size] - (2 * a * x); - } - v /= hist_size; - - for(int j = 0; j < hist_size; j++){ - x = (j - hist_size / 2.0) * periode; - p += pos_hist[(point + j) % hist_size] - (a * x * x + v * x); - } - p /= hist_size; - - x = hist_size / 2.0 * periode; - drv->est.p = (a * x * x + v * x + p); - drv->est.v = (2 * a * x + v); - drv->est.a = (2 * a); - - drv->est.pos = drv->mot->state.pos; - - //drv->est.pos = drv->est.p; - - // t2 = drv->est.vel; - // drv->est.vel = (drv->est.pos - t1) / periode; - // drv->est.acc = (drv->est.vel - t2) / periode; -} - -void input_feedback_real(drive_c* drv, double periode){ - drv->est.pos = drv->mot->state.pos; - drv->est.vel = drv->mot->state.vel; - drv->est.acc = drv->mot->state.acc; -} - -void pid(drive_c* drv, double periode){ - double p = 1000; // kp - double i = 10000 * periode; // ki - double d = 0.6 / periode; // kd - double dd = 0.0 / periode; // rel. vel. kd - double in = 0.0; // ind. kp - - double dc_scale = 1.0 / drv->dc; // dc voltage scale - double ind = drv->mot->state.vel * drv->mot->elec_spec.v_rps / drv->dc; - - double e = minus_(drv->cmd.pos, drv->est.pos); - static double e_old = 0; - static double i_sum = 0; - - i_sum += e; - //i_sum -= - drv->state.ctr = p * e; - drv->state.ctr += i * i_sum; - drv->state.ctr += d * (e - e_old); - if(abs(e) > 0.01){ - drv->state.ctr += dd * (e - e_old) / e; - } - drv->state.ctr *= dc_scale; - drv->state.ctr += in * ind; - - drv->state.ctr = CLAMP(drv->state.ctr, -1, 1); - // if(ABS(drv->est.vel) >= drv->mot->mech_spec.max_rps * 0.7){ - // drv->state.ctr = 0.0; - // } - - if(abs(drv->state.ctr) >= 0.99){ - i_sum -= e; - } - i_sum = CLAMP(i_sum, -1/i, 1/i); - - e_old = e; -} - -void pid2(drive_c* drv, double periode){ - double ind = drv->est.vel * drv->mot->elec_spec.v_rps; - double max_volt_pos = drv->dc * drv->pwm_scale - ind; - double max_cur_pos = max_volt_pos / drv->mot->elec_spec.r; - double max_torq_pos = max_cur_pos * drv->mot->elec_spec.nm_a; - max_torq_pos -= drv->est.friction; - max_torq_pos -= drv->est.load; - max_torq_pos -= drv->est.damping * drv->est.vel; - double max_acc_pos = max_torq_pos / drv->est.inertia; - double max_dvel_pos = max_acc_pos * periode; - - double max_volt_neg = -drv->dc * drv->pwm_scale - ind; - double max_cur_neg = max_volt_neg / drv->mot->elec_spec.r; - double max_torq_neg = max_cur_neg * drv->mot->elec_spec.nm_a; - max_torq_neg -= drv->est.friction; - max_torq_neg += drv->est.load; - max_torq_neg -= drv->est.damping * drv->est.vel; - double max_acc_neg = max_torq_neg / drv->est.inertia; - double max_dvel_neg = max_acc_neg * periode; - - - - drv->state.ctr = 0.0; -} - -void output(drive_c* drv, double periode){ - double u, v, w; - - switch(drv->mot->mech_spec.mot_type){ - case mot_c::mech_spec_s::AC_SYNC: - case mot_c::mech_spec_s::AC_ASYNC: - case mot_c::mech_spec_s::DC: - u = ((int)((drv->state.ctr * drv->pwm_scale + 1) / 2.0 * drv->pwm_res)) * drv->dc / drv->pwm_res; - v = ((int)((drv->state.ctr * drv->pwm_scale * (-1) + 1) / 2.0 * drv->pwm_res)) * drv->dc / drv->pwm_res; - w = 0; - break; - } - - drv->mot->set_volt(u, v, w); -} diff --git a/tools/checkcrc.py b/tools/checkcrc.py deleted file mode 100755 index a814f024..00000000 --- a/tools/checkcrc.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env python -import binascii -import sys - -buf = open(sys.argv[1],'rb').read() -buf = (binascii.crc32(buf) & 0xFFFFFFFF) -if buf == 0: - print "crc ok!" - sys.exit(0) -else: - print "This should not happen. Please report a bug." - sys.exit(-1)