exit status 1 using typedef-name ‘fpos_t’ after ‘struct’


Si está viendo  este página probablemente se deba que esta intentando actualizar el firmware Marlin  de su impresora 3d  desde el IDE de Arduino  y no lo logra.

Marlin es un firmware de código abierto para la familia RepRap de replicar prototipos rápidos, popularmente conocidos como «impresoras 3D». Se deriva de Sprinter y grbl,y se convirtió en un proyecto de código abierto independiente el 12 de agosto de 2011 con su lanzamiento de Github. Marlin tiene licencia bajo la GPLv3 y es gratis para todas las aplicaciones.

Desde el principio Marlin fue construido por y para los entusiastas de RepRap para ser un controlador de impresora sencillo, confiable y adaptable que «simplemente funciona». Como testimonio de su calidad, Marlin es utilizado por varias impresoras 3D comerciales respetadas. Ultimaker, Printrbot, AlephObjects (Lulzbot) y Prusa Research son solo algunos de los vendedores que envían una variante de Marlin. Marlin también es capaz de conducir CNC y grabadores láser.

Una clave de la popularidad de Marlin es que se ejecuta en microcontroladores Atmel AVR de 8 bits de bajo costo – Marlin 2.x ha añadido soporte para placas de 32 bits. Estos chips están en el centro de la popular plataforma de código abierto Arduino/Genuino. Las plataformas de referencia para Marlin es un Arduino Mega2560 con RAMPS 1.4 y Re-Arm con rampas 1.4.

Como producto comunitario, Marlin tiene como objetivo ser adaptable a tantas placas y configuraciones como sea posible  intentando ser configurable, personalizable, extensible y económico tanto para aficionados como para proveedores. Una construcción Marlin puede ser muy pequeña, para su uso en una impresora sin cabeza con solo hardware modesto. Las características se habilitan según sea necesario para adaptar Marlin a los componentes añadidos.

 

Marlin Firmware se ejecuta en la placa principal de la impresora 3D, gestionando todas las actividades en tiempo real de la máquina. Coordina los calentadores, pasos, sensores, luces, pantalla LCD, botones y todo lo demás involucrado en el proceso de impresión 3D.

Marlin implementa un proceso de fabricación aditiva llamado Fused Deposition Modeling (FDM), también conocido como Fused Filament Fabrication (FFF). En este proceso, un motor empuja el filamento de plástico a través de una boquilla caliente que funde y extruye el material mientras la boquilla se mueve bajo control informático. Después de varios minutos (o muchas horas) de colocar finas capas de plástico, el resultado es un objeto físico.

El lenguaje de control para Marlin es un derivado del código G. Los comandos de código G le dicen a una máquina que haga cosas simples como «establecer el calentador de 1 a 180o» o «mover a XY a la velocidad F.» Para imprimir un modelo con Marlin, debe convertirse en código G utilizando un programa llamado «slicer». Dado que cada impresora es diferente, no encontrará archivos de código G para descargar; tendrás que cortarlos tú mismo.

A medida que Marlin recibe comandos de movimiento, los agrega a una cola de movimiento para ser ejecutados en la orden recibida. La «interrupción paso a paso» procesa la cola, convirtiendo los movimientos lineales en pulsos electrónicos con precisión en los motores paso a paso. Incluso a velocidades modestas Marlin necesita generar miles de pulsos paso a paso cada segundo. (p. ej., 80 pasos por mm * 50 mm/s a 4000 pasos por segundo!) Dado que la velocidad de la CPU limita la velocidad con la que la máquina puede moverse, ¡siempre estamos buscando nuevas formas de optimizar la interrupción paso a paso!

Los calentadores y sensores se gestionan en una segunda interrupción que se ejecuta a una velocidad mucho más lenta, mientras que el bucle principal controla el procesamiento de comandos, la actualización de la pantalla y los eventos del controlador. Por razones de seguridad, Marlin realmente se reiniciará si la CPU se sobrecarga demasiado para leer los sensores.

 

Instalación de Marlin en su impresora

Normalmente todas las impresoras 3d ya llevan el firmware instalado ( incluso las que vienen en kit )   pero   conviene estar al tanto de las actualizaciones   de  este   ( en cuyo caso habar  que seguir el procedimiento siguiente)  o puede que sea  necesario cambiarlo para añadir alguna funcionalidad extra como por ejemplo la autonivelación o el cambio de idioma

