Canon 70D

Started by nikfreak, January 15, 2015, 12:22:15 AM

Previous topic - Next topic

0 Members and 2 Guests are viewing this topic.

farrellts

I was reviewing the list of Magic Lantern features which cannot be implemented on EOS 70D due to firmware limitations.  Okay, I don't know a thing about the CPU on this device or what language its firmware was written in, but I would imagine that somebody had to run a decompiler on the firmware at some point, while verifying what limitations it presents when porting Magic Lantern to run on it.  Furthermore, I would imagine, that if it could be demonstrated that the source code of decompiled firmware was sound enough to be compiled and link-edited to create machine code identical -- or at least functionally identical -- to the original firmware from which that source code was decompiled -- well, then I'd imagine the source code could then be tweaked so that the desired missing features of Magic Lantern would then run on EOS 70D.

Now, I know that's a lot of ifs -- and testing tweaked firmware would not only void warranty but could damage the camera.  But I imagine it could be done -- unless there is an actual hardware limitation on this camera beyond what the firmware will allow.  It might be foolish to try this ... but I cannot help wondering if somebody has?  Anybody in this forum perhaps?

As a software developer myself with pretty broad experience, I know the challenges and dangers inherent in a project like this.  It's certainly not something I would undertake alone.  I've worked with some very impressive decompilers, but have never seen one generate perfect source code which can be flawlessly compiled.  Perhaps if one wants higher-fidelity video, it might just be easier to go buy one of the increasingly-affordable 4K-capable cameras out there?  But I'd still like to pull more out of my 70D.

I'd be interested in comments on this. Hope I am not going wildly off the range of topics which this forum hosts?

Please note that it is not my intention to disparage Magic Lantern as implemented on 70D.  I truly appreciate the work involved in creating and maintaining this build!
Tom Farrell 70D.111A

Walter Schulz

ML does not alter or replace Canon firmware. ML doesn't (re)use Canon IP in its code. Therefore ML is not prone to legal action.
As far as I understand your request you want to replace Canon's firmware with a version where ML features are integrated in firmware. IMO this violates Canon IP. Won't happen here.

eduperez

Quote from: farrellts on January 17, 2018, 12:06:30 PM
I was reviewing the list of Magic Lantern features which cannot be implemented on EOS 70D due to firmware limitations.  Okay, I don't know a thing about the CPU on this device or what language its firmware was written in, but I would imagine that somebody had to run a decompiler on the firmware at some point, while verifying what limitations it presents when porting Magic Lantern to run on it.  Furthermore, I would imagine, that if it could be demonstrated that the source code of decompiled firmware was sound enough to be compiled and link-edited to create machine code identical -- or at least functionally identical -- to the original firmware from which that source code was decompiled -- well, then I'd imagine the source code could then be tweaked so that the desired missing features of Magic Lantern would then run on EOS 70D.

Now, I know that's a lot of ifs -- and testing tweaked firmware would not only void warranty but could damage the camera.  But I imagine it could be done -- unless there is an actual hardware limitation on this camera beyond what the firmware will allow.  It might be foolish to try this ... but I cannot help wondering if somebody has?  Anybody in this forum perhaps?

That is not how it works...

Most of the firmware (at least the parts of it being executed on the main CPU) were (most probably) written in C. So far, all decompiling efforts have just translated machine code into assembler, and only for the purpose of studying how does the firmware work; it has never been translated into the original C (except probably some very specific parts, for illustration purposes). Besides, ML does not contain any of Canon's code, neither as binary, source code, or compiled from a decompilaton.

ML does not replace or substitute the original firmware, or even parts of it: what ML does is to interfere in specific points, hijacking the communication between different parts of the firmware, or between the firmware and the hardware; but the original untouched firmware is still in charge of the hardware, most of the time.

What you are proposing is a whole new beast... not only you need to produce a sorce code that can be compiled to match the current firmware, you also have to ensure that any modification you make to it does not break everything. I have still not heard of anyone decompiling the ASM into the original C, or any C code that can be compiled back and produce the same firmware, let alone some C that can be understood by humans. And then, just adding one single instruction means all code and data gets relocated, and thus all references must be updated.

lojzik

magiclantern-Nightly.2018Jan23.70D112 tests
stubtest.log
[Pass] is_play_mode() => 0x1
[Pass] src = fio_malloc(size) => 0x42104094
[Pass] dst = fio_malloc(size) => 0x429080a0
[Pass] memcmp(dst, src, 4097) => 0xffffff80
[Pass] edmac_memcpy(dst, src, 4097) => 0x429080a0
[Pass] memcmp(dst, src, 4097) => 0x0
[Pass] edmac_memcpy(dst, src, 4097) => 0x429080a0
[Pass] memcmp(dst, src, size) => 0xffffffb8
[Pass] edmac_memcpy(dst, src, size) => 0x429080a0
[Pass] memcmp(dst, src, size) => 0x0
[Pass] memcmp(dst, src, size) => 0x67
[Pass] edmac_memcpy_start(dst, src, size) => 0x429080a0
       dt => 0x1828
[Pass] copied => 0x4015e0
[Pass] copied => 0x4015e0
[Pass] copied => 0x4015e0
[Pass] memcmp(dst, src, copied) => 0x0
[Pass] memcmp(dst, src, copied + 16) => 0x59
       edmac_memcpy_finish()
       free(src)
       free(dst)
Cache test A (EDMAC on BMP buffer)...
[Pass] bmp = bmp_load("ML/CROPMKS/CINESCO2.BMP", 1) => 0x127678
[Pass] old => 0x0
[Pass] irq => 0xc0
[Pass] differences => 0x8ef
[Pass] old => 0x0
[Pass] irq => 0xc0
[Pass] differences => 0x0
Cache test B (FIO on 8K buffer)...
[Pass] tries[0] => 0xe1
[Pass] tries[1] => 0xf1
[Pass] tries[2] => 0x11a
[Pass] tries[3] => 0xfc
[Pass] failr[0] => 0x6a
[Pass] failw[0] => 0x96
[Pass] failr[1] => 0x6b
[Pass] failw[1] => 0x0
[Pass] failr[2] => 0x0
[Pass] failw[2] => 0xca
[Pass] failr[3] => 0x0
[Pass] failw[3] => 0x0
       times[0] / tries[0] => 0x2b
       times[1] / tries[1] => 0x2f
       times[2] / tries[2] => 0x2f
       times[3] / tries[3] => 0x2d
Cache tests finished.

[Pass] f = FIO_CreateFile("test.dat") => 0x6
[Pass] FIO_WriteFile(f, (void*)0xFF000000, 0x10000) => 0x10000
[Pass] FIO_WriteFile(f, (void*)0xFF000000, 0x10000) => 0x10000
       FIO_CloseFile(f)
[Pass] FIO_GetFileSize("test.dat", &size) => 0x0
[Pass] size => 0x20000
[Pass] p = (void*)_alloc_dma_memory(0x20000) => 0x40933c08
[Pass] f = FIO_OpenFile("test.dat", O_RDONLY | O_SYNC) => 0x6
[Pass] FIO_ReadFile(f, p, 0x20000) => 0x20000
       FIO_CloseFile(f)
       _free_dma_memory(p)
[Pass] count => 0x3a98
[Pass] buf = fio_malloc(0x1000000) => 0x42104094
[Pass] FIO_GetFileSize_direct("test.dat") => 0x82000000
[Pass] f = FIO_OpenFile("test.dat", O_RDWR | O_SYNC) => 0x6
[Pass] FIO_SeekSkipFile(f, 0, SEEK_END) => 0x82000000
[Pass] FIO_WriteFile(f, buf, 0x10) => 0x10
[Pass] FIO_SeekSkipFile(f, -0x20, SEEK_END) => 0x81fffff0
[Pass] FIO_WriteFile(f, buf, 0x30) => 0x30
[Pass] FIO_SeekSkipFile(f, 0x20, SEEK_SET) => 0x20
[Pass] FIO_SeekSkipFile(f, 0x30, SEEK_CUR) => 0x50
[Pass] FIO_SeekSkipFile(f, -0x20, SEEK_CUR) => 0x30
[Pass] FIO_GetFileSize_direct("test.dat") => 0x82000020
[Pass] is_file("test.dat") => 0x1
[Pass] FIO_RemoveFile("test.dat") => 0x0
[Pass] is_file("test.dat") => 0x0
[Pass] SetTimerAfter(0, timer_cbr, overrun_cbr, 0) => 0x15
[Pass] timer_func => 0x2
[Pass] SetTimerAfter(1000, timer_cbr, overrun_cbr, 0) => 0x9b82
       msleep(900)
