Como usar o LED oculto do Moto Z Play

O Moto Z Play tem um LED próximo da câmera frontal que pode ser usado para notificações. Porém infelizmente você precisa de acesso ROOT para poder controlar este LED.

Encontrei alguns tutoriais explicando como fazer o desbloqueio e apesar do tutorial ser para Windows, consegui rodar no Linux usando o adb e fastboot que existem pra Linux.

Como desbloquear o bootloader de QUALQUER smartphone Motorola 2017:

Como fazer ROOT no Moto Z Play Android 7.0 ou superior:

Após seguir os tutoriais acima, instalei o aplicativo “Moto LED for Moto X & E [Root]” que NÃO FUNCIONA para receber notificações de aplicativos como o Whatsapp.

A solução foi usar aplicativo “Moto Led Enabler”:
https://play.google.com/store/apps/details?id=br.com.itsmeton.motoledenabler

O único problema deste programa é que ele tem “propagandas abusivas”, de resto funcionou bem!

Advertisements

3D File Format converter

There are many 3D file formats used for many applications from games to CAD design files, etc.

Some open-source software like Blender, FreeCAD, Meshlab, etc has native support to convert/export to many formats, and there are also some external plugins for these softwares to let them to export even for more formats.

But if you need a command line 3D file converter assimp is a good option:

http://assimp.sourceforge.net

But assimp still missing STEP and Parasolid format support. I think STEP became the defacto format to exchange 3D files between many CAD tools.

Converting Latitude to 32 bits

/*
 * Convert Latitude in DMS (Degrees Minutes Seconds) to 32-bit integer
 * between -162000000 and 162000000
 */

#include < stdio.h>

int main(void)
{
    int degree;
    int min;
    double sec;
    double frac_sec;

    printf("Inform the latitude in this format XXº YY\' ZZ.ABCD\"\n");

    printf("Type the value of the Degree (XX): ");
    scanf("%d", &degree);

    if (degree < -90 || degree > 90)
      {
          printf("The Degree value needs to be between -90 and 90!\n");
          return -1;
      }

    printf("Type the value of the Minute (YY): ");
    scanf("%d", &min);

    if (min < 0 || min > 59)
      {
          printf("The Minute value needs to be between 0 and 59!\n");
          return -1;
      }

    printf("Type the value of the Seconds (ZZ.ABCD): ");
    scanf("%lf", &sec);

    if (sec < 0 || sec >= 60)
      {
          printf("The Seconds value needs to be between 0 e 59.9999!\n");
          return -1;
      }

    printf("%02dº %02d\' %02f\"\n", degree, min, sec);

    /* Convert everything to seconds and add fraction of seconds */

    frac_sec  = degree * 60 * 60;
    frac_sec += (min * 60);
    frac_sec += sec;

    /* Multiply by 500 because the unit is in 1/500 seconds */

    frac_sec = frac_sec * 500;

    printf("Value converted = %d => 0x%08X!\n", (int) frac_sec, (int) frac_sec);

    return 0;
}    

 

Testing RedBoard Duo board

Today I received my RedBoard Duo board! This board can communicate with the Particle.io cloud and in fact it came with its firmware.

The board is just a little bit bigger than Particle Photon board. I missed a label near the SETUP and RESET button, it could make our life easier!

I started with the “Duo: Out-of-Box Experience” reading:

https://github.com/redbear/Duo/blob/master/docs/out_of_box_experience.md

It suggest to install the DuoApp, then I did it:

$ adb install DuoApp_0.2.0.apk

After installing I didn’t find it in the Android application (I was expecting a RED BEAR), then I decided to list all installed applications using this command:

$ adb shell 'pm list packages -f'

Ok, it listed many packages, including the package:

package:/data/app/net.redbear.redbearduo-1/base.apk=net.redbear.redbearduo

Then I started it manually:

$ adb shell monkey -p net.redbear.redbearduo -c android.intent.category.LAUNCHER 1

The application expects you are connected to WiFi of your RedBear board (i.e. Duo-xxxx) then it scans for you router WiFi and ask your password. Finally it configures your RedBear automatically and connects it to Particle cloud, the LED starts glowing in Cyan. If configuration over WiFi fails you can enable the Bluetooth and it will try to configure it using BLE.

When the configuration is done it will show some informations, like the IP that RedBear got from your WiFi router. You can access this IP in the browser to turn-on or turn-off the Blue LED of your board.

Programming Smoothieboard V2 Mini

I’m testing the Smoothieboard V2 Mini

The JP10 (BOOT2) is in the position 0 (tied to ground) because I will program it using SWD instead using the LPCScript DFU/bootloader.

First we need to clone the repositories:

$ git clone https://github.com/Smoothieware/smoothie-nuttx
$ git clone https://github.com/Smoothieware/smoothie-v2

Enter inside “smoothie-nuttx” and compile the nuttx for smoothie v2 mini alpha:

$ cd smoothie-nuttx
$ cd nuttx
$ cd tools
$ ./configure.sh smoothiev2-mini-alpha/smoothiedev
$ cd ..
$ make export
...
CC:  lpc43_ostest.c
CC:  lpc43_autoleds.c
CC:  lpc43_timer.c
AR:   lpc43_boot.o lpc43_appinit.o lpc43_mmcsd.o lpc43_highpri.o lpc43_ostest.o lpc43_autoleds.o lpc43_timer.o 
make[2]: Leaving directory '/smoothie-nuttx/nuttx/configs/smoothiev2-mini-alpha/src'
make[1]: Leaving directory '/smoothie-nuttx/nuttx/arch/arm/src'

