Integrating LTE Device EM7565 into Raspberry Pi 3

Bring up Raspberry Pi

To bring up your Raspberry Pi (my Pi is version 3 B) please follow the below link:

How to bring up Pi using NOOS

Download Siera Wireless Linux drivers

I am going to integrate the EM7565 LTE device into my Raspberry Pi ver 3 B. So I would next like to download the Linux for the device. The recommended drivers are available from SieraWireless website. You might need to create a account with them. Check with your vendor dor the details of the account and then check where to find the driver links etc. In my case the driver archives were located here.

Cross Compile the Linux drivers

After you have successfully downloaded the linux drivers in the previous step, you should have a SierraLinuxQMIdriversS2.35N2.54.tar.bz2 file in your Download folder. In my case it is located at the default Download folder called ~/Download/SierraLinuxQMIdriversS2.35N2.54.tar.bz2. Extract this file with the below command:

Now, do a ls to see what you have got after extracting the driver archive.

$ ls -la 
total 128
drwxr-xr-x  4 vbhadra vbhadra  4096 Nov 21 05:58 .
drwxr-xr-x 29 vbhadra vbhadra 28672 Feb 26 14:37 ..
drwxr-xr-x  2 vbhadra vbhadra  4096 Nov 21 05:59 GobiNet
drwxr-xr-x  2 vbhadra vbhadra  4096 Nov 21 05:59 GobiSerial

So in my case two folder have been created GobiNet and GobiSerial. GobiNet would emulate the device as a serial (actually it emulates as 3 usb serial device, ttyUBB0, ttyUSB1, ttyUSB2) and GobiNet handles the data packets like a linux network driver. What you need to do is to cross compile these two drivers and then take the .ko files for both the driver to the Rasp Pi and dynamically insert those into the running kernel inside the Pi.

For cross compiling the drivers you may follow the instructions in the below:

How to cross compile Gobi drivers.

Transfer the Driver .ko files to Raspberry Pi

Attach the SD card to your Linux PC. Copy the .ko driver images into the sd card and then un-mount it as below:

vbhadra@vbhadra-8200-elit-convertable-microtower:~/rpi/GobiNet$ mount
...
...
/dev/sdb1 on /media/vbhadra/7EFE-4409 type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

~/rpi/GobiNet$ cp GobiNet.ko /media/vbhadra/7EFE-4409/.
~/rpi/GobiSerial$ cp GobiSerial.ko /media/vbhadra/7EFE-4409/.
~/rpi/GobiNet$ umount /media/vbhadra/7EFE-4409

Now, take out the SD card from your local Linux PC and attach it to the Pi. Once attached Pi should detect it automatically. It is by default mounted under:

/media/pi/<sd card label>

I usually mount it in a more easier location. Like in the below commands I am mounting it in my home directory under a folder named usb:

pi@raspberrypi:~ $ mkdir usb
pi@raspberrypi:~ $ mount -t vfat /dev/sda1 usb/
pi@raspberrypi:~ $ ls usb/
 20-02-2020   detect_practice2.nnb   GobiNet_pi_build.ko   log_02142020_01.txt             log.txt            Makefile_GobiSerial   Pi              'System Volume Information'
 2.ppm        GobiNet.ko             GobiSerial.ko         log_02142020_over_weekend.txt   Makefile_GobiNet   myobject              scratchpad.txt

In the above case the SD card has been mounted by Pi kernel under /dev/sda and /dev/sda1 is the partition which I am mounting. It could be mounted by kernel under /dev/sdb, /dev/sdc… etc as well. If you are not sure, you can check with dmesg command.

Now, for EM7565 device and Gobi* drivers it is recommended that you disable two linux’s default drivers: qcserial and qmi_wwan, as these may interfere in the operation of the Gobi* drivers. To do that you have add the below two lines in the following file:

pi@raspberrypi:~ $ sudo touch /etc/modprobe.d/blacklist-modem.conf
pi@raspberrypi:~ $ sudo vim.tiny /etc/modprobe.d/blacklist-modem.conf
blacklist qcserial
blacklist qmi_wwan

Now, do a reboot of the Rasberry Pi system.

pi@raspberrypi:~ $ sudo shutdown -r now

Once it come back do the following:

pi@raspberrypi:~ $ export OUTPUTDIR=/lib/modules/`uname -r`/kernel/drivers/net/usb/
pi@raspberrypi:~ $ cp ~/usb/GobiNet.ko $OUTPUTDIR 
pi@raspberrypi:~ $ sudo cp ~/usb/GobiSerial.ko $OUTPUTDIR
pi@raspberrypi:~ $ sudo depmod
pi@raspberrypi:~ $ modprobe GobiSerial 
pi@raspberrypi:~ $ sudo modprobe GobiNet 
pi@raspberrypi:~ $ dmesg | grep -i "Gobi*"
[  318.763626] GobiSerial: loading out-of-tree module taints kernel.
[  318.764822] usbcore: registered new interface driver GobiSerial
[  318.764895] usbserial: USB Serial support registered for GobiSerial
[  318.764920] GobiSerial: 2019-11-22/SWI_2.39:GobiSerial
[  593.404829] GobiNet: 2019-11-22/SWI_2.60
[  593.405285] usbcore: registered new interface driver GobiNet

