| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | #include "pch.h" | |||
| 2 | #include "rusefi_lua.h" | |||
| 3 | #include "lua_lib.h" | |||
| 4 | ||||
| 5 | // see also BmwChecksumTest | |||
| 6 | #define BMW_CHECKSUM " function bmwChecksum(canID, data, offset, length) \ | |||
| 7 | checksum = canID \ | |||
| 8 | for i = offset, offset + length - 1,1 \ | |||
| 9 | do \ | |||
| 10 | checksum = checksum + data[i] \ | |||
| 11 | end \ | |||
| 12 | checksum = (checksum >> 8) + (checksum & 0xff) \ | |||
| 13 | return checksum \ | |||
| 14 | end " | |||
| 15 | ||||
| 16 | // https://github.com/HeinrichG-V12/E65_ReverseEngineering/blob/main/docs/0x3B4.md | |||
| 17 | 4 | TEST(LuaE65, Battery) { | ||
| 18 | 1 | const char* realdata = TWO_BYTES_LSB R"( | ||
| 19 | ||||
| 20 | function testFunc() | |||
| 21 | data = {0xdc, 0x03, 0x00, 0x53, 0xFE, 0xD3, 0x04, 0x00} | |||
| 22 | return getTwoBytesLSB(data, 0, 0.0147) | |||
| 23 | end)"; | |||
| 24 | ||||
| 25 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 14.5236); | |
| 26 | 1 | } | ||
| 27 | ||||
| 28 | 4 | TEST(LuaE65, testTwoBytes) { | ||
| 29 | 1 | const char* realdata = TWO_BYTES_LSB R"( | ||
| 30 | ||||
| 31 | function testFunc() | |||
| 32 | data = {0xdc, 0x03} | |||
| 33 | return getTwoBytesLSB(data, 0, 1) | |||
| 34 | end)"; | |||
| 35 | ||||
| 36 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x03dc); | |
| 37 | 1 | } | ||
| 38 | ||||
| 39 | // https://github.com/HeinrichG-V12/E65_ReverseEngineering/blob/main/docs/0x0A8.md | |||
| 40 | 4 | TEST(LuaE65, extractTorqueFromA8) { | ||
| 41 | 1 | const char* realdata = TWO_BYTES_LSB R"( | ||
| 42 | ||||
| 43 | function testFunc() | |||
| 44 | data = { 0x42, 0x89, 0x10, 0x80, 0x10, 0x0F, 0x00, 0x60 } | |||
| 45 | return 0.5 * (getTwoBytesLSB(data, 1, 1) >> 4) | |||
| 46 | end | |||
| 47 | )"; | |||
| 48 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x108 / 2); | |
| 49 | 1 | } | ||
| 50 | ||||
| 51 | // http://loopybunny.co.uk/CarPC/can/0AA.html | |||
| 52 | 4 | TEST(LuaE65, Rpm) { | ||
| 53 | 1 | const char* realdata = TWO_BYTES_LSB R"( | ||
| 54 | ||||
| 55 | function testFunc() | |||
| 56 | data = {0x5F, 0x59, 0xFF, 0x00, 0x34, 0x0D, 0x80, 0x99} | |||
| 57 | return getTwoBytesLSB(data, 4, 0.25) | |||
| 58 | end)"; | |||
| 59 | ||||
| 60 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 845); | |
| 61 | 1 | } | ||
| 62 | ||||
| 63 | 4 | TEST(LuaE65, gear) { | ||
| 64 | 1 | const char* realdata = R"( | ||
| 65 | ||||
| 66 | function testFunc() | |||
| 67 | data = {0x58} | |||
| 68 | return data[1] & 0xF | |||
| 69 | end)"; | |||
| 70 | ||||
| 71 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 8); | |
| 72 | 1 | } | ||
| 73 | ||||
| 74 | 4 | TEST(LuaE65, repackAA) { | ||
| 75 | 1 | const char* realdata = ARRAY_EQUALS R"( | ||
| 76 | ||||
| 77 | function testFunc() | |||
| 78 | rpm = 673.75 | |||
| 79 | pedal = 50 | |||
| 80 | data = {0x58, 12, 14} | |||
| 81 | expected = {0x58, 12, 14} | |||
| 82 | return equals(data, expected) | |||
| 83 | end)"; | |||
| 84 | ||||
| 85 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0); | |
| 86 | 1 | } | ||
| 87 | ||||
| 88 | 4 | TEST(LuaE65, gearTorque) { | ||
| 89 | 1 | const char* realdata = GET_BIT_RANGE_LSB R"( | ||
| 90 | ||||
| 91 | function testFunc() | |||
| 92 | data = {0x9F, 0x01, 0x32, 0x20, 0x23, 0x30, 0xFF, 0x43} | |||
| 93 | return getBitRange(data, 12, 12) | |||
| 94 | end)"; | |||
| 95 | ||||
| 96 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x320); | |
| 97 | 1 | } | ||
| 98 | ||||
| 99 | 4 | TEST(LuaE65, offtopicTestGetBitRangeMsb) { | ||
| 100 | 1 | const char* realdata = GET_BIT_RANGE_MSB R"( | ||
| 101 | ||||
| 102 | function testFunc() | |||
| 103 | data = {0x9F, 0x41, 0x32, 0x20, 0x23, 0x30, 0xFF, 0x43} | |||
| 104 | return getBitRangeMsb(data, 12, 12) | |||
| 105 | end)"; | |||
| 106 | ||||
| 107 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x9F4); | |
| 108 | 1 | } | ||
| 109 | ||||
| 110 | 4 | TEST(LuaE65, offtopicTestGetBitRangeMsb2) { | ||
| 111 | 1 | const char* realdata = GET_BIT_RANGE_MSB R"( | ||
| 112 | ||||
| 113 | function testFunc() | |||
| 114 | data = {0x70, 0x04, 0x1F} | |||
| 115 | return getBitRangeMsb(data, 16, 16) | |||
| 116 | end)"; | |||
| 117 | ||||
| 118 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x41f); | |
| 119 | 1 | } | ||
| 120 | ||||
| 121 | 4 | TEST(LuaE65, offtopicTestSetBitRangeMsb2) { | ||
| 122 | 1 | const char* realdata = PRINT_ARRAY ARRAY_EQUALS SET_BIT_RANGE_MSB R"( | ||
| 123 | ||||
| 124 | function testFunc() | |||
| 125 | data = {0x68, 0x07} | |||
| 126 | expected = {0x68, 0x07} | |||
| 127 | setBitRangeMsb(data, 8, 13, 0x807) | |||
| 128 | print(arrayToString(data)) | |||
| 129 | print(arrayToString(expected)) | |||
| 130 | return equals(data, expected) | |||
| 131 | end)"; | |||
| 132 | ||||
| 133 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0); | |
| 134 | 1 | } | ||
| 135 | ||||
| 136 | 4 | TEST(LuaE65, offtopicTestSetBitRangeMsb3) { | ||
| 137 | 1 | const char* realdata = PRINT_ARRAY ARRAY_EQUALS SET_BIT_RANGE_MSB R"( | ||
| 138 | ||||
| 139 | function testFunc() | |||
| 140 | data = {0x68, 0x07} | |||
| 141 | expected = {0x63, 0x04} | |||
| 142 | setBitRangeMsb(data, 8, 13, 0x304) | |||
| 143 | print(arrayToString(data)) | |||
| 144 | print(arrayToString(expected)) | |||
| 145 | return equals(data, expected) | |||
| 146 | end)"; | |||
| 147 | ||||
| 148 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0); | |
| 149 | 1 | } | ||
| 150 | ||||
| 151 | 4 | TEST(LuaE65, gearTorque2) { | ||
| 152 | 1 | const char* realdata = GET_BIT_RANGE_LSB R"( | ||
| 153 | ||||
| 154 | function testFunc() | |||
| 155 | data = {0x9F, 0x01, 0x32, 0x20, 0x23, 0x30, 0xFF, 0x43} | |||
| 156 | return getBitRange(data, 0, 16) | |||
| 157 | end)"; | |||
| 158 | ||||
| 159 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x019F); | |
| 160 | 1 | } | ||
| 161 | ||||
| 162 | 4 | TEST(LuaE65, getBitRangeMsbTest) { | ||
| 163 | 1 | const char* realdata = GET_BIT_RANGE_MSB R"( | ||
| 164 | ||||
| 165 | function testFunc() | |||
| 166 | data = {0x9F, 0x01, 0x32, 0x20, 0x23, 0x67, 0x40, 0x00} | |||
| 167 | return getBitRangeMsb(data, 6 * 8, 13) | |||
| 168 | end)"; | |||
| 169 | ||||
| 170 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x740); | |
| 171 | 1 | } | ||
| 172 | ||||
| 173 | 4 | TEST(LuaE65, setBitRangeMsbTest) { | ||
| 174 | 1 | const char* realdata = PRINT_ARRAY ARRAY_EQUALS SET_BIT_RANGE_MSB R"( | ||
| 175 | ||||
| 176 | function testFunc() | |||
| 177 | data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} | |||
| 178 | setBitRangeMsb(data, 6 * 8, 13, 0x740) | |||
| 179 | expected = {0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00} | |||
| 180 | -- print(arrayToString(data)) | |||
| 181 | -- print(arrayToString(expected)) | |||
| 182 | return equals(data, expected) | |||
| 183 | end)"; | |||
| 184 | ||||
| 185 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0); | |
| 186 | 1 | } | ||
| 187 | ||||
| 188 | 4 | TEST(LuaE65, gearTorque3) { | ||
| 189 | 1 | const char* realdata = GET_BIT_RANGE_LSB R"( | ||
| 190 | ||||
| 191 | function testFunc() | |||
| 192 | data = {0x9F, 0xDF, 0x32, 0x20, 0x23, 0x30, 0xFF, 0x43} | |||
| 193 | return getBitRange(data, 0, 16) | |||
| 194 | end)"; | |||
| 195 | ||||
| 196 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0xDF9F); | |
| 197 | 1 | } | ||
| 198 | ||||
| 199 | ||||
| 200 | 4 | TEST(LuaE65, sumChecksum) { | ||
| 201 | // checksum is first byte | |||
| 202 | // id = A8, packet: | |||
| 203 | // 12 AD 05 A0 05 0F 00 02 | |||
| 204 | ||||
| 205 | 1 | const char* realdata = BMW_CHECKSUM R"( | ||
| 206 | ||||
| 207 | function testFunc() | |||
| 208 | canID = 0xA8 | |||
| 209 | data = { 0xAD, 0x05, 0xA0, 0x05, 0x0F, 0x00, 0x02 } | |||
| 210 | checksum = bmwChecksum(canID, data, 1, 7) | |||
| 211 | return checksum; | |||
| 212 | end)"; | |||
| 213 | ||||
| 214 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_NEAR_M3(testLuaReturnsNumberOrNil(realdata).value_or(0), 0x12); | |
| 215 | 1 | } | ||
| 216 |