[Pass] timer_func => 0x0
       msleep(200)
[Pass] timer_func => 0x1
[Pass] ABS((timer_time/1000 - t0) - 1000) => 0x2
[Pass] ABS((timer_arg - ta0) - 1000) => 0xa
[Pass] timer = SetTimerAfter(1000, timer_cbr, overrun_cbr, 0) => 0x9bbe
       msleep(400)
       CancelTimer(timer)
[Pass] timer_func => 0x0
       msleep(1500)
[Pass] timer_func => 0x0
[Pass] SetHPTimerAfterNow(0, timer_cbr, overrun_cbr, 0) => 0x15
[Pass] timer_func => 0x2
[Pass] SetHPTimerAfterNow(100000, timer_cbr, overrun_cbr, 0) => 0x38470
       msleep(90)
[Pass] timer_func => 0x0
       msleep(20)
[Pass] timer_func => 0x1
[Pass] ABS(DeltaT(timer_time, t0) - 100000) => 0xe8
[Pass] ABS(DeltaT(timer_arg, ta0) - 100000) => 0xca
[Pass] ABS((get_us_clock_value() - t0) - 110000) => 0xe4
[Pass] SetHPTimerAfterNow(90000, next_tick_cbr, overrun_cbr, 0) => 0x38472
       msleep(80)
[Pass] timer_func => 0x0
       msleep(20)
[Pass] timer_func => 0x3
       msleep(80)
[Pass] timer_func => 0x3
       msleep(20)
[Pass] timer_func => 0x1
[Pass] ABS(DeltaT(timer_time, t0) - 300000) => 0x15c
[Pass] ABS(DeltaT(timer_arg, ta0) - 300000) => 0x13c
[Pass] ABS((get_us_clock_value() - t0) - 310000) => 0xfd
       t0 = *(uint32_t*)0xC0242014 => 0xa4051
       msleep(250)
       t1 = *(uint32_t*)0xC0242014 => 0xdf76a
[Pass] ABS(MOD(t1-t0, 1048576)/1000 - 250) => 0x7
       LoadCalendarFromRTC( &now )
       s0 = now.tm_sec => 0x39
       Date/time: 2018/01/26 23:12:57
       msleep(1500)
       LoadCalendarFromRTC( &now )
       s1 = now.tm_sec => 0x3a
[Pass] MOD(s1-s0, 60) => 0x1
[Pass] MOD(s1-s0, 60) => 0x1
       m0 = MALLOC_FREE_MEMORY => 0x37278
[Pass] p = (void*)_malloc(50*1024) => 0x1293c8
[Pass] CACHEABLE(p) => 0x1293c8
       m1 = MALLOC_FREE_MEMORY => 0x2aa68
       _free(p)
       m2 = MALLOC_FREE_MEMORY => 0x37278
[Pass] ABS((m0-m1) - 50*1024) => 0x10
[Pass] ABS(m0-m2) => 0x0
       m0 = GetFreeMemForAllocateMemory() => 0x258ff0
[Pass] p = (void*)_AllocateMemory(256*1024) => 0x933bc8
[Pass] CACHEABLE(p) => 0x933bc8
       m1 = GetFreeMemForAllocateMemory() => 0x218fe4
       _FreeMemory(p)
       m2 = GetFreeMemForAllocateMemory() => 0x258ff0
[Pass] ABS((m0-m1) - 256*1024) => 0xc
[Pass] ABS(m0-m2) => 0x0
       m01 = MALLOC_FREE_MEMORY => 0x37278
       m02 = GetFreeMemForAllocateMemory() => 0x258ff0
[Pass] p = (void*)_alloc_dma_memory(256*1024) => 0x40933c08
[Pass] UNCACHEABLE(p) => 0x40933c08
[Pass] CACHEABLE(p) => 0x933c08
[Pass] UNCACHEABLE(CACHEABLE(p)) => 0x40933c08
       _free_dma_memory(p)
[Pass] p = (void*)_shoot_malloc(24*1024*1024) => 0x42104074
[Pass] UNCACHEABLE(p) => 0x42104074
       _shoot_free(p)
       m11 = MALLOC_FREE_MEMORY => 0x37278
       m12 = GetFreeMemForAllocateMemory() => 0x258ff0
[Pass] ABS(m01-m11) => 0x0
[Pass] ABS(m02-m12) => 0x0
[Pass] suite = shoot_malloc_suite_contig(24*1024*1024) => 0x1256e8
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x1
[Pass] suite->size => 0x1800000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125710
[Pass] chunk->signature => 'MemChunk'
[Pass] chunk->size => 0x1800000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x42104070
[Pass] UNCACHEABLE(p) => 0x42104070
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] suite = shoot_malloc_suite_contig(0) => 0x1256e8
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x1
[Pass] suite->size => 0x2000000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125710
[Pass] chunk->signature => 'MemChunk'
[Pass] chunk->size => 0x2000000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x42104070
[Pass] UNCACHEABLE(p) => 0x42104070
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] suite = shoot_malloc_suite(64*1024*1024) => 0x1256e8
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0xa
[Pass] suite->size => 0x4000000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125710
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2000000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x42104070
[Pass] UNCACHEABLE(p) => 0x42104070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125770
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x220c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4410407c
[Pass] UNCACHEABLE(p) => 0x4410407c
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1257a8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x22f4000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5c9140e4
[Pass] UNCACHEABLE(p) => 0x5c9140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1257e0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x23dc000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a5140e4
[Pass] UNCACHEABLE(p) => 0x5a5140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125818
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x24c4000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x581140e4
[Pass] UNCACHEABLE(p) => 0x581140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125850
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x25ac000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4af140e4
[Pass] UNCACHEABLE(p) => 0x4af140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125888
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2694000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48b140e4
[Pass] UNCACHEABLE(p) => 0x48b140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1258c0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x277c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x467140e4
[Pass] UNCACHEABLE(p) => 0x467140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1258f8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2864000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x443140e4
[Pass] UNCACHEABLE(p) => 0x443140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125930
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4000000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x44400064
[Pass] UNCACHEABLE(p) => 0x44400064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x0
[Pass] total => 0x4000000
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] suite = shoot_malloc_suite(0) => 0x1256e8
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x14
[Pass] suite->size => 0xf700000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125710
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2000000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x42104070
[Pass] UNCACHEABLE(p) => 0x42104070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125770
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x220c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4410407c
[Pass] UNCACHEABLE(p) => 0x4410407c
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1257a8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x22f4000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5c9140e4
[Pass] UNCACHEABLE(p) => 0x5c9140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1257e0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x23dc000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a5140e4
[Pass] UNCACHEABLE(p) => 0x5a5140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125818
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x24c4000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x581140e4
[Pass] UNCACHEABLE(p) => 0x581140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125850
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x25ac000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4af140e4
[Pass] UNCACHEABLE(p) => 0x4af140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125888
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2694000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48b140e4
[Pass] UNCACHEABLE(p) => 0x48b140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1258c0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x277c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x467140e4
[Pass] UNCACHEABLE(p) => 0x467140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1258f8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2864000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x443140e4
[Pass] UNCACHEABLE(p) => 0x443140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125930
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4864000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x44400064
[Pass] UNCACHEABLE(p) => 0x44400064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125968
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4b78000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x46400070
[Pass] UNCACHEABLE(p) => 0x46400070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1259a0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x6b78000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x46800064
[Pass] UNCACHEABLE(p) => 0x46800064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1259d8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x6e8c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48800070
[Pass] UNCACHEABLE(p) => 0x48800070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125a10
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x8e8c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48c00064
[Pass] UNCACHEABLE(p) => 0x48c00064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125a48
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x91a0000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4ac00070
[Pass] UNCACHEABLE(p) => 0x4ac00070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125a80
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xb1a0000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x55e00064
[Pass] UNCACHEABLE(p) => 0x55e00064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125ab8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xb4b4000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x57e00070
[Pass] UNCACHEABLE(p) => 0x57e00070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125af0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xd4b4000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x58200064
[Pass] UNCACHEABLE(p) => 0x58200064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125b28
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xd7c8000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a200070
[Pass] UNCACHEABLE(p) => 0x5a200070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125b60
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xf700000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a600064
[Pass] UNCACHEABLE(p) => 0x5a600064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x0
[Pass] total => 0xf700000
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] strlen("abc") => 0x3
[Pass] strlen("qwertyuiop") => 0xa
[Pass] strlen("") => 0x0
[Pass] strcpy(msg, "hi there") => 0x1ec2bc
[Pass] msg => 'hi there'
[Pass] snprintf(a, sizeof(a), "foo") => 0x3
[Pass] snprintf(b, sizeof(b), "foo") => 0x3
[Pass] strcmp(a, b) => 0x0
[Pass] snprintf(a, sizeof(a), "bar") => 0x3
[Pass] snprintf(b, sizeof(b), "baz") => 0x3
[Pass] strcmp(a, b) => 0xfffffff8
[Pass] snprintf(a, sizeof(a), "Display") => 0x7
[Pass] snprintf(b, sizeof(b), "Defishing") => 0x9
[Pass] strcmp(a, b) => 0x4
[Pass] snprintf(buf, 3, "%d", 1234) => 0x2
[Pass] buf => '12'
[Pass] memcpy(foo, bar, 6) => 0x1ec2a0
[Pass] foo => 'asdfghuiop'
[Pass] memset(bar, '*', 5) => 0x1ec280
[Pass] bar => '*****hjkl;'
       bzero32(bar + 5, 5)