En todos estos casos normalmente estos son los pasos que se siguen:  

1. Instale Arduino en su PC.
Si su impresora es A10/A10M/A20/A20M, utilice Arduino 1.8.5 para finalizar la  carga; Si es Prusa I3 Pro B/W/X/C, por favor vaya por Arduino 1.0.1!! De lo contrario, es posible que reciba algunos errores durante la verificación.

Descargue Arduino 1.0.1 o Arduino 1.8.5  aquí: https://www.arduino.cc/en/Main/OldSoftw … s-anterior

Arduino 1.8.5.jpg (27.86 KiB) Visto 60177 veces


2. Conecte la impresora al PC con el cable USB.
3. Descomprima el  firmware.  Aquí  tomaremos el firmware para el extrusor dual I3 pro C, por  ejemplo el proceso para la serie A10/A20 es bastante similar, excepto el Arduino en una versión diferente.   Puede descargar el de su impresora aquí:
http://www.geeetech.com/forum/viewtopic … 10&t-17046


4. Haga doble clic en el Marlin.ino, luego abrirá todo el firmware en el arduino.

5. Seleccione el puerto Com adecuado.

06.jpg (205.84 KiB) Viewed 189584 times


6. En Herramientas, en Board, seleccione Mega 2560 .


7. Finalmente haga clic en la flecha para compilar y cargar el firmware en su impresora.

 

Bien   es cierto que debería de compilar el sw  y nuestra impresora ya si estaría actualizada, pero lamentablemente  no siempre es así,  y desgraciadamente puede que  nos lance un error de que no se puede compilar  .

 

 

Por ejemplo en el caso de una Geetech Prusa i 3 W este es el mensaje que lanza el IDE de Arduino al intentar verificar el firmware: 

 

Arduino:1.8.10 (Windows 10), Tarjeta:»Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)»

In file included from sketch\Marlin.h:23:0, from sketch\ConfigurationStore.cpp:1:

sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1   sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN 28  In file included from sketch\Marlin.h:23:0,  from sketch\BlinkM.cpp:5:

sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\thermistortables.h:4, from sketch\Configuration.h:792, from f:\Users\Carlos\Documents\Arduino\I3 ProW GT2560A+ with 3dtouch (1)\Marlin\Marlin.ino:33:sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0,  from sketch\Marlin_main.cpp:30: sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\MarlinSerial.cpp:23:sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\Sd2Card.cpp:20:

sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 sketch\Marlin_main.cpp:2667:36: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix] LCD_MESSAGEPGM(MACHINE_NAME» «MSG_OFF».»); ^In file included from sketch\Marlin.h:23:0,  from sketch\SdBaseFile.cpp:21:sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 In file included from sketch\SdFile.h:27:0, from sketch\cardreader.h:8, from sketch\Marlin_main.cpp:44:SdBaseFile.h:38:8: error: using typedef-name ‘fpos_t’ after ‘struct’ struct fpos_t { ^~~~~~  In file included from sketch\Marlin.h:10:0,  from sketch\Marlin_main.cpp:30:c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:950:33: note: ‘fpos_t’ has a previous declaration here extension typedef long long fpos_t; ^~~~~~ sketch\Marlin_main.cpp: In function ‘void set_bed_level_equation_lsq(double*)’:

sketch\Marlin_main.cpp:998:36: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]  planeNormal.debug(«planeNormal»); ^