As you can see the Gobi* drivers have now been insmod-ed into the Pi linux kernel.

You can check the dmesg logs to confirm yours. Last few lines of your log file should look like the above.

Now, check if there has been any emulated ttyUSB nodes created with the below command:

pi@raspberrypi:~ $ dmesg | grep -i "ttyUSB*"
pi@raspberrypi:~ $ 

As you can see in my case there is still no ttyUSB* device node created.

The GobiSerial driver will create 3 ttyUSB* nodes as soon as you attach the device into the USB port. If it doesn’t, something is not quite right.

Attach the EM7565 LTE device to the USB port of the RaspPi

Now, attach your LTE EM7565 device to the Raspberry Pi USB port. It looks like the below in my setup:

Once you attach the device to the USB port, go back to your Pi console and type the below command and notice the outputs, it should look something like the below as I can see in my console:

pi@raspberrypi:~ $ dmesg
[64326.392221] Under-voltage detected! (0x00050005)
[64332.632157] Voltage normalised (0x00000000)
[64336.052097] usb 1-1.2: new high-speed USB device number 10 using dwc_otg
[64336.182652] usb 1-1.2: config 1 has an invalid interface number: 8 but max is 3
[64336.182670] usb 1-1.2: config 1 has no interface number 1
[64336.183359] usb 1-1.2: New USB device found, idVendor=1199, idProduct=9091, bcdDevice= 0.06
[64336.183371] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[64336.183381] usb 1-1.2: Product: Sierra Wireless EM7565 Qualcomm® Snapdragon™ X16 LTE-A
[64336.183391] usb 1-1.2: Manufacturer: Sierra Wireless, Incorporated
[64336.183400] usb 1-1.2: SerialNumber: UF92377624041506
[64336.184899] GobiSerial 1-1.2:1.0: GobiSerial converter detected
[64336.185236] usb 1-1.2: GobiSerial converter now attached to ttyUSB0
[64336.185902] GobiSerial 1-1.2:1.2: GobiSerial converter detected
[64336.186381] usb 1-1.2: GobiSerial converter now attached to ttyUSB1
[64336.187548] GobiSerial 1-1.2:1.3: GobiSerial converter detected
[64336.188063] usb 1-1.2: GobiSerial converter now attached to ttyUSB2
[64336.188763] QMAP Disabled
[64336.190634] GobiNet 1-1.2:1.8 eth1: register 'GobiNet' at usb-3f980000.usb-1.2, GobiNet Ethernet Device, 0a:af:20:e2:05:08
[64336.191368] USB Speed : USB 2.0
[64336.291051] usbcore: registered new interface driver cdc_wdm
[64336.294292] usbcore: registered new interface driver qmi_wwan
[64336.433554] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
[64357.572160] creating qcqmi0
[64357.572495] RawIP mode

Notice the below line, which obviously indicates the SieraWireless device EM7565 has been detected by the Kernel:

[64336.183391] usb 1-1.2: Manufacturer: Sierra Wireless, Incorporated

Also, notice that the GobiSerial driver is in action, and has created 3 different emulated USB ports, ttyUSB0, ttyUSB1 and ttyUSB2. The most important one at this point is the ttyUSB2 which we will need in a minute for issuing AT commands to configure the device.

[64336.184899] GobiSerial 1-1.2:1.0: GobiSerial converter detected
[64336.185236] usb 1-1.2: GobiSerial converter now attached to ttyUSB0
[64336.185902] GobiSerial 1-1.2:1.2: GobiSerial converter detected
[64336.186381] usb 1-1.2: GobiSerial converter now attached to ttyUSB1
[64336.187548] GobiSerial 1-1.2:1.3: GobiSerial converter detected
[64336.188063] usb 1-1.2: GobiSerial converter now attached to ttyUSB2

You can also double check the ttyUSB* ports with the blow command:

pi@raspberrypi:~ $ dmesg | grep -i "ttyUSB*" 
[64336.185236] usb 1-1.2: GobiSerial converter now attached to ttyUSB0
[64336.186381] usb 1-1.2: GobiSerial converter now attached to ttyUSB1
[64336.188063] usb 1-1.2: GobiSerial converter now attached to ttyUSB2

Also, note that the GobiNet driver is in action and has created an ethernet interface eth1 for data exchange as can be evident in the below log lines:

[64336.190634] GobiNet 1-1.2:1.8 eth1: register 'GobiNet' at usb-3f980000.usb-1.2, GobiNet Ethernet Device, 0a:af:20:e2:05:08
[64336.191368] USB Speed : USB 2.0

At this point we will open yet another terminal on the console and move there to open a serial communication channel with the device. But just to be vigilant on what’s going on the kernel log I do this on the current console:

pi@raspberrypi:~ $ tail -f /var/log/messages 
Sep 26 21:29:49 raspberrypi kernel: [64336.294292] usbcore: registered new interface driver qmi_wwan
Sep 26 21:29:49 raspberrypi mtp-probe: checking bus 1, device 10: "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2"
Sep 26 21:29:49 raspberrypi mtp-probe: bus: 1, device: 10 was not an MTP device
Sep 26 21:29:49 raspberrypi kernel: [64336.433554] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
Sep 26 21:30:10 raspberrypi kernel: [64357.572160] creating qcqmi0
Sep 26 21:30:10 raspberrypi kernel: [64357.572495] RawIP mode