[Pass] bar => '****'
       EngDrvOut(LCD_Palette[0], 0x1234)
[Pass] shamem_read(LCD_Palette[0]) => 0x1234
       call("TurnOnDisplay")
[Pass] DISPLAY_IS_ON => 0x1
       call("TurnOffDisplay")
[Pass] DISPLAY_IS_ON => 0x0
       call("TurnOnDisplay")
[Pass] DISPLAY_IS_ON => 0x1
       task_create("test", 0x1c, 0x1000, test_task, 0) => 0xd94600f2
[Pass] test_task_created => 0x1
[Pass] get_current_task_name() => 'run_test'
[Pass] task_max => 0x84
[Pass] task_max => 0x84
[Pass] mq = mq ? mq : (void*)msg_queue_create("test", 5) => 0xd94800c8
[Pass] msg_queue_post(mq, 0x1234567) => 0x0
[Pass] msg_queue_receive(mq, (struct event **) &m, 500) => 0x0
[Pass] m => 0x1234567
[Pass] msg_queue_receive(mq, (struct event **) &m, 500) => 0x9
[Pass] sem = sem ? sem : create_named_semaphore("test", 1) => 0xd94a0234
[Pass] take_semaphore(sem, 500) => 0x0
[Pass] take_semaphore(sem, 500) => 0x9
[Pass] give_semaphore(sem) => 0x0
[Pass] take_semaphore(sem, 500) => 0x0
[Pass] give_semaphore(sem) => 0x0
[Pass] rlock = rlock ? rlock : CreateRecursiveLock(0) => 0xd94c00de
[Pass] AcquireRecursiveLock(rlock, 500) => 0x0
[Pass] AcquireRecursiveLock(rlock, 500) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0xf
       SetGUIRequestMode(1); msleep(1000);
[Pass] CURRENT_GUI_MODE => 0x1
       SetGUIRequestMode(2); msleep(1000);
[Pass] CURRENT_GUI_MODE => 0x2
       SetGUIRequestMode(0); msleep(1000);
[Pass] CURRENT_GUI_MODE => 0x0
[Pass] display_idle() => 0x1
       GUI_Control(BGMT_PLAY, 0, 0, 0); msleep(1000);
[Pass] PLAY_MODE => 0x1
[Pass] MENU_MODE => 0x0
       GUI_Control(BGMT_MENU, 0, 0, 0); msleep(1000);
[Pass] MENU_MODE => 0x1
[Pass] PLAY_MODE => 0x0
[Pass] dialog->type => 'DIALOG'
       GUI_Control(BGMT_MENU, 0, 0, 0); msleep(500);
[Pass] MENU_MODE => 0x0
[Pass] PLAY_MODE => 0x0
       SW1(1,100)
[Pass] HALFSHUTTER_PRESSED => 0x1
       SW1(0,100)
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x1
[Pass] is_pure_play_movie_mode() => 0x0
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x0
[Pass] is_pure_play_movie_mode() => 0x0
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x0
[Pass] is_pure_play_movie_mode() => 0x1
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x0
[Pass] is_pure_play_movie_mode() => 0x0


luatest.log
===============================================================================
ML/SCRIPTS/API_TEST.LUA - 2018-1-26 23:27:27
===============================================================================

Strict mode tests...
Strict mode tests passed.

Generic tests...
camera = table:
  shutter = table:
    raw = 91
    apex = 4.374999
    ms = 48
    value = 0.048194
  aperture = table:
    raw = 32
    apex = 3.
    value = 2.799999
    min = table:
      raw = 32
      apex = 3.
      value = 2.799999
    max = table:
      raw = 80
      apex = 9
      value = 22.6
  iso = table:
    raw = 0
    apex = -4
    value = 0
  ec = table:
    raw = 0
    value = 0
  flash_ec = table:
    raw = 0
    value = 0
  kelvin = 6400
  mode = 3
  metering_mode = 3
  drive_mode = 0
  model = "Canon EOS 70D"
  model_short = "70D"
  firmware = "1.1.2"
  temperature = 156
  state = 0
  reboot = function: p
  bulb = function: p
  shoot = function: p
event = table:
  pre_shoot = nil
  post_shoot = nil
  shoot_task = nil
  seconds_clock = nil
  keypress = nil
  custom_picture_taking = nil
  intervalometer = nil
  config_save = nil
console = table:
  hide = function: p
  write = function: p
  show = function: p
  clear = function: p
lv = table:
  enabled = false
  paused = false
  running = false
  zoom = 1
  wait = function: p
  resume = function: p
  start = function: p
  info = function: p
  stop = function: p
  pause = function: p
lens = table:
  name = "EF-S24mm f/2.8 STM"
  focal_length = 0
  focus_distance = 90
  hyperfocal = 0
  dof_near = 0
  dof_far = 0
  af = true
  af_mode = 0
  focus = function: p
display = table:
  idle = true
  height = 480
  width = 720
  circle = function: p
  screenshot = function: p
  print = function: p
  off = function: p
  line = function: p
  draw = function: p
  pixel = function: p
  notify_box = function: p
  clear = function: p
  load = function: p
  rect = function: p
  on = function: p
key = table:
  last = 0
  press = function: p
  wait = function: p
menu = table:
  visible = false
  open = function: p
  get = function: p
  close = function: p
  new = function: p
  block = function: p
  set = function: p
testmenu = userdata:
  value = 0
  name = "Script API tests"
  help = "Various tests for the Lua scripting API."
  help2 = "When adding new Lua APIs, tests for them should go here."
  advanced = 0
  depends_on = 0
  edit_mode = 0
  hidden = false
  icon_type = 5
  jhidden = false
  max = 0
  min = 0
  selected = true
  shidden = false
  starred = false
  submenu_height = 0
  submenu_width = 0
  unit = 0
  works_best_in = 0
  run_in_separate_task = 0
  select = function: p
  update = nil
  info = nil
  rinfo = nil
  warning = nil
movie = table:
  recording = false
  start = function: p
  stop = function: p
dryos = table:
  clock = 15
  ms_clock = 15386
  prefix = "IMG_"
  dcim_dir = table:
    exists = true
    create = function: p
    children = function: p
    files = function: p
    parent = table:
      exists = true
      create = function: p
      children = function: p
      files = function: p
      parent = table:
        exists = true
        create = function: p
        children = function: p
        files = function: p
        parent = nil
        path = "B:/"
      path = "B:/DCIM/"
    path = "B:/DCIM/100CANON/"
  config_dir = table:
    exists = true
    create = function: p
    children = function: p
    files = function: p
    parent = table:
      exists = true
      create = function: p
      children = function: p
      files = function: p
      parent = table:
        exists = true
        create = function: p
        children = function: p
        files = function: p
        parent = nil
        path = "B:/"
      path = "ML/"
    path = "ML/SETTINGS/"
  ml_card = table:
    cluster_size = 32768
    drive_letter = "B"
    file_number = 4566
    folder_number = 100
    free_space = 15577824
    type = "SD"
    path = "B:/"
    _card_ptr = userdata
  shooting_card = table:
    cluster_size = 32768
    drive_letter = "B"
    file_number = 4566
    folder_number = 100
    free_space = 15577824
    type = "SD"
    path = "B:/"
    _card_ptr = userdata
  date = table:
    isdst = false
    min = 27
    month = 1
    day = 26
    wday = 6
    year = 2018
    yday = 26
    hour = 23
    sec = 28
  call = function: p
  directory = function: p
  remove = function: p
interval = table:
  time = 10
  count = 0
  running = 0
  stop = function: p
battery = table:
  level = 86
  id = 1
  performance = 0
  time = 9288
  drain_rate = 33
task = table:
  yield = function: p
  create = function: p