Just confirm the the file “nuttx-export.zip” was created correctly:

$ ls -l nuttx-export.zip 
-rw-rw-r-- 1 alan alan 2932905 Set  3 20:00 nuttx-export.zip

We need to copy this file to smoothie-v2 directory to compile the final firmware:

$ cp nuttx-export.zip ../../smoothie-v2/Firmware/

Then go to there and decompress the nuttx-export:

$ cd ../../smoothie-v2/Firmware/
$ unzip nuttx-export.zip
...
  inflating: nuttx-export/include/machine/_types.h  
  inflating: nuttx-export/include/machine/ieeefp.h  
  inflating: nuttx-export/include/math.h

Case you are using a version of gcc crosscompiler different from 6.3.1:

$ arm-none-eabi-gcc -v
...
Thread model: single
gcc version 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437] (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 

Then you need to export the variable the “ARMVERSION” with your version, see the Rakefile for more info.

We can compile the Unit Tests just executing:

$ rake testing=1
...
Compiling /tmp/smoothie-v2/Firmware/TestUnits/TEST_timer1.cpp for Bambino
Compiling /tmp/smoothie-v2/Firmware/TestUnits/main.cpp for Bambino
Linking for Bambino
   text	   data	    bss	    dec	    hex	filename
 394553	   1128	  11800	 407481	  637b9	smoothiev2_Bambino/smoothiev2.elf

Finally enter inside “smoothiev2_Bambino” and flash the firmware.

I’m using a STLink-v2 clone (low cost: about U$ 2.00) with only three pins: SWDIO, SWCLK and GND connected to JTAG header of the board:

$ cd smoothiev2_Bambino
$ sudo openocd -f interface/stlink-v2.cfg -f target/lpc4330.cfg -c init -c "reset halt" -c "flash write_image erase smoothiev2.bin 0x14000000"
Open On-Chip Debugger 0.10.0+dev-00172-g7719e96 (2017-08-24-16:57)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '.
adapter speed: 500 kHz
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : clock speed 480 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.270400
Info : lpc4350.m4: hardware has 6 breakpoints, 4 watchpoints
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x10402c40 msp: 0x10087ff0
auto erase enabled
Info : Found flash device 'win w25q64cv' (ID 0x001740ef)
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x10000154 msp: 0x10087ff0
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x10000198 msp: 0x10087ff0
wrote 458752 bytes from file smoothiev2.bin in 12.150717s (36.870 KiB/s)

Connect the serial console and you will get:


Starting tests...
There are 35 registered tests...
  PlannerQueue-basic
  PlannerQueue-iteration
  ConfigTest-get_sections
  ConfigTest-load_section
  ConfigTest-load_sub_sections
  Dispatcher-check_callbacks
  Dispatcher-Remove_second_G1_handler
  Dispatcher-one_off_dispatch
  GCodeTest-basic
  GCodeTest-subcode
  GCodeTest-copy
  GCodeTest-Multiple_commands_on_line_no_spaces
  GCodeTest-Modal_G1_and_comments
  GCodeTest-Line_numbers_and_checksums
  MemoryTest-stats
  MemoryTest-AHBn
  Module-single_module
  Module-single_module_destructed
  Module-multi_module
  SDCardTest-mount
  SDCardTest-directory
  SDCardTest-write_read
  SDCardTest-read_config_init
  SDCardTest-unmount
  SlowTicker-test_20_hz
  SlowTicker-test_10_hz
  StreamsTest-stringstream
  StreamsTest-cout
  StreamsTest-OutputStream_null
  StreamsTest-OutputStream_sstream
  StreamsTest-OutputStream_fdstream
  StreamsTest-OutputStream_prependok
  StreamsTest-OutputStream_long_line
  TimeTest-delta_ik
  TimerTest-test_20_hz
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_PlannerQueue.cpp:7:PlannerQueue-basic:PAS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_PlannerQueue.cpp:53:PlannerQueue-iteratiS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_config.cpp:15:ConfigTest-get_sections:PAS
[(enable, false)]
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_config.cpp:31:ConfigTest-load_section:PAS
elapsed time 20000 us
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_config.cpp:51:ConfigTest-load_sub_sectioS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_dispatch.cpp:51:Dispatcher-check_callbacS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_dispatch.cpp:78:Dispatcher-Remove_secondS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_dispatch.cpp:91:Dispatcher-one_off_dispaS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:7:GCodeTest-basic:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:31:GCodeTest-subcode:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:52:GCodeTest-copy:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:80:GCodeTest-Multiple_commandsS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:100:GCodeTest-Modal_G1_and_comS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:118:GCodeTest-Line_numbers_andS
             total       used       free    largest
Mem:        191152      41840     149312     115232
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_mem.cpp:7:MemoryTest-stats:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_mem.cpp:16:MemoryTest-AHBn:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_module.cpp:18:Module-single_module:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_module.cpp:40:Module-single_module_destrS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_module.cpp:62:Module-multi_module:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_sdcard.cpp:26:SDCardTest-mount:FAIL: Exp1

-----------------------
20 Tests 1 Failures 0 Ignored 
FAIL
Done