As you can see the new ethernet interface eth1 is not yet ready:

Sep 26 21:29:49 raspberrypi kernel: [64336.433554] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready

To check this let’s try another command to see what is the status of the eth1 interface:

pi@raspberrypi:~ $ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:37:67:e0  txqueuelen 1000  (Ethernet)
        RX packets 306  bytes 353615 (345.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 172  bytes 17176 (16.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4227<UP,BROADCAST,NOARP,MULTICAST>  mtu 1500
        ether 0a:af:20:e2:05:08  txqueuelen 1000  (Ethernet)
        RX packets 22397  bytes 24982435 (23.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12996  bytes 1190453 (1.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:62:32:b5  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Notice in the above command the eth1 ethernet interface doesn’t have any IP assigned yet which is in line with our anticipation as we have not configured the device yet:

eth1: flags=4227 mtu 1500
ether 0a:af:20:e2:05:08 txqueuelen 1000 (Ethernet)
RX packets 22397 bytes 24982435 (23.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12996 bytes 1190453 (1.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Open serial terminal

Now, open another terminal window and move there. To open a serial port I prefer minicom which doesn’t come with my installation of NOOBS. So there is no minicom at this point in my Pi. I luckily had a ethernet line coming to my desk. Hence, I connected that and installed minicom as below:

pi@raspberrypi:~ $ sudo apt-get install minicom 

Need to find a way to install minicom if you want to use it. But maybe you can try miniterm. I am not sure and haven’t tried it at all. I will it to you to resolve. Once you have minicom (or any other terminal emulator of you choice), configure it as below:

Serial Device      : /dev/ttyUSB2                           Bps/Par/Bits       : 115200 8N1                             Hardware Flow Control : Yes                                 Software Flow Control : No                                   

Configure the device

In the serial console type the below commands:

Welcome to minicom 2.7.1

OPTIONS: I18n                                                                
Compiled on Aug 13 2017, 15:25:34.                                           
Port /dev/ttyUSB2                                                            
                                                                             
Press CTRL-A Z for help on special keys                                                                                                                   
ati                                                                          
Manufacturer: Sierra Wireless, Incorporated                                  
Model: EM7565                                                                
Revision: xxxx_01.08.04.00 xxx jenkins 2018/08/21 21:40:11            
IMEI: 353533100239139                                                        
IMEI SV:  8                             
FSN: XXXXXXXX                     
+GCAP: +CGSM                            
                                                                                
OK                                      
at+creg?
+CREG: 0,1

OK
at+cgreg?
+CGREG: 0,1

You need to find out your device manufacturer’s AT commands. It usually follows the same set of commands. However, it may vary from vendor to vendor. So check with them. As in the above you can the device manufacturer’s details and the firmware details are being displayed with the ati command. Below are few other commands which you can try as well:

at+cgdcont?
+CGDCONT: 1,"IPV4V6","","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,0

Insert a SIM

At this point I will insert an appropriate SIM into the device’s SIM slot.

Once you have inserted the SIM into the device slot go back to your minicom terminal and issue the below commands:

OK                                      
at+creg?
+CREG: 0,1

OK
at+cgreg?
+CGREG: 0,1

OK
at+cgdcont?
+CGDCONT: 1,"IPV4V6","","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,0

OK
at!scact=1,1
OK

at+cgdcont=1,"IPV4V6","wap.vodafone.co.uk" 
OK
at+cgdcont?
+CGDCONT: 1,"IPV4V6","wap.vodafone.co.uk","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,0

OK
at!scact=1,1

At this point you should have internet connectivity at you Rasp Pi. Try openning google.co.uk or something else and have fun. At the moment I am experimenting with the device and will possibly add on stuffs here. So watch this space.

Format a micro SD card using gparted utility

For formatting the micro SD card I usually use the gparted utility in Ubuntu. Format the micro SD with FAT 32 filesystem format. You need to have a SD card reader for attaching the SD card to the PC. I use the below SD card and the reader for my purposes:

Once you have attached your SD card with the linux PC you are ready to format it. I am using a Ubuntu PC for my purposes. Go to the console and run the below command:

~$ sudo gparted

Screenshot from 2020-02-11 16-58-29

What we are up to is delete everything in the SD card and get it ready for the NOOBS.

By default the gparted selects your hard drive (/dev/sda is actually your hard drive, did you know!).

Be very cautious, not to play around with your hard drive partitions, you might soon get into a funny situation.

Go to the top right corner of the gparted screen and change the drive from /dev/sda to /dev/sdb (if there are no other media attached to the PC). Look at the various field carefully and try to understand what they are. I cannot go into the details of all the fields here. I can see the below in my SD card (/dev/sdb) at the moment:

Screenshot from 2020-02-11 17-02-31

You can also see the same partitions with lsblk command on the console, I can see the below:

sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
└─sda2 8:2 0 465.3G 0 part /
sdb 8:16 1 29.7G 0 disk
├─sdb1 8:17 1 2.4G 0 part
├─sdb2 8:18 1 1K 0 part
├─sdb5 8:21 1 32M 0 part
├─sdb6 8:22 1 256M 0 part
└─sdb7 8:23 1 27.1G 0 part

As you can see above the SD card has in total 5 partitions /dev/sdb1, /dev/sdb2, /dev/sdb5, /dev/sdb6, /dev/sdb7. I want to get rid of all of these. So what I do in gparted screen is to: Select/highlight each partition. Right click, and then Unmount. Once the selected/highlighted partition has been Unmounted, right click and Delete it. Unmount and Delete each of these partitions in the SD card. Now Click on the green Tick at the top of the gparted screen and Apply. At this point you would have unallocated partition like this:

Screenshot from 2020-02-11 17-09-51
Click on the Tick (Apply) button as above

Right click on the Unallocated partition and click on New. Leave everything as default except Filesystems as FAT32, the default is ext4.

Screenshot from 2020-02-11 17-11-49

After changing the file systems type it should look like the below:

Screenshot from 2020-02-11 17-13-02

Click Add. Then again click on the green Tick button at the top, then Apply. Once done, you should see something like the below:

Screenshot from 2020-02-11 17-14-07
Click on the Apply button
Click on Apply button
It looks like this in my PC

Once it is finished, close gparted and go back to your favorite file browser and locate the SD card, in my case it shows something like the below, an empty drive:

Screenshot from 2020-02-11 17-15-44

Now your SD card is formatted with FAT32 filesystem format.

Bringing up Rasberry Pi 3 with NOOBS

Getting Rasberry Pi up and running

I am using a NOOB version for getting up and running with the Rasberry Pi. The version of my Raspberry Pi is 3 Model B (see below):

20200211_163448

Format a micro SD card

You will possibly need to format a SD Card (if you are not lucky and have one already formatted properly for NOOBS). To format an SD Card I usually prefer gparted. I will format my SD card in FAT32 format for NOOBS. I prefer gparted for formatting media cards. You may follow the instructions in the below tutorial to use gparted if you like:

Get hold of NOOBS

To download an official distribution of NOOBS, go to the below link:

noobs

Click on the Download ZIP and you will get the latest vesion of the NOOBS. Or if you need a different NOOBS version other than the latest, you can get a copy of that in the below link:

http://downloads.raspberrypi.org/NOOBS/images/

For my purposes I have download the NOOBS_v3_2_1 version (hence, I go a NOOBS_v3_2_1.zip file in my ~/Download/ folder) from the above link. Choose the one you want and locate the zip file in your local machine.

Extract the zip file

Once you have downloaded the NOOB version you want, extract the NOOBS and you should have a folder called something like NOOBS_*_*. In my case it is NOOBS_v3_2_1. Go inside the folder using your file browser, select and copy everything (Ctrl-A, Ctr-C). Go back to the SD card and do a Ctrl-V. This will copy and paste everything that the NOOBS_v3_2_1 had into the SD card.

Be patient, it takes a while to copy the stuffs across into the SD card. I often make mistake of prematurely eject the drive and nothing works. So please be patient! There is a circular progress bar at the top on the file browser window which shows the progress of the copy (see the picture below), if you have not already noticed.

Once everything copied into the SD card, safely eject the drive and insert it into the SD card slot in Pi.

20200211_172622

Now, connect the below to the Pi:

  1. A keyboard.
  2. A monitor/TV
  3. A mouse (very useful)
  4. Connect the Pi using micro USB cable to the PC to power it up.

Once you have powered the Pi, the NOOBS will take care of booting the device and soon you should see something like this on the Monitor:

20200211_173226

Select the Raspberry Pi Full option from the menu shown above. You will require at least ~8GB I guess. Other option is to select the LibreELEC_RPi2 which I won’t recommend at this point. After you select one option from the menu, the “install” button will get activated. Click on Install. See the below pictures for reference:

Once you have clicked on the Install the installation starts:

20200211_173842

Wait for the installation to finish. After the installation the setup wizard comes up, follow the screens and setup the Country, Language and Timezone etc. Keep the default user account ‘pi‘ and password ‘raspberry‘. It may ask for restart, do restart.

Useful git command for developers

Git log

git log --pretty=format:"%h%x09%an%x09%ad%x09%s"

Adding it to the bash script

echo "alias gitl='git log --pretty=format:"%h%x09%an%x09%ad%x09%s"'" >> ~/.bashrc
source ~/.bashrc

From now on you can type:

gitl
3918a7c8        Vivek Bhadra    Wed Oct 23 14:02:16 2019 +0100  Integrating the esp8266 wifi module in SPRESENSE sdk.
cbce5ee6        Vivek Bhadra    Tue Oct 22 13:16:11 2019 +0100  Fixes.
d4fc23c7        Vivek Bhadra    Wed Oct 16 16:01:03 2019 +0100  Enhanced camera App for better user interactivity.
6cc05f93        Vivek Bhadra    Wed Oct 16 13:47:02 2019 +0100  Customized for delayed capture of 1 mins.

and see the formatted git log, change the format as you would like.

Checking your current git branch

git branch -av

Add it to the .bashrc

echo "alias gitb='git branch -av'" >> ~/.bashrc
source ~/.bashrc

Type:

gitb
* customize_for_12_demo             3918a7c8 Integrating the esp8266 wifi module in XYZ sdk.
  master                            ee8f2ddf Merge pull request #41 from XXX/release-v1.4.1
  remotes/origin/HEAD               -> origin/master
  remotes/origin/auto_build_doxygen a5681292 Updated readme and only build doc from master
  remotes/origin/master             ee8f2ddf Merge pull request #41 from XXX/release-v1.4.1
  remotes/origin/release_1.0.1      ec7f3dab Release tag XYZ_1.0.001 YYY.0.001 release.

on the console to check the git branch you are on.

Creating a patch from multiple commits

git format-patch -x --stdout > patch-ddmmyyy.patch
git format-patch --ignore-space-change --ignore-space-at-eol --ignore-all-space -n --stdout > ~/patch4-LH3-18466-19092019.patch

where n is the number of commits you want to get back.
–ignore-space-change
–ignore-space-at-eol
–ignore-all-space
the above options are self-explanatory.

How to remove untracked files in git?

  • Print out the list of files which will be removed (dry run)
git clean -n
  • Delete the untracked files from the repository
git clean -f

How to not display the untracked files with git status?

git status --untracked-files=no

or


git status -uno

Renaming a local branch in command line

switch to the branch you want to rename

git checkout branch-name

Then rename it as below:

git branch -m new-name

Introduction to Arduino

Install the arduino IDE
1. https://www.arduino.cc/en/Main/Software/
2. Select Linux 64 bit
3. Click Just Download

Unzip the downloaded file as below:
vbhadra@jupiter:~/Downloads$ tar -xf arduino-1.8.10-linux64.tar.xz

Run the arduino IDE
vbhadra@jupiter:~/Downloads$ cd arduino-1.8.10/
vbhadra@jupiter:~/Downloads/arduino-1.8.10$ ./arduino

Configure
1. Tools -> Board -> Board -> Arduino/Genuino Uno
Tools -> Port -> /dev/ttyACM0

Installing and uninstalling .zip user libraries in Arduino IDE
Install
Sketch -> Include Library -> Add .zip library
Uninstall
$ find ~/ -type d -iname Arduino
./Arduino
$ ls -la Arduino/
drwx—— 4 vbhadra vbhadra 4096 Oct 1 11:31 libraries
$ ls -la Arduino/libraries/
readme.txt xxxLPWA/ Vivek/

Remove the library folder you want to uninstall
$ sudo rm -rf Arduino/libraries/xxxLPWA/

Then modify your library code, create a .zip file and install it again.

Compile & verify the code
Sketch -> Verify & Compile
You should see “Done compiling”

Upload the code
Sketch -> Upload
You should see “Done Uploading”.

Troubleshooting
1. Issue 1:
An error occurred while uploading the sketchavrdude: ser_open(): can’t open device “/dev/ttyACM0”: Permission denied

-> Check if the port exist on the linux machine:

ls -l /dev/ttyACM*

-> Change the permission of the port as below:
sudo chmod a+rw /dev/ttyACM0

2. Junk characters in serial port

void setup()
{
  Serial.begin(9600);
  Serial.write("Hello World");
}

3. Mounting the SD card into the /mnt

mount -t vfat /dev/mmcsd0 /mnt

How to work in private branch in GIT

Time to time we have to work on source code which are downloaded from a git repository, modify the code, implement the functionality, test it, get the code reviewed and then push it up to the repository. Now, how do we achieve this with the following in mind:

1. I do not want to do a git pull on my local source code base frequently simply because it is cumbersome.

2. I however, want to catch up with the mainline code (let’s call it master branch) so that when I am ready to push the code up I do not have enormous amount of merge conflicts, or conflicting other features which somehow difficult to accommodate at the last minute. So to avoid any surprise I would like to catch up with the mainline (be it master branch)  time to time (I do it one a week at least).

3. I do not want to use merge command to catch up with the mainline code as it messes up with the git log.

All these points in mind I would recommend the below working principle:

1. git clone <git repository>

2. git checkout <branch name> (or by default you maybe already in the master branch. This would depend from source code to source code or repository to repository, so better check where you want to base your implementation.)

3. Now, after the above step 2, we are sitting at the branch where we want to start our implementation/bug fixing etc. Let’s call this “master” branch.

4. I would now like to create my private branch called “my_private”. To create a private branch do the below:

git checkout -b my_private

5. Now carry on with your implementations.

Multiple commits in private branch

While developing a new feature you might like to do it in a incremental way, i.e. when a little milestone is achieved you may like to commit it before carrying further. To do this do the below:

git add <file names>

git commit -m “commit message”

Now, if you carry on like this you would end up with multiple commits on your private branch. However, for doing review and pushing it up, it would be nice if all your changes/new implementations comes under one single commit. To achieve this you can use git interactive rebase command as below:

git rebase -i HEAD~n

where n stands for the number of commits (from the latest commits) to be included in the single commit.

This will bring up a screen which will look like as below:


pick 794969c79 Revert all commits that comprise 10x feature
pick 808bc82dd Added database version and product code into DiagnosticsPresenter.
pick 0b4d6973c Implementing Recent Tab
pick 0c284d078 Implementing Recent Tab

# Rebase 75ff6ea39..1f778b29d onto 75ff6ea39 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Leave the first pick but convert the second and all other picks to squash as below:


pick 794969c79 Revert all commits that comprise 10x feature
squash 808bc82dd Added database version and product code into DiagnosticsPresenter.
squash 0b4d6973c Implementing Recent Tab
squash 0c284d078 Implementing Recent Tab

# Rebase 75ff6ea39..1f778b29d onto 75ff6ea39 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Write and save, and you will be presented with the screen where you can decide what you would like to have as the new single commit message. Save and exit and you would have all your local commits squished into one single commit as below:


107b084c0 vbhadra Mon Sep 9 10:36:26 2019 +0100 Rework Recents presenter to communicate with STEDs facade instead of other presenter.
1aef95ec0 Andrei Tucma Tue Sep 10 08:30:19 2019 +0100 ITC5 calibration: calibrate popover option only available for itc5
8f761ce9c Robert Fry Mon Sep 9 15:57:09 2019 +0100 Possible fix for internal GPS to show signal strength
475af1405 dlangford Mon Sep 9 15:43:23 2019 +0100 STEDS Message popup design change
eb1eaf342 Algirdas Balciunas Mon Sep 9 14:24:20 2019 +0100 GPS source switching fix
460b05fee Algirdas Balciunas Mon Sep 9 14:11:25 2019 +0100 Fixed ship/cargo values in AIS data dialog
d7a47f77b Algirdas Balciunas Mon Sep 9 10:29:52 2019 +0100 Fix for app slowdown on Atom devices

Now, let’s say you want to catch up with the master branch. Go back to your master branch as below:

git checkout master (remember your base code maybe from a branch which not called master. It doesn’t matter, just go to the branch where you started)

git status (this will tell you how many commits your master is behind the latest commit)

git pull (this will bring all the latest changes delivered by others into your local master branch)

Now, go back to your private branch:

git checkout my_private (move to my_private branch)

git rebase master  (this will rebase your my_private branch with the master)


107b084c0 vbhadra Mon Sep 9 10:36:26 2019 +0100 Rework Recents presenter to communicate with STEDs facade instead of other presenter.
1aef95ec0 Andrei Tucma Tue Sep 10 08:30:19 2019 +0100 ITC5 calibration: calibrate popover option only available for itc5
8f761ce9c Robert Fry Mon Sep 9 15:57:09 2019 +0100 Possible fix for internal GPS to show signal strength

Time to push up your changes

1. Go back to the master branch

2. Merge your private branch with master

3. git push


<strong>git checkout master</strong>

<strong>git merge my_private</strong>

<strong>git push</strong>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Customizing Qt Creator 5.12.4

Install the custom Toolchain

Download and install the toolchain rpm

sudo alien ~/Downloads/<toolchain-name>.rpm

sudo dpkg -i ./<toolchain-name>.deb

Locate the arm compiler

sudo find / -iname arm-*-gnueabihf-g++ 2>/dev/null

/opt/toolchain/arm-cortexa9_neon-linux-gnueabihf-lh3/bin/arm-cortexa9_neon-linux-gnueabihf-g++

Settings

Go to the Projects Tab on the left pane.

BuildSettings

Click on the Manage Kit buttons.

ManageKits

If you want use your custom compiler and debugger etc then you have to create a manual kit.

A kit is a set of tools like compiler, QtVersion (qmake), debugger, device etc.

Before you can create a manual kit, you have to create place holders for your custom compiler, debugger etc.

Kit

image

Qt Version

Go tot the Qt Version Tab and select manual. Then click on Add button.

Here we are trying to specify the qmake binary we are going to use for the project.

In my case my qmake is located (comes from installation of the toolchain) at the below location:

/opt/toolchain/arm-cortexa9_neon-linux-gnueabihf-lh3/bin/qmake.

So in the add wizard I navigate to the above location and select qmake binary.

Qt automatically detects it as Qt Version 5.11.2. In the Kit section we are going to refer to this in near future.

Compilers

Next we have to choose our own custom C++ compiler.

In my case my C++11 compiler is located (comes from the toolchain installation) at the below location

/opt/toolchain/arm-cortexa9_neon-linux-gnueabihf-lh3/bin/arm-cortexa9_neon-linux-gnueabihf-g++.

Now, click on the Manual → C++ and click the Add button to start adding your own custom g++ compiler to the list.

This will ask you to provide a name to the custom compiler, give a name, e.g. “G++ for ATOM”, any other string you like.

Put the absolute path of the g++ binary which you want to add under the Compiler path:

/opt/toolchain/arm-cortexa9_neon-linux-gnueabihf-lh3/bin/arm-cortexa9_neon-linux-gnueabihf-g++

In the ABI, select arm-linux-generic-elf-32bit, leave the rest as default.

Apply, ok. Now you have your custom compiler in the list.

Debuggers

Go to the debugger tab.

Click on the Manual and Add.

Provide a suitable name, “ATOM GDB for Cortex A9”.

Specify the absolute path in the Path.

/opt/toolchain/arm-cortexa9_neon-linux-gnueabihf-lh3/bin/arm-cortexa9_neon-linux-gnueabihf-gdb

Apply, Ok.

Devices

In the Devices specify the details of the device where you want to run your generated binaries.

Custom Kit

Now go back to the Kits tab.

Select Manual.

Click on Add.

Provide a name for your custom Kit, e.g. ATOM.

In the Device Type, select Generic Linux Device.

In Device, select your own device, e.g. Custom Atom Device.

Compiler: C++: select your own created compiler from the drop down list.

Debugger: select the one you created previously.

Qt Version: select your own Qt Version as created previously.

Additional build arguments

Under Build & Run on the left hand panel, select the Build Option.

This will show you a loads of option on the right hand pane.

For our project we need to set the environment variable PRODUCT=ATOM.

To add this, click on the Details button along side qmake command under Build & Run.

This will look like below:

In the Additional Argument section specify, PRODUCT=ATOM.

Now, save it and try compiling your code. Make sure you clean it before giving it a try.

Git Rebasing

 

Problem Description

Suppose you have a local GIT repository where dev-stable-topic is the development branch and time to time the releases are made to the customer from a remote GIT repository which has a branch called release-stable from where the selective changes are merge in a controlled way. The remote repository is hosted in a separate linux server.

Read More »

Marketing Management Assignment – Feasibility Analysis: Launching a branch of a company in a new market/country/economic zone

Task

In your role as a Marketing Consultant, you have been asked by Wiggo*: a fictitious European supermarket (food retailer) chain (similar to Aldi and Lidl) to research and report on the feasibility of them launching in a new international market (this can be a country or economic zone of your choice and/or one you are familiar with).

Read More »

How to publish a topic with mqtt broker running on iot.eclipse.org server

As part of iot application development for IoT I had to play around with the SSL connection establishment  with the remote mqtt servers. The below briefly describes the issue I faced and how did I got over the problem while connecting to a remote mqtt server over SSL.

https://iot.eclipse.org/ is a publicly accessible which runs a MQTT server. As per the tutorial the MQTT server is accessible using the host name io.eclipse.org and the port 1883 in unsecured mode. The server can be securely accessed on the encrypted port 8883.

Read More »

How to install ssh service in Ubuntu Linux (12.04)

Check if sshd service is running in Ubuntu with the below command:


vbhadra@vbhadra-VirtualBox:~$ ps aux | grep ssh
vbhadra 1702 0.0 0.0 4088 204 ? Ss 11:49 0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu
vbhadra 4358 0.0 0.0 4400 824 pts/3 S+ 14:10 0:00 grep --color=auto ssh
vbhadra@vbhadra-VirtualBox:~$ sudo netstat -natp | grep sshd
vbhadra@vbhadra-VirtualBox:~$ sudo netstat -natp | grep ssh
vbhadra@vbhadra-VirtualBox:~$

The above command and their output shows there is no sshd service running on my Ubuntu Linux.

Read More »

Write a program to convert a decimal number to its binary equivalent using stack.

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string>

using namespace std;

template <typename T>
class Stack {
private:
    int top;
    T datastore[100];
public:
    Stack() : top(-1) {}
    bool is_stack_empty(void) {return (top == -1) ? true : false;}
    bool is_stack_full(void) {return (top >= 100) ? true : false;}
    void push(T elem)
    {
        if (!is_stack_full()) {
            top++;
            datastore[top] = elem;
        }
    }

    T pop()
    {
        if (is_stack_empty()) {
            cout << "Stack is empty" << endl;
        } else {
            int data = datastore[top];
            top--;
            return data;
        }
    }

    T peek(void)
    {
        if (is_stack_empty()) {
            cout << "Stack is empty" << endl;
        } else {
            int data = datastore[top];
            return data;
        }
    }
};

int main()
{
    Stack<int> s;
    int num;

    do {
        cout << "Enter a number ";
        cin >> num;
        cout << "Number entered is " << num << endl;
        while (num)
        {
            int n = num % 2;
            num = num/2;
            s.push(n);
        }

        cout << "The binary equivalent of the number is " << endl;
        while(!s.is_stack_empty()) {
            cout << s.pop();
        }
        cout << endl;
        cout << "Do you want to continue? (y/n) ";
        getchar();
    } while (getchar() == 'y');

    return 0;
}

Write a program to check if a word is a palindrome using stack.

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string>

using namespace std;

template <typename T>
class Stack {
private:
    int top;
    T datastore[100];
public:
    Stack() : top(-1) {}
    bool is_stack_empty(void) {return (top == -1) ? true : false;}
    bool is_stack_full(void) {return (top >= 100) ? true : false;}
    void push(T elem)
    {
        if (!is_stack_full()) {
            top++;
            datastore[top] = elem;
        }
    }

    T pop()
    {
        if (is_stack_empty()) {
            cout << "Stack is empty" << endl;
        } else {
            int data = datastore[top];
            top--;
            return data;
        }
    }

    T peek(void)
    {
        if (is_stack_empty()) {
            cout << "Stack is empty" << endl;
        } else {
            int data = datastore[top];
            return data;
        }
    }
};

int main()
{
    Stack<char> word;
    string str;
    string pali = "";

    cout << "Enter a word ";
    cin >> str;
    char w;
    for (auto i = 0; i < str.size(); ++i) {
        w = str[i];
        word.push(w);
    }
    while(!word.is_stack_empty()) {
        stringstream ss;
        char c = word.pop();
        ss << c;
        string s = ss.str();
        pali += s;
    }

    if (str == pali)
        cout << "The word is a palindrome " << endl;
    else
        cout << "The word is not a palindrome " << endl;


    return 0;
}

How to run an external program from a python script

This blog will try to demonstrate how a python script can be used to automate the running of an external program with data input file located at a particular location.

Lets say we have the below c++ program which reads from a data file called myData.txt located for this example at user home i.e. ~/. The user home is usually /home/<username> for example /home/vbhadra in my case. Use your linux user name instead while trying it yourself. To find out what is your home directory you can use echo $HOME in linux command prompt. Our objective in this blog is to demonstrate the pythoin script which will run any external program binary with data input. So we will have a less focus on the c++ program.

Read More »

Is #AAP hurting Modi?

It is a myth being spread across by media that #AAP is sweeping the support of the people all across the country to garner more support in future in favour of it for some vested interest or over enthusiasm. But step back and think for a moment, Delhi was the epitome of #AAP movement, it gained its acme of campaign with all those rhetorical promises, by all those theatrics of cutting the electrical wires, burning bill in public. Populism at its best. But even after all these melodrama it couldn’t even stand as the the single largest party which it claimed to be before the election. It reminds me somewhat of the “Singur” moment in West Bengal by Mamta Banerjee. But the difference is that Mamta Banerjee (for good or bad) was able to sweep whole of Bengal, there was no sign of others around, people truly gave their mandate. But here is a party which claims to be the party with a difference (the difference is yet to come out in their practice) has not even managed to be the single largest party in a small/half state like Delhi. And I believe #AAP had a better popular plank for campaign than Mamta Banerjee. So the first impact of #AAP is not even the half of Trinomool Congress.
Now just after the election #AAP has compromised with its basic promise of not aligning with any of the “Chor”/”Bhrasth” (as they say) national parties. But they have already shook hands with Congress. Some would argue on a super technical theorem that this is not an alliance it is a support etc. But think about the support of Mulayam to Congress, that’s exactly the same, supporting from outside and not an alliance. But there is always a quid-pro-quo – Mulayam provides support to a minority govt and in turn centre doesn’t let the CBI go after him and his party leaders, centre turns a blind eye to the riots happening in the state so on and so forth. Now here in Delhi Congress’s immediate target is to defend Modi, cut into anti-congress vote and restrict him to come to power. And once that is accomplished congress can collect a bunch of so called secular parties and form the next govt. And then after what would it demand from #AAP in future that future will tell us, I have no idea. Congress support to a minority govt has been usually maximum 2 years so far. As I strongly believe there is no free lunch this has to be a part of a grand deal, time will tell.
Now coming back to #AAP garnering support across the country. So a new party with some holier than thou agenda’s, with some populist schemes in the list couldn’t even manage to totally woo the already distressed people of a very small state. And after forming the govt the way they have tried to keep their promises so far gives us two points, one they are following the standard populist measures to woo the voters(free water and 50% electricity bill reduction etc) and two that these people are modern day leftists when it comes to economy. I see a lot of people who perhaps voted for them are not happy and have already started raising their voice. So here #AAP in fact loses their voters share rather than extending it. One more point, a percentage of people who voted for AAP in Delhi thinks they want Modi as their next PM in the LS election. So #AAP loses this section of voters too when it comes to LS. The third is interesting. I see a lot of #AAP supporters are pathological Modi haters. A lot of new #AAP supporters would be bad mouthing about Modi all the time, which indicates they are the original Congress supporters and now turning to #AAP as Congress is nowhere in the picture. This section of voters are interesting because rather than cutting into Modi’s vote (which is Congress’s original plan for supporting #AAP) it seems that #AAP is now cutting into Congress’s traditional vote bank. That be the case it is going to help Mr. Modi in coming days than hurting him. It would be difficult for #AAP to translate all their dramatic campaigns in the national platform simply because state to state India is different and they would realise it soon. They would find it extremely difficult follow what they preach as lots of those are just not practical. Unlike Modi #AAP doesn’t have any track records to showcase to the people as their model of governance. The little they have shown has party gone against them already, at least to a section of voter. So however much the media may try to make the king of their choice, at last the the real people’s king would perhaps have the last laugh. Jai Hind!!

Extremely delighted to start off with my new client.

It’s been a new challenge, a new fresh energy was required and I am putting all into my new assignment. It’s been two weeks now and it’s all fine. Looking forward to excel in coming assignments. Feeling all set for taking up fresh new dimension into the whole aspect.

Extremely missing my family. Haven’t cuddled my little baby for around nine months in a row now. Can’t just wait anymore but still couple of months to go, can’t just help it. The recent currency dilemma is playing bad for my family’s visa. Keeping fingers crossed.
Cheers!

My days in London

Started off with a bright job in hand and it’s going great at the moment. Little worried about my family and hope to get them here in another three months. Things are just settling down and hope to get it in no time. Pray God everything goes well.