property = table:
Generic tests completed.

Module tests...
Copy test: autoexec.bin -> tmp.bin
Copy test OK
Append test: tmp.txt
Append test OK
Testing exposure settings, module 'camera'...
Camera    : Canon EOS 70D (70D) 1.1.2
Lens      : EF-S24mm f/2.8 STM
Shoot mode: 3
Shutter   : ,20 (raw 91, 0.048194s, 48ms, apex 4.374999)
Aperture  : 2.8 (raw 32, f/2.799999, apex 3.)
Av range  : 2.8..22 (raw 32..80, f/2.799999..f/22.6, apex 3...9)
ISO       : AutoISO (raw 0, 0, apex -4)
EC        : 0.0 (raw 0, 0 EV)
Flash EC  : 0.0 (raw 0, 0 EV)
Setting shutter to random values...
Setting ISO to random values...
Setting aperture to random values...
Please switch to Av mode.
Setting EC to random values...
Setting Flash EC to random values...
Exposure tests completed.

Testing module 'lv'...
Starting LiveView...
Setting zoom to x1...
Setting zoom to x5...
Setting zoom to x10...
Setting zoom to x5...
Setting zoom to x1...
Setting zoom to x10...
Setting zoom to x1...
Pausing LiveView...
Resuming LiveView...
Stopping LiveView...
LiveView tests completed.

Focus distance: 250
Focusing backward...
Focus distance: 6310
Focusing forward with step size 3, wait=true...
.................
Focus distance: 180
Focusing backward with step size 3, wait=true...
.................
Focus distance: 6310
Focus range: 17 steps forward, 17 steps backward.
Focusing forward with step size 3, wait=false...
.................
Focus distance: 180
Focusing backward with step size 3, wait=false...
.................
Focus distance: 655350
Focus range: 17 steps forward, 17 steps backward.
Focusing forward with step size 2, wait=true...
...
Focus distance: 170
Focusing backward with step size 2, wait=true...
...
Focus distance: 655350
Focus range: 125 steps forward, 125 steps backward.
Focusing forward with step size 2, wait=false...
...
Focus distance: 170
Focusing backward with step size 2, wait=false...
...
Focus distance: 655350
Focus range: 125 steps forward, 125 steps backward.
Focusing forward with step size 1, wait=true...
...
Focus distance: 170
Focusing backward with step size 1, wait=true...
...
Focus distance: 655350
Focus range: 454 steps forward, 454 steps backward.
Focusing forward with step size 1, wait=false...
...
Focus distance: 170
Focusing backward with step size 1, wait=false...
...
Focus distance: 655350
Focus range: 454 steps forward, 454 steps backward.
Focus test completed.

Done! 
70D.112

Anantajit

Hi. What is new in the jan23 release? I am no developer, just a user and can't seem to find any news about it, that I understand.
Thanks for your amazing work!

Walter Schulz

Top of page -> Downloads -> Download nightly builds -> 70D -> Change log.
Some bugs removed ...

a1ex

Just backend work towards unification. How is it working, compared to previous build?

I don't have a 70D to try; you may notice:
- null pointer errors are now reported (you may emulate one with the selftest module)
- buttons no longer working (hopefully not)
- some additional messages if you compile from the same changeset for running in QEMU
- random stuff might be broken, please report if you find any (can't predict exactly what, see for example this 6D bug)
- fixes for other camera models (so they can all run from the same source tree) - see the Lua call for testers to try these changes on other models.

Yeah, unification requires work from owners of all other cameras. So far, only received reports on a few models...

kalamuni

Hi
The very recent update i have installed in my camera (70D). Here i cant see any section to change the Bit depth . I dont even know what is the default BPP i am working with. sir  Pls answer it... as am unable to switch through 14/12/10 bpp.
regards 

theBilalFakhouri

Quote from: kalamuni on February 05, 2018, 12:53:38 PM
Hi
The very recent update i have installed in my camera (70D). Here i cant see any section to change the Bit depth . I dont even know what is the default BPP i am working with. sir  Pls answer it... as am unable to switch through 14/12/10 bpp.
regards
You have downloaded the latest nightly build update (it doesn't have 10-12bit yet).
So you will find the 10-12 bit depth build in experiments section under 10/12-bit RAW video (scroll down).
https://builds.magiclantern.fm/experiments.html

kalamuni

theBilalFakhouri  thank you for info   :)

sangev

Hello! Recently while I was filming with ML in my SD card, my 70D froze. I tried playing around with it but nothing would respond.
So I decided to turn it off, and once I did I could never turn it on again. Tried using different SD cards, different batteries, and still, it won't turn on! I followed this forum but it didn't fix my camera! https://www.magiclantern.fm/forum/index.php?topic=14732

Anybody have any suggestions? Really want my 70D up and running!

ShootMeAlready

Ensure you have Canon v1.1.2 firmware.  ** If you ever had ML running recently then you must be v1.1.2.
Ok try reformating your card.  ExFat no quick. 
After done, Copy a jpg file, and read it, just to ensure your card reads/writes. Then blow it away.
Copy ML from nightlies (port in progress) to your SD card. Ensure its extracted prior to copy. It must be only item on card.
Put SD card in camera.
Remove batteries from camera for 60s.
Reboot camera.
Assuming it comes up, go to Fn setting to check version.
Install ML. (you should see some messages as it installs) and then turn camera off/on when instructed.

These above steps have yet to fail me, from a number of crashes, however I have had to remove the batteries twice for 60s, and repeat those reboot/install steps, especially if I am too quick or the bug is in overwriting data from a movie being processed.



T3i+ML & 70D.112+ML, Tokina 11-16 2.8, Sigma 18-35 1.8, 50-150 II 2.8, 50 1.4, Canon 28 1.8, 35 2, 85 1.8 "Shoot Wide and Prosper"

OlRivrRat

      @ S'M'A'

   Thanks much for the info. Just tried on My Dead 70D & Sadly It's still Dead.

                     ORR ~ DeanB
ORR~DeanB  ~~  80D-ML  &  SL1+ML  &  5D2+ML  &  5DC+ML  &  70D+ML(AliveAgain)

a1ex

Noticed focus stacking & related features might work with latest lua_fix build (2018Feb17); conclusion drawn from lojzik's test.

These features were enabled temporarily just for this particular build (not committed to the repository); to commit them, please report back. If compiling from source, enable them from features.h (and update the comments in lens.c with your findings, since they were written for an older version of the PROP_LV_FOCUS_DONE handler).

andy kh

shooting in raw is not possible anymore for me after upgrading to 70D. i get color moire in all my clips. when i shoot wit my 550D & 650D, it hapeen only if i shoot in 50/60fps and not in 24/25fps. any 70D users experiencing  the same?


5D Mark III - 70D

ShootMeAlready

70D has two solutions for moire. 3X video mode is a centre crop without moire.  However to get best H264 video it requires a flat profile, All-I compression, denoise, and post processing.  70D does shoot 10bit raw, check my back posts for resolutions but they will have the moire.  The second approach is a VAF by Mosaic, which generally gets rid of moire aliasing. 
T3i+ML & 70D.112+ML, Tokina 11-16 2.8, Sigma 18-35 1.8, 50-150 II 2.8, 50 1.4, Canon 28 1.8, 35 2, 85 1.8 "Shoot Wide and Prosper"

andy kh

#shootmealready   im aware of the vaf but i don think i wil spend 295$ buying a filter. i bought a 70D sometime back since i love its auto focus and sold out my 650D since pink dots of 650D was annoying so much. shooting in crop mode in a 70D make its auto focus unusable. my question is do you also get moire like me when you shoot raw? or is it only me. i have seen some good raw video shoot with a 70D on youtube
5D Mark III - 70D

lojzik

fast magiclantern-Nightly.2018Feb17.70D112 build test
stubtest.log (Test complete, 12810 passed, 10 failed.)
[Pass] is_play_mode() => 0x1
[Pass] src = fio_malloc(size) => 0x4238c0a8
[Pass] dst = fio_malloc(size) => 0x42b900b4
[Pass] memcmp(dst, src, 4097) => 0xffffffd8
[Pass] edmac_memcpy(dst, src, 4097) => 0x42b900b4
[Pass] memcmp(dst, src, 4097) => 0x0
[Pass] edmac_memcpy(dst, src, 4097) => 0x42b900b4
[Pass] memcmp(dst, src, size) => 0xffffffb9
[Pass] edmac_memcpy(dst, src, size) => 0x42b900b4
[Pass] memcmp(dst, src, size) => 0x0
[Pass] memcmp(dst, src, size) => 0x8
[Pass] edmac_memcpy_start(dst, src, size) => 0x42b900b4
       dt => 0x16e6
[Pass] copied => 0x402000
[Pass] copied => 0x402000
[Pass] copied => 0x402000
[Pass] memcmp(dst, src, copied) => 0x0
[Pass] memcmp(dst, src, copied + 16) => 0xffffff9f
       edmac_memcpy_finish()
       free(src)
       free(dst)
Cache test A (EDMAC on BMP buffer)...
[Pass] bmp = bmp_load("ML/CROPMKS/CINESCO2.BMP", 1) => 0x1268e8
[Pass] old => 0x0
[Pass] irq => 0xc0
[Pass] differences => 0x1140
[Pass] old => 0x0
[Pass] irq => 0xc0
[Pass] differences => 0x0
Cache test B (FIO on 8K buffer)...
[Pass] tries[0] => 0x104
[Pass] tries[1] => 0xf6
[Pass] tries[2] => 0xf1
[Pass] tries[3] => 0xfd
[Pass] failr[0] => 0x80
[Pass] failw[0] => 0xa4
[Pass] failr[1] => 0x63
[Pass] failw[1] => 0x0
[Pass] failr[2] => 0x0
[Pass] failw[2] => 0x97
[Pass] failr[3] => 0x0
[Pass] failw[3] => 0x0
       times[0] / tries[0] => 0x32
       times[1] / tries[1] => 0x35
       times[2] / tries[2] => 0x33
       times[3] / tries[3] => 0x37
Cache tests finished.

[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[FAIL] wait_focus_status(1000, 3) => 0x0
[FAIL] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[FAIL] wait_focus_status(1000, 3) => 0x0
[FAIL] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[FAIL] wait_focus_status(1000, 3) => 0x0
[FAIL] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[FAIL] wait_focus_status(1000, 3) => 0x0
[FAIL] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[FAIL] wait_focus_status(1000, 3) => 0x0
[FAIL] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] wait_focus_status(1000, 3) => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x1
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x1
[Pass] get_focus_confirmation() => 0x0
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] lv_focus_status => 0x1
[Pass] f = FIO_CreateFile("test.dat") => 0x6
[Pass] FIO_WriteFile(f, (void*)0xFF000000, 0x10000) => 0x10000
[Pass] FIO_WriteFile(f, (void*)0xFF000000, 0x10000) => 0x10000
       FIO_CloseFile(f)