In file included from sketch\SdBaseFile.cpp:24:0:SdBaseFile.h:38:8: error: using typedef-name ‘fpos_t’ after ‘struct’ struct fpos_t {  ^~~~~~

In file included from sketch\Marlin.h:10:0,  from sketch\SdBaseFile.cpp:21:c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:950:33: note: ‘fpos_t’ has a previous declaration here extension typedef long long fpos_t; ^~~~~~

sketch\SdBaseFile.cpp: In member function ‘void SdBaseFile::getpos(fpos_t*)’:SdBaseFile.cpp:298:8: error: request for member ‘position’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’ pos->position = curPosition_; ^~~~~~~~

SdBaseFile.cpp:299:8: error: request for member ‘cluster’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’ pos->cluster = curCluster_; ^~~~~~~

sketch\SdBaseFile.cpp: In member function ‘void SdBaseFile::setpos(fpos_t*)‘:

SdBaseFile.cpp:1496:23: error: request for member ‘position’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’  curPosition_ = pos->position; ^~~~~~~~

SdBaseFile.cpp:1497:22: error: request for member ‘cluster’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’ curCluster_ = pos->cluster; ^~~~~~~

In file included from sketch\Marlin.h:23:0, from sketch\SdFatUtil.cpp:20:

sketch\pins.h:2956:0: warning: «X_MAX_PIN» redefined

X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

X_MAX_PIN 24 sketch\pins.h:2957:0: warning: «Y_MAX_PIN» redefined

Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

Y_MAX_PIN 28 Se encontraron varias bibliotecas para «LiquidCrystal.h»


Usado: C:\Program
exit status 1
using typedef-name ‘fpos_t’ after ‘struct’

Este informe podría contener más información con «Mostrar salida detallada durante la compilación» opción habilitada en Archivo -> Preferencias.

Bueno   , este error nos impide  actualizar el firmarware Marlin de nuestra impresora, pero  en las siguientes líneas veremos que lograr que compile el sw Marlin para nuestra impresora en particular puede ser un juego de niños

 

 

Tip1 : todo lo que necesita hacer es cambiar   todas las ocurrencias fpos_t a filepos_t

 

Para solucionar el problema  de  compilación, anterior sólo tiene que abrir ide Arduino con el firmware y hacer una búsqueda global y reemplazar.

Esto se hace haciendo Ctrl-F y selecciona la casilla de búsqueda de todas las pestañas. A continuación, buscar y reemplazar  fpos_t  por  filepos_t. Volver a compilar y estará todo listo. 

Se trata de un cambio en las nuevas versiones del software de Arduino IDE que está haciendo esto. Las versiones más recientes del firmware del Marlin tienen que la estructura  filepos_t   se llama así ,lo  que  no tendrá ningún efecto negativo en el firmware

sí que la raíz del problema con las nuevas versiones de Arduino es que ya definen un objeto denominado fpos_t en uno de los archivos globales instaladas con Arduino llamado stdio.h. Destacar en el el fichero stdio.h  ha sido un problema con muchos usuarios en línea de cambiar al nuevo Arduino y la compilación de los firmwares más antiguas basadas Marlin. Es por ello que las nuevas versiones de Marlin han pasado a utilizar filepos_t para el nombre de estructura en su lugar. Si se realiza  ese cambio a sus versiones de firmware publicadas, a continuación nadie más tendría los problemas que tenía con cargar el firmware original pero bueno sabiéndolo podemos poner el remedio.  

 

 

 

Tip 2

Si la solución  anterior  no le fue suficiente   alguien informó recientemente el mismo problema con Marlin y así  ha  solucionado el  problema

  • Herramientas > Tablero > Administrador de placas… > Arduino AVR Boards(haga clic en él) > seleccione 1.6.11 en el menú «Seleccionar versión» > Instalar
  • Una vez completada la instalación, haga clic en el botón «Cerrar»



El problema es causado por la nueva versión del compilador incluida con Arduino AVR Boards 1.6.12 y más tarde, es más exigente con el código malo que alguien escribió. Tendrá sin necesidad de actualizar a cualquier versión de Arduino AVR Boards por encima de 1.6.11 hasta que alguien solucione el problema en el código Marlin.
¿Está utilizando la última versión del firmware real de Marlin o es alguna versión anterior o una versión modificada no  estándar?

Enviar correo internamente usando JavaMail API


En realidad no es demasiado difícil crear un aplicación capaz de enviar correos electrónicos usando el IDE de Android Studio  .De hecho gracias al APi de Javmail   podremos enviar e-mails sin utilizar la aplicación de correo electrónico que android incluye por defecto utilizando javamail API para crear nuestro propio email del remitente herramientas que enviará correo internamente.

Tenemos que seguir los pasos que se dan a continuación:

1. Descargar los archivos de biblioteca de api de java.

Tenemos que descargar  tres   librerías java: 

    1. activation.jar
    2. mail.jar.
    3.  additionnal.jar

Lo puede descargar de Clic aquí.

2 Ahora crear una  app en Android studio

3-Ir a la carpeta del proyecto -> aplicación -> libs y agregue todos los archivos jar en libs ahora uno por uno, haga clic en biblioteca de archivos en la opción haga clic en Agregar como biblioteca en todos los archivos jar.

libs

También puede Agregar biblioteca por otro camino, pero lo  importante es que incluya esta tres librerías:

  1. activation.jar
  2. mail.jar.
  3.  additionnal.jar

Ir a archivo >Proyecto estructura > seleccione aplicación> opción derecha haga clic en dependencias ahora haga clic en el botón de pulse(+) para agregar > seleccione dependencia de archivo> archivo seleccione Biblioteca > OK.

addjar

4. Ahora abrir el archivo manifest.xml y poner los permisos de internet.

 <uses-permission android:name="android.permission.INTERNET"/>

Ahora busque manifiesto está buscando como.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sp.sendmailinternally">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

4. Ahora abrael fichero  activity_main.xml para crear el archivo de diseño agregar después de código.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.sp.sendmailinternally.MainActivity">
    <EditText
        android:id="@+id/edittext_recipient_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Recipient Email"
        android:textSize="18sp" />
    <EditText
        android:id="@+id/edittext_subject"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Subject"
        android:textSize="18sp" />
    <EditText
        android:id="@+id/edittext_message"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="start"
        android:hint="Message"
        android:textSize="18sp" />
    <Button
        android:id="@+id/btn_send_mail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Send Mail"
        android:textAllCaps="false" />
</LinearLayout>

5. Cree la  clase de Asyntask para el envío de llamada correo API.

package com.sp.sendmailinternally;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
 * Created by ps205 on 3/1/17.
 */
public class SendMailAsynTask extends AsyncTask<Void, Void, Void> {
    //Declaring Variables
    private Context context;
    private Session session;
    //Information to send email
    private String email;
    private String subject;
    private String message;
    //Progressdialog to show while sending email
    private ProgressDialog progressDialog;
    //Class Constructor
    public SendMailAsynTask(Context context, String email, String subject, String message) {
        //Initializing variables
        this.context = context;
        this.email = email;
        this.subject = subject;
        this.message = message;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Showing progress dialog while sending email
        progressDialog = ProgressDialog.show(context, "Sending message", "Please wait...", false, false);
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        //Dismissing the progress dialog
        progressDialog.dismiss();
        //Showing a success message
        Toast.makeText(context, "Message Sent", Toast.LENGTH_LONG).show();
    }
    @Override
    protected Void doInBackground(Void... params) {
        //Creating properties
        Properties props = new Properties();
        //Configuring properties for gmail
        //If you are not using gmail you may need to change the values
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        //Creating a new session
        session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator() {
                    //Authenticating the password
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD);
                    }
                });
        try {
            //Creating MimeMessage object
            MimeMessage mm = new MimeMessage(session);
            //Setting sender address
            mm.setFrom(new InternetAddress(Config.EMAIL));
            //Adding receiver
            mm.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
            //Adding subject
            mm.setSubject(subject);
            //Adding message
            mm.setText(message);
            //Sending email
            Transport.send(mm);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

6. Ahora abra MainActivity.java y agregue el siguiente código.

package com.sp.sendmailinternally;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
    EditText edittext_recipient_id, edittext_subject, edittext_message;
    Button btn_send_mail;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //initializr vista para encontar vista por id
        edittext_recipient_id = (EditText) findViewById(R.id.edittext_recipient_id);
        edittext_subject = (EditText) findViewById(R.id.edittext_subject);
        edittext_message = (EditText) findViewById(R.id.edittext_message);
        btn_send_mail = (Button) findViewById(R.id.btn_send_mail);
//activar un listener  onclick en un  boton
        btn_send_mail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //get  input data from view
                String mRecipientMail = edittext_recipient_id.getText().toString();
                String mSubject = edittext_subject.getText().toString();
                String mMessage = edittext_message.getText().toString();
                new SendMailAsynTask(MainActivity.this, mRecipientMail, mSubject, mMessage).execute();
//llama al contructor de send mail asyntask mediante el envio de un parametroperameter } }); } }

7. Ya puede construir y ejecutar la aplicación  

Nota:- cuando ponga su id debe ser accesible acceso menos seguro aplicaciones .Para cambiar configuración para motivos de seguridad de correo vaya a cambiar la configuración   y actiíela .

 

sendmail1

Por cierto todo el código  esta disponible en descargar código fuente