[Pass] FIO_GetFileSize("test.dat", &size) => 0x0
[Pass] size => 0x20000
[Pass] p = (void*)_alloc_dma_memory(0x20000) => 0x40934338
[Pass] f = FIO_OpenFile("test.dat", O_RDONLY | O_SYNC) => 0x6
[Pass] FIO_ReadFile(f, p, 0x20000) => 0x20000
       FIO_CloseFile(f)
       _free_dma_memory(p)
[Pass] count => 0x3a98
[Pass] buf = fio_malloc(0x1000000) => 0x4238c0a8
[Pass] FIO_GetFileSize_direct("test.dat") => 0x82000000
[Pass] f = FIO_OpenFile("test.dat", O_RDWR | O_SYNC) => 0x6
[Pass] FIO_SeekSkipFile(f, 0, SEEK_END) => 0x82000000
[Pass] FIO_WriteFile(f, buf, 0x10) => 0x10
[Pass] FIO_SeekSkipFile(f, -0x20, SEEK_END) => 0x81fffff0
[Pass] FIO_WriteFile(f, buf, 0x30) => 0x30
[Pass] FIO_SeekSkipFile(f, 0x20, SEEK_SET) => 0x20
[Pass] FIO_SeekSkipFile(f, 0x30, SEEK_CUR) => 0x50
[Pass] FIO_SeekSkipFile(f, -0x20, SEEK_CUR) => 0x30
[Pass] FIO_GetFileSize_direct("test.dat") => 0x82000020
[Pass] is_file("test.dat") => 0x1
[Pass] FIO_RemoveFile("test.dat") => 0x0
[Pass] is_file("test.dat") => 0x0
[Pass] SetTimerAfter(0, timer_cbr, overrun_cbr, 0) => 0x15
[Pass] timer_func => 0x2
[Pass] SetTimerAfter(1000, timer_cbr, overrun_cbr, 0) => 0xa446
       msleep(900)
[Pass] timer_func => 0x0
       msleep(200)
[Pass] timer_func => 0x1
[Pass] ABS((timer_time/1000 - t0) - 1000) => 0x7
[Pass] ABS((timer_arg - ta0) - 1000) => 0xa
[Pass] timer = SetTimerAfter(1000, timer_cbr, overrun_cbr, 0) => 0xa488
       msleep(400)
       CancelTimer(timer)
[Pass] timer_func => 0x0
       msleep(1500)
[Pass] timer_func => 0x0
[Pass] SetHPTimerAfterNow(0, timer_cbr, overrun_cbr, 0) => 0x15
[Pass] timer_func => 0x2
[Pass] SetHPTimerAfterNow(100000, timer_cbr, overrun_cbr, 0) => 0x2d56a
       msleep(90)
[Pass] timer_func => 0x0
       msleep(20)
[Pass] timer_func => 0x1
[Pass] ABS(DeltaT(timer_time, t0) - 100000) => 0xf7
[Pass] ABS(DeltaT(timer_arg, ta0) - 100000) => 0xd6
[Pass] ABS((get_us_clock_value() - t0) - 110000) => 0xffffffa1
[Pass] SetHPTimerAfterNow(90000, next_tick_cbr, overrun_cbr, 0) => 0x2d56c
       msleep(80)
[Pass] timer_func => 0x0
       msleep(20)
[Pass] timer_func => 0x3
       msleep(80)
[Pass] timer_func => 0x3
       msleep(20)
[Pass] timer_func => 0x1
[Pass] ABS(DeltaT(timer_time, t0) - 300000) => 0x24
[Pass] ABS(DeltaT(timer_arg, ta0) - 300000) => 0x3
[Pass] ABS((get_us_clock_value() - t0) - 310000) => 0xffffffa7
       t0 = *(uint32_t*)0xC0242014 => 0x7f260
       msleep(250)
       t1 = *(uint32_t*)0xC0242014 => 0xba69c
[Pass] ABS(MOD(t1-t0, 1048576)/1000 - 250) => 0x8
       LoadCalendarFromRTC( &now )
       s0 = now.tm_sec => 0x8
       Date/time: 2018/02/19 11:38:08
       msleep(1500)
       LoadCalendarFromRTC( &now )
       s1 = now.tm_sec => 0x9
[Pass] MOD(s1-s0, 60) => 0x1
[Pass] MOD(s1-s0, 60) => 0x1
       m0 = MALLOC_FREE_MEMORY => 0x37940
[Pass] p = (void*)_malloc(50*1024) => 0x128628
[Pass] CACHEABLE(p) => 0x128628
       m1 = MALLOC_FREE_MEMORY => 0x2b130
       _free(p)
       m2 = MALLOC_FREE_MEMORY => 0x37940
[Pass] ABS((m0-m1) - 50*1024) => 0x10
[Pass] ABS(m0-m2) => 0x0
       m0 = GetFreeMemForAllocateMemory() => 0x2578c0
[Pass] p = (void*)_AllocateMemory(128*1024) => 0x9342f8
[Pass] CACHEABLE(p) => 0x9342f8
       m1 = GetFreeMemForAllocateMemory() => 0x2378b4
       _FreeMemory(p)
       m2 = GetFreeMemForAllocateMemory() => 0x2578c0
[Pass] ABS((m0-m1) - 128*1024) => 0xc
[Pass] ABS(m0-m2) => 0x0
       m01 = MALLOC_FREE_MEMORY => 0x37940
       m02 = GetFreeMemForAllocateMemory() => 0x2578c0
[Pass] p = (void*)_alloc_dma_memory(128*1024) => 0x40934338
[Pass] UNCACHEABLE(p) => 0x40934338
[Pass] CACHEABLE(p) => 0x934338
[Pass] UNCACHEABLE(CACHEABLE(p)) => 0x40934338
       _free_dma_memory(p)
[Pass] p = (void*)_shoot_malloc(16*1024*1024) => 0x4238c098
[Pass] UNCACHEABLE(p) => 0x4238c098
       _shoot_free(p)
       m11 = MALLOC_FREE_MEMORY => 0x37940
       m12 = GetFreeMemForAllocateMemory() => 0x257920
[Pass] ABS(m01-m11) => 0x0
[Pass] ABS(m02-m12) => 0x60
[Pass] suite = shoot_malloc_suite_contig(16*1024*1024) => 0x125340
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x1
[Pass] suite->size => 0x1000000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125368
[Pass] chunk->signature => 'MemChunk'
[Pass] chunk->size => 0x1000000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4238c094
[Pass] UNCACHEABLE(p) => 0x4238c094
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] suite = shoot_malloc_suite_contig(0) => 0x125340
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x1
[Pass] suite->size => 0x2000000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125368
[Pass] chunk->signature => 'MemChunk'
[Pass] chunk->size => 0x2000000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48c00064
[Pass] UNCACHEABLE(p) => 0x48c00064
       largest_shoot_block = suite->size => 0x2000000
[INFO] largest_shoot_block: 32MB
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] suite = shoot_malloc_suite(largest_shoot_block + 1024*1024) => 0x125340
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x2
[Pass] suite->size => 0x2100000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125368
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x1f84000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4238c094
[Pass] UNCACHEABLE(p) => 0x4238c094
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1253c8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x2100000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48c00064
[Pass] UNCACHEABLE(p) => 0x48c00064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x0
[Pass] total => 0x2100000
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] suite = shoot_malloc_suite(0) => 0x125340
[Pass] suite->signature => 'MemSuite'
[Pass] suite->num_chunks => 0x14
[Pass] suite->size => 0xf700000
[Pass] chunk = GetFirstChunkFromSuite(suite) => 0x125368
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x1f84000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4238c094
[Pass] UNCACHEABLE(p) => 0x4238c094
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1253c8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x3f84000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48c00064
[Pass] UNCACHEABLE(p) => 0x48c00064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125400
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4298000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4ac00070
[Pass] UNCACHEABLE(p) => 0x4ac00070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125438
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4380000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48b140e4
[Pass] UNCACHEABLE(p) => 0x48b140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125470
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4468000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x467140e4
[Pass] UNCACHEABLE(p) => 0x467140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1254a8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4550000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5c9140e4
[Pass] UNCACHEABLE(p) => 0x5c9140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1254e0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4638000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a5140e4
[Pass] UNCACHEABLE(p) => 0x5a5140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125518
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4720000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x581140e4
[Pass] UNCACHEABLE(p) => 0x581140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125550
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x4808000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x4af140e4
[Pass] UNCACHEABLE(p) => 0x4af140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125588
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x48f0000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x443140e4
[Pass] UNCACHEABLE(p) => 0x443140e4
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1255c0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x68f0000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x55e00064
[Pass] UNCACHEABLE(p) => 0x55e00064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1255f8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x6c04000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x57e00070
[Pass] UNCACHEABLE(p) => 0x57e00070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125630
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x8c04000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x58200064
[Pass] UNCACHEABLE(p) => 0x58200064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125668
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0x8f18000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a200070
[Pass] UNCACHEABLE(p) => 0x5a200070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1256a0
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xaf18000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5a600064
[Pass] UNCACHEABLE(p) => 0x5a600064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1256d8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xb22c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x5c600070
[Pass] UNCACHEABLE(p) => 0x5c600070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125710
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xd22c000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x44400064
[Pass] UNCACHEABLE(p) => 0x44400064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125748
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xd540000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x46400070
[Pass] UNCACHEABLE(p) => 0x46400070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x125780
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xf540000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x46800064
[Pass] UNCACHEABLE(p) => 0x46800064
       chunk = GetNextMemoryChunk(suite, chunk) => 0x1257b8
[Pass] chunk->signature => 'MemChunk'
[Pass] total += chunk->size => 0xf700000
[Pass] p = GetMemoryAddressOfMemoryChunk(chunk) => 0x48800070
[Pass] UNCACHEABLE(p) => 0x48800070
       chunk = GetNextMemoryChunk(suite, chunk) => 0x0
[Pass] total => 0xf700000
       shoot_free_suite(suite); suite = 0; chunk = 0;
[Pass] strlen("abc") => 0x3
[Pass] strlen("qwertyuiop") => 0xa
[Pass] strlen("") => 0x0
[Pass] strcpy(msg, "hi there") => 0x1ebeb4
[Pass] msg => 'hi there'
[Pass] snprintf(a, sizeof(a), "foo") => 0x3
[Pass] snprintf(b, sizeof(b), "foo") => 0x3
[Pass] strcmp(a, b) => 0x0
[Pass] snprintf(a, sizeof(a), "bar") => 0x3
[Pass] snprintf(b, sizeof(b), "baz") => 0x3
[Pass] strcmp(a, b) => 0xfffffff8
[Pass] snprintf(a, sizeof(a), "Display") => 0x7
[Pass] snprintf(b, sizeof(b), "Defishing") => 0x9
[Pass] strcmp(a, b) => 0x4
[Pass] snprintf(buf, 3, "%d", 1234) => 0x2
[Pass] buf => '12'
[Pass] memcpy(foo, bar, 6) => 0x1ebe80
[Pass] foo => 'asdfghuiop'
[Pass] memset(bar, '*', 5) => 0x1ebe60
[Pass] bar => '*****hjkl;'
       bzero32(bar + 5, 5)
[Pass] bar => '****'
       EngDrvOut(LCD_Palette[0], 0x1234)
[Pass] shamem_read(LCD_Palette[0]) => 0x1234
       call("TurnOnDisplay")
[Pass] DISPLAY_IS_ON => 0x1
       call("TurnOffDisplay")
[Pass] DISPLAY_IS_ON => 0x0
       call("TurnOnDisplay")
[Pass] DISPLAY_IS_ON => 0x1
       task_create("test", 0x1c, 0x1000, test_task, 0) => 0xde2200ee
[Pass] test_task_created => 0x1
[Pass] get_current_task_name() => 'run_test'
[Pass] get_task_name_from_id(current_task->taskId) => 'run_test'
[Pass] task_max => 0x84
[Pass] task_max => 0x84
[Pass] mq = mq ? mq : (void*)msg_queue_create("test", 5) => 0xde2400c6
[Pass] msg_queue_post(mq, 0x1234567) => 0x0
[Pass] msg_queue_receive(mq, (struct event **) &m, 500) => 0x0
[Pass] m => 0x1234567
[Pass] msg_queue_receive(mq, (struct event **) &m, 500) => 0x9
[Pass] sem = sem ? sem : create_named_semaphore("test", 1) => 0xde2602bc
[Pass] take_semaphore(sem, 500) => 0x0
[Pass] take_semaphore(sem, 500) => 0x9
[Pass] give_semaphore(sem) => 0x0
[Pass] take_semaphore(sem, 500) => 0x0
[Pass] give_semaphore(sem) => 0x0
[Pass] rlock = rlock ? rlock : CreateRecursiveLock(0) => 0xde2800b0
[Pass] AcquireRecursiveLock(rlock, 500) => 0x0
[Pass] AcquireRecursiveLock(rlock, 500) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0x0
[Pass] ReleaseRecursiveLock(rlock) => 0xf
       SetGUIRequestMode(1); msleep(1000);
[Pass] CURRENT_GUI_MODE => 0x1
       SetGUIRequestMode(2); msleep(1000);
[Pass] CURRENT_GUI_MODE => 0x2
       SetGUIRequestMode(0); msleep(1000);
[Pass] CURRENT_GUI_MODE => 0x0
[Pass] display_idle() => 0x1
       GUI_Control(BGMT_PLAY, 0, 0, 0); msleep(1000);
[Pass] PLAY_MODE => 0x1
[Pass] MENU_MODE => 0x0
       GUI_Control(BGMT_MENU, 0, 0, 0); msleep(1000);
[Pass] MENU_MODE => 0x1
[Pass] PLAY_MODE => 0x0
[Pass] dialog->type => 'DIALOG'
       GUI_Control(BGMT_MENU, 0, 0, 0); msleep(500);
[Pass] MENU_MODE => 0x0
[Pass] PLAY_MODE => 0x0
       SW1(1,100)
[Pass] HALFSHUTTER_PRESSED => 0x1
       SW1(0,100)
[Pass] HALFSHUTTER_PRESSED => 0x0
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x1
[Pass] is_pure_play_movie_mode() => 0x0
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x0
[Pass] is_pure_play_movie_mode() => 0x0
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x0
[Pass] is_pure_play_movie_mode() => 0x1
[Pass] is_play_mode() => 0x1
[Pass] is_pure_play_photo_mode() => 0x0
[Pass] is_pure_play_movie_mode() => 0x0
=========================================================
Test complete, 12810 passed, 10 failed.
.


luatest.log (no errors)
===============================================================================
ML/SCRIPTS/API_TEST.LUA - 2018-2-19 11:40:19
===============================================================================

Strict mode tests...
Strict mode tests passed.

Generic tests...
arg = table:
  [0] = "API_TEST.LUA"
camera = table:
  shutter = table:
    raw = 0
    apex = -7.
    ms = 0
    value = 0
  aperture = table:
    raw = 35
    apex = 3.375
    value = 3.2
    min = table:
      raw = 22
      apex = 1.75
      value = 1.8
    max = table:
      raw = 80
      apex = 9.
      value = 22.6
  iso = table:
    raw = 0
    apex = 0
    value = 0
  ec = table:
    raw = 0
    value = 0
  flash_ec = table:
    raw = 0
    value = 0
  kelvin = 6400
  mode = 2
  metering_mode = 3
  drive_mode = 19
  model = "Canon EOS 70D"
  model_short = "70D"
  firmware = "1.1.2"
  temperature = 161
  gui = table:
    menu = false
    play = false
    play_photo = false
    play_movie = false
    qr = false
    idle = true
  reboot = function: p
  wait = function: p
  burst = function: p
  bulb = function: p
  shoot = function: p
event = table:
  pre_shoot = nil
  post_shoot = nil
  shoot_task = nil
  seconds_clock = nil
  keypress = nil
  custom_picture_taking = nil
  intervalometer = nil
  config_save = nil
console = table:
  write = function: p
  hide = function: p
  clear = function: p
  show = function: p
lv = table:
  enabled = false
  paused = false
  running = false
  zoom = 1
  overlays = false
  pause = function: p
  wait = function: p
  start = function: p
  resume = function: p
  info = function: p
  stop = function: p
lens = table:
  name = "EF50mm f/1.8 STM"
  focal_length = 50
  focus_distance = 655350
  hyperfocal = 41218
  dof_near = 38790
  dof_far = 1000000
  af = true
  af_mode = 0
  autofocus = function: p
  focus = function: p
display = table:
  idle = nil
  height = 480
  width = 720
  off = function: p
  rect = function: p
  line = function: p
  print = function: p
  on = function: p
  notify_box = function: p
  screenshot = function: p
  draw = function: p
  pixel = function: p
  circle = function: p
  load = function: p
  clear = function: p
key = table:
  last = 10
  wait = function: p
  press = function: p
menu = table:
  visible = false
  close = function: p
  set = function: p
  new = function: p
  open = function: p
  block = function: p
  get = function: p
  select = function: p
movie = table:
  recording = false
  stop = function: p
  start = function: p
dryos = table:
  clock = 22
  ms_clock = 23010
  image_prefix = "IMG_"
  dcim_dir = table:
    exists = true
    create = function: p
    children = function: p
    files = function: p
    parent = table:
      exists = true
      create = function: p
      children = function: p
      files = function: p
      parent = table:
        exists = true
        create = function: p
        children = function: p
        files = function: p
        parent = nil
        path = "B:/"
      path = "B:/DCIM/"
    path = "B:/DCIM/100CANON/"
  config_dir = table:
    exists = true
    create = function: p
    children = function: p
    files = function: p
    parent = table:
      exists = true
      create = function: p
      children = function: p
      files = function: p
      parent = table:
        exists = true
        create = function: p
        children = function: p
        files = function: p
        parent = nil
        path = "B:/"
      path = "ML/"
    path = "ML/SETTINGS/"
  ml_card = table:
    cluster_size = 32768
    drive_letter = "B"
    file_number = 4848
    folder_number = 100
    free_space = 10832864
    type = "SD"
    _card_ptr = userdata
    path = "B:/"
  shooting_card = table:
    cluster_size = 32768
    drive_letter = "B"
    file_number = 4848
    folder_number = 100
    free_space = 10832864
    type = "SD"
    _card_ptr = userdata
    path = "B:/"
  date = table:
    year = 2018
    day = 19
    wday = 2
    min = 40
    sec = 21
    hour = 11
    yday = 50
    isdst = false
    month = 2
  remove = function: p
  rename = function: p
  directory = function: p
  call = function: p
interval = table:
  time = 10
  count = 0
  running = false
  stop = function: p
battery = table:
  level = 58
  id = 1
  performance = 0
  time = nil
  drain_rate = 21
task = table:
  create = function: p
  yield = function: p
property = table:
Generic tests completed.

Module tests...
Testing file I/O...
Copy test: autoexec.bin -> tmp.bin
Copy test OK
Append test: tmp.txt
Append test OK
Rename test: apple.txt -> banana.txt
Rename test OK
Rename test: apple.txt -> ML/banana.txt
Rename test OK
File I/O tests completed.

Testing Canon GUI functions...
Enter MENU mode...
Enter PLAY mode...
Enter MENU mode...
Exit MENU mode...
Start LiveView...
Enter MENU mode...
Exit MENU mode...
Enter PLAY mode...
Enter MENU mode...
Enter MENU mode...
Exit MENU mode...
Enter MENU mode...
Exit MENU mode...
Pause LiveView...
Enter MENU mode...
Enter MENU mode...
Exit MENU mode...
Enter PLAY mode...
Enter MENU mode...
Exit MENU mode...
Stop LiveView...
Enter PLAY mode...
Enter PLAY mode...
Enter MENU mode...
Enter MENU mode...
Enter MENU mode...
Exit MENU mode...
Start LiveView...
Pause LiveView...
Enter MENU mode...
Enter MENU mode...
Enter MENU mode...
Exit MENU mode...
Stop LiveView...
Enter PLAY mode...
Enter PLAY mode...
Exit PLAY mode...
Enter MENU mode...
Enter PLAY mode...
Exit PLAY mode...
Start LiveView...
Enter PLAY mode...
Enter MENU mode...
Enter MENU mode...
Exit MENU mode...
Stop LiveView...
Start LiveView...
Enter PLAY mode...
Enter PLAY mode...
Enter PLAY mode...
Enter MENU mode...
Enter PLAY mode...
Enter PLAY mode...
Exit PLAY mode...
Pause LiveView...
Enter PLAY mode...
Enter PLAY mode...
Enter PLAY mode...
Exit PLAY mode...
Pause LiveView...
Enter MENU mode...
Exit MENU mode...
Enter MENU mode...
Enter PLAY mode...
Exit PLAY mode...
Pause LiveView...
Resume LiveView...
Pause LiveView...
Resume LiveView...
Enter PLAY mode...
Enter MENU mode...
Enter PLAY mode...
Enter PLAY mode...
Enter MENU mode...
Exit MENU mode...
Pause LiveView...
Enter MENU mode...
Exit MENU mode...
Pause LiveView...
Enter PLAY mode...
Enter MENU mode...
Exit MENU mode...
Pause LiveView...
Enter MENU mode...
Canon GUI tests completed.

Testing ML menu API...
Menu tests completed.

Testing picture taking functions...
Please switch to M mode.
Snap simulation test...
Single picture...
B:/DCIM/100CANON/IMG_4849.CR2: 24961243
B:/DCIM/100CANON/IMG_4849.JPG not found.
Two burst pictures...
Ideally, the camera should be in some continuous shooting mode (not checked).
B:/DCIM/100CANON/ABC_4850.CR2: 24978453
B:/DCIM/100CANON/ABC_4850.JPG not found.
B:/DCIM/100CANON/ABC_4851.CR2: 25012699
B:/DCIM/100CANON/ABC_4851.JPG not found.
Bracketed pictures...
B:/DCIM/100CANON/IMG_4852.CR2: 32302711
B:/DCIM/100CANON/IMG_4852.JPG not found.
B:/DCIM/100CANON/IMG_4853.CR2: 24982746
B:/DCIM/100CANON/IMG_4853.JPG not found.
B:/DCIM/100CANON/IMG_4854.CR2: 14768124
B:/DCIM/100CANON/IMG_4854.JPG not found.
Bulb picture...
Elapsed time: 13240
B:/DCIM/100CANON/IMG_4855.CR2: 14472832
B:/DCIM/100CANON/IMG_4855.JPG not found.
Picture taking tests completed.

Testing multitasking...
Only one task allowed to interrupt...
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Main task yielding.
Task C started.
Task C finished.
Main task back.
Multitasking tests completed.

Testing half-shutter...
Half-shutter test OK.

Testing module 'lv'...
LiveView is running; stopping...
Starting LiveView...
Overlays: Canon
Overlays: Canon
Overlays: Canon
Overlays: ML
Overlays: ML
Overlays: disabled
Overlays: Canon
Overlays: Canon
Overlays: Canon
Overlays: Canon
Overlays: disabled
Overlays: ML
Overlays: disabled
Overlays: Canon
Overlays: Canon
Setting zoom to x1...
Setting zoom to x5...
Setting zoom to x10...
Setting zoom to x5...
Setting zoom to x1...
Setting zoom to x10...
Setting zoom to x1...
Pausing LiveView...
Resuming LiveView...
Stopping LiveView...
LiveView tests completed.


Testing lens focus functionality...
Autofocus outside LiveView...
Focus distance: 655350
Autofocus in LiveView...
Please trigger autofocus (half-shutter / AF-ON / * ).
19...18...17...16...Autofocus triggered.
Autofocus completed.
Focus distance: 655350
Focusing backward...
Focus distance: 655350
Focus motor position: 3094
Focusing forward with step size 3, wait=true...
.........................
Focus distance: 340
Focus motor position: 278
Focusing backward with step size 3, wait=true...
.........................
Focus distance: 655350
Focus motor position: 3094
Focus range: 25 steps forward, 25 steps backward.
Motor steps: 2816 forward, 2816 backward, 0 lost.
Focusing forward with step size 3, wait=false...
..........................................................
Focus distance: 340
Focus motor position: 278
Focusing backward with step size 3, wait=false...
.........................................................
Focus distance: 655350
Focus motor position: 3094
Focus range: 58 steps forward, 57 steps backward.
Motor steps: 2816 forward, 2816 backward, 0 lost.
Focusing forward with step size 2, wait=true...
...
Focus distance: 370
Focus motor position: 534
Focusing backward with step size 2, wait=true...
...
Focus distance: 655350
Focus motor position: 3094
Focus range: 164 steps forward, 164 steps backward.
Motor steps: 2560 forward, 2560 backward, 0 lost.
Focusing forward with step size 2, wait=false...
...
Focus distance: 340
Focus motor position: 278
Focusing backward with step size 2, wait=false...
...
Focus distance: 655350
Focus motor position: 3094
Focus range: 185 steps forward, 188 steps backward.
Motor steps: 2816 forward, 2816 backward, 0 lost.
Focusing forward with step size 1, wait=true...
...
Focus distance: 340
Focus motor position: 278
Focusing backward with step size 1, wait=true...
...
Focus distance: 655350
Focus motor position: 3094
Focus range: 1061 steps forward, 1062 steps backward.
Motor steps: 2816 forward, 2816 backward, 0 lost.
Focusing forward with step size 1, wait=false...
...
Focus distance: 340
Focus motor position: 278
Focusing backward with step size 1, wait=false...
...
Focus distance: 655350
Focus motor position: 3094
Focus range: 1061 steps forward, 1059 steps backward.
Motor steps: 2816 forward, 2816 backward, 0 lost.

Focus test completed.

Testing exposure settings...
Camera    : Canon EOS 70D (70D) 1.1.2
Lens      : EF50mm f/1.8 STM
Shoot mode: 3
Shutter   : ,5 (raw 75, 0.192776s, 193ms, apex 2.375)
Aperture  : 4.9 (raw 45, f/4.9, apex 4.625)
Av range  : 1.8..22 (raw 22..80, f/1.8..f/22.6, apex 1.75..9.)
ISO       : €1600 (raw 104, 1600, apex 9.)
EC        : 0.0 (raw 0, 0 EV)
Flash EC  : 0.0 (raw 0, 0 EV)
Setting shutter to random values...
Setting ISO to random values...
Setting aperture to random values...
Please switch to Av mode.
Setting EC to random values...
Setting Flash EC to random values...
Exposure tests completed.


Testing movie recording...
Please switch to Movie mode.
Movie recording tests completed.

Done! 


edit:
in memory benchmark it stops on memcpy cacheable (verifying) and red led shines
70D.112

ShootMeAlready

Quote from: andy kh on February 19, 2018, 10:32:51 AM
#shootmealready   im aware of the vaf but i don think i wil spend 295$ buying a filter. i bought a 70D sometime back since i love its auto focus and sold out my 650D since pink dots of 650D was annoying so much. shooting in crop mode in a 70D make its auto focus unusable. my question is do you also get moire like me when you shoot raw? or is it only me. i have seen some good raw video shoot with a 70D on youtube

I bought a  VAF shortly after buying my 70D, as I shoot in the city and find things like tiles, bricks, wires, and street car tracks everywhere and annoying to shoot around.  As for 3X mode, it has centre point AF, but mostly I would be using MF and flat pic profile for H264 (which on 70D is good for high ISO shooting), and 10bit raw for general clips (you can also shoot 3X mode raw for up to ISO800). I get moire without filter on, and not 3X.  RAW is very good but takes longer to process, so you have to consider turn around time.

AF is good for motion tracking, and pull focus.  So MF should be used most often, I find with the 70D you can over use touch focus which can lead to wandering focal plane for video. The more you want to control focus the less AF.
T3i+ML & 70D.112+ML, Tokina 11-16 2.8, Sigma 18-35 1.8, 50-150 II 2.8, 50 1.4, Canon 28 1.8, 35 2, 85 1.8 "Shoot Wide and Prosper"

hacki

Hi,

I've got a problem with a lua script. Tried on both nightly (magiclantern-Nightly.2018Feb17.70D112) and experimental (lua_fix.2018Feb24.70D112) builds

camera.shoot() behaves weird in live view mode. If i use it in a while loop or call it several times in a row it soft-locks the camera.

Screen stays black and nothing further happens, sometimes it continues in the script after 20, 30 seconds.

Is this a problem with live view in general (on all cameras), or some 70D specific quirk?
I couldnt find anything on it.




a1ex


-- shoot test
for i=1,50 do
  camera.shoot()
end


Runs fine on 60D. It slows down after a few pictures (buffer getting full), but does not lock up.

hacki

Okay, since seeing for yourself is better than a thousand word essay, i made two short videos about the behaviour:

This script:


--[[ 
TEST
--]]

   
testmenu = menu.new
{
parent = "Shoot",
name = "Test",
help = "Test",
submenu =
{
{
name = "Run",
help = "Run this script.",
icon_type = ICON_TYPE.ACTION,
update = "",
},
}
}

testmenu.submenu["Run"].select = function()
-- shoot test
for i=1,50 do
  camera.shoot()
end
end


Locks the camera up. Video:

https://youtu.be/QgQGYxUWV20


While this script:


--[[ 
TEST SINGLE SHOT
--]]

   
testmenu = menu.new
{
parent = "Shoot",
name = "Test",
help = "Test",
submenu =
{
{
name = "Run",
help = "Run this script.",
icon_type = ICON_TYPE.ACTION,
update = "",
},
}
}

testmenu.submenu["Run"].select = function()
  camera.shoot()
end


Works fine.

Video: https://www.youtube.com/watch?v=uU0iiB8xTGE


Now, i even tried adding a sleep like this:


for i=1,50 do
  camera.shoot()
          msleep(5000)
end


It locks up.

Even a simple


testmenu.submenu["Run"].select = function()
  camera.shoot()
  camera.shoot()
  camera.shoot()
end


Locks up.


It looks like camera.shoot() in live view locks something that only gets cleared when the LUA script ends?






xcalibr

Is the Audio Monitoring working? I installed ML perfectly fine, but don't see the Option to turn this feature on. I've run ML on my 60D for years so I'm fairly familiar, but I can't find this feature to activate on the 70D version. Any help and/or suggestions would be greatly appreciated. I'm running 1.1.2 Firmware also & installed the latest Build magiclantern-Nightly.2018Feb17.70D112. Thanks guys!

a1ex

Quote from: hacki on March 05, 2018, 06:47:38 PM
It looks like camera.shoot() in live view locks something that only gets cleared when the LUA script ends?

The "select" function is something executed when clicking the menu item, in the same task that handles other GUI events, so it should return quickly. I'm actually surprised it works that way, even for a simple picture.

You probably want to start a new task and run the sequence from there (see also this discussion). Or, to keep the event-driven programming style, use the shoot_task event (called periodically) and take the picture from there.

TODO: add a test to api_test.lua, as none of my scripts use it (so it might not even work). A standalone minimal example might be useful as well.

I prefer simple scripts that run on demand, just because I know how poorly the multitasking is implemented. I do miss some simple parameter support in simple scripts, as with CHDK (parameters defined as comments in the script header), but I'm not a heavy user of the scripting engine.

dfort

Hey 70D users.

There's a test that needs some 70D input here:

https://www.magiclantern.fm/forum/index.php?topic=5601.msg196632#msg196632

I made a special build from allocate-raw-lv-buffer branch that should work on the 70D for this test. You can find it on my downloads page. Follow the instruction on the post and the pull request and also check out what other users have posted.

We already have some values for this camera but it would be great to verify it with